第一部分:Web的基础

未匹配的标注

第1章 HTTP概述

WEB的结构组件

  • 代理:位于客户端和服务器之间的 HTTP 中间实体。

    接收所有客户端的 HTTP 请求,并将这些请求转发给服务器(可能会对请求进行修改之后转发)。对用户来说,这些用程序就是一个代理,代表用户访问服务器。出于安全考虑,通常会将代理作为转发所有Web流量的可信任中间节点使用。代理还可以对请求和响应进行过滤。

  • 缓存:HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方。

    Web缓存(Web cache)或代理缓存(proxy cache)是一种特殊的 HTTP 代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了。

  • 网关:连接其他应用程序的特殊 Web 服务器。

    网关(gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将 HTTP 流量转换成其他的协议。网关接受请求时就好像自己是资源的源端服务器 一样。客户端可能并不知道自己正在与一个网关进行通信。

PHP

  • 隧道:对 HTTP 通信报文进行盲转发的特殊代理。

    隧道(tunnel)是建立起来之后,就会在两条连接之间对原始数据进行盲转发的 HTTP 应用程序。HTTP 隧道通常用来在一条或多条 HTTP 连接上转发非 HTTP 数据,转发时不会窥探数据。

  • Agent 代理:发起自动 HTTP 请求的半智能 Web 客户端。

    用户 Agent 代理(或者简称为 Agent 代理)是代表用户发起 HTTP 请求的客户端程 序。所有发布 Web 请求的应用程序都是 HTTP Agent 代理。到目前为止,我们只提 到过一种 HTTP Agent 代理:Web 浏览器,但用户 Agent 代理还有很多其他类型。

第2章 URL与资源

URL的语法

  • 方案——使用什么协议

    # http:超文本传输协议方案,默认为80端口。 
    基本格式:http://<host>:<port>/<path>?<query>#<frag> 
    示例:http://www.jocs-hardware.com:80/index.htfnl
    
    # https:使用了ssl,ssl为HTTP连接提供了端到端的加密机制。默认端口为443。 
    基本格式:https://<host>:<port>/<path>?<query>#<frag> 
    
    # ftp:用來从ftp服务器下载或向其上载文件,并获取ftp服务器上的目录结构內容的列表. 
    基本格式:ftp://<user>:<password>@<host>:<port>/<path>;<params> 
    示例:ftp://anonymous:joe@prep.ai.mit.edu:21/pub/gnu/
    
    # file:表示一台指定主机(通过本地磁盘、网络文件系统或其他--些文件共亨系统)上可直接访问的文件。
    基本格式:file://<host>/<path> 
    示例:file://OFFICE-FS/policies/casual-fridays.doc
    
    # telnet:用干访问交互式业务,它表示的并不是对象自身,而是通过telnet访问的交互式应用程序(资源)。 
    基本格式:telnet://<user>:<password>@<host>:<port>/ 
    示例:telnet://slurp:webhound@joes-hardware.com:23/
  • 主机与端口

  • 用户名和密码

    ftp://anonymous:passwd@ftp.prep.ai.mit.edu/pub/gnu 
    http://joe:passwd@www.joes-hardware.com/sales_info.txt
  • 路径

  • 参数

    ftp://prep.ai.mit.edu/pub/gnu;type=d
  • 查询字符串

    http://www.joes-hardware.com/inventory-check.cgi ?item= 12731
  • 片段:片段最前面有一个字符“#”。

    http://www.joes-hardware.eom/tools.html#drills

第3章 HTTP报文

报文流

HTTP报文是在HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息(meta-information)开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文在客户端、服务器和代理之间流动。

  • 报文流入源端服务器:报文流入源端服务器,工作完成之后,会流回用户的Agent代理中。

PHP

  • 报文向下游流动:不管是请求报文还是响应报文,所有报文都会向下游流动。

PHP

报文格式

请求报文:

<method> <request-URL> <version> 
<headers> 

<entity-body>

响应报文:

<version> <status> <reason-phrase> 
<headers> 

<entity-body>

报文的组成部分

起始行、header、body 主体

起始行

请求报文的起始行(请求行)包含:<method> <request-URL> <version>

- method 描述了服务器应该执行的操作;
- request-URL 请求 URL 描述了要对哪个资源执行这个方法;
- version HTTP 的版本。

响应报文的起始行(响应行)包含:<version> <status> <reason-phrase>

- version HTTP版本;
- status 数字状态码;
- reason-phrase 描述操作状态的文本形式的原因短语。

首部(header)

  1. 通用首部:请求报文与响应报文通用

  2. 请求首部

    Client-IP    客户端IP
    From         客户端Email地址
    Host         服务器主机名和端口号
    Referer      包含当前请求URI的文档的URL
    User-Agent   发起请求的应用程序名称
    # Accept 首部:将客户端的喜好和能力告知服务器
    Accept          告诉服务器能够发送哪些媒体类型
    Accept-Charset  告诉服务器能够发送哪些字符集
    Accept-Encoding 告诉服务器能够发送哪些编码方式
    Accept-Language 告诉服务器能够发送哪些语言
    # 条件请求首部:客户端希望为请求加上某种限制
    Except 允许客户端列出某请求所要求的服务器行为
    # 安全请求首部:要求客户端在获取特定资源前,先对自身进行认证
    Authorization  包含客户端提供给服务器,以便对自身进行认证的数据
    Cookie         客户端向服务器发送的令牌
    # 代理请求首部
    Max-Forward          将请求转发给其他代理或网关的最大次数
    Proxy-Authorization  在与代理进行认证时使用
    Proxy-Connection     在与代理建立连接时使用
  3. 响应首部

    Age          响应持续时间
    Retry-After  若资源不可用,则在此日期重试
    Server       服务器应用程序软件的名称和版本
    # 协商首部
    Accept-Ranges 服务器可接受的范围类型
    # 安全响应首部
    Proxy-Authorization  来自代理对客户端的质询列表
    Set-Cookie           可以在客户端设置令牌
  4. 实体首部

    提供有关实体及其内容的大量信息。

    Allow    列出可以对此实体执行的请求方法
    Location 告知客户端实体实际位于何处
    # 内容首部
    Content-Encoding  对主体执行的任意编码方式
    Content-Length    主体的长度
    # 实体缓存首部
    Expires     实体不再有效

第4章 连接管理

TCP连接

TCP的可靠数据通道

HTTP 连接实际上就是 TCP 连接和一些使用连接的规则。TCP 为 HTTP 提供了一条可靠的比特传输管道。从 TCP 连接一端填入的字节会从另一端以原有的顺序、正确地传送出来。

TCP流是分段的、由IP分组传送

HTTP 要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的 TCP 连接按序传输。TCP 收到数据流后,会将数据流分成小数据块(段),将段封装在 IP 分组中,通过因特网进行传输。

每个 TCP 段都是由 IP 分组承载,从一个 IP 地址发送到另一个 IP 地址。每个 IP 分组中都包括:

  • 一个 IP 分组首部(20字节):包含源和目的 IP 地址、长度和其他一些标记。
  • 一个 TCP 段首部(20字节):包含 TCP 端口号、TCP 控制标记,以及用于数据排序和完整性检查的数字值。
  • 一个 TCP 数据块(0或多个字节)

PHP

保存TCP连接的正确运行

在任意时刻计算机可以有几条 TCP 连接处于打开状态,TCP 通过端口号可以将你连接到正确的应用程序上去。TCP 连接通过 4 个值来定义唯一的连接:<源IP地址、源端口号、目的IP地址、目的端口号>

用TCP套接字编程

套接字 API 允许用户创建 TCP 的端点数据结构,将这些端点与远程服务器的 TCP 端点进行连接,并对数据流进行读写。

PHP

对TCP性能的考虑

HTTP事务的时延

PHP

与建立 TCP 连接以及传输请求和响应报文的时间相比,事务处理时间可能很短。除非客户端或服务器超载,或正在处理复杂的动态资源,否则 HTTP 时延就是由 TCP 网络时延构成的。

HTTP连接的处理

串行事务处理时延

PHP

解决串行事务处理慢,提高 HTTP 的连接性能的技术有并行连接、持久连接、管道化连接、复用的连接。

并行连接

HTTP 允许客户端打开多条连接,并行地执行多个 HTTP 事务。

PHP

并行连接不一定快,实际上,浏览器会将并行连接的总数限制为一个较小的值(通常为4),服务器可以随意关闭来自特定客户端的超量连接。

持久连接

在事务处理结束后仍然保持在打开的状态的 TCP 连接被称为持久连接。持久连接会在不同事务之间保持打开状态,直到客户端或服务器决定将其关闭为止。管理持久连接要小心,很容易出现大量的空闲连接,耗费本地以及远程客户端和服务器上的资源。

持久连接有两种类型:HTTP/1.0+ “keep-alive”、HTTP/1.1 “persistent”。

管道化连接

HTTP/1.1 允许在持久连接上可选地使用请求管道。在响应到达之前,可以将多条请求放入队列。

PHP

关闭连接的奥秘

所有 HTTP 客户端、服务器或代理都可以在任意时刻关闭一条 TCP 传输连接。

Content-Length

每条 HTTP 响应都应该有精确的 Content-Length 首部,用以描述响应主体的尺寸。客户端或代理收到一条随连接关闭而结束的 HTTP 响应,且实际传输的实体长度与 Content-Length 并不匹配时,接收端就应该质疑长度的正确性。如果接收端是代理,应该将有问题的报文原封不动的转发出去,已维护语义的透明性。

正常关闭连接

TCP 连接是双向的,每一端都有一个输入队列和一个输出队列,用于数据的读或写。

PHP

  1. 完全关闭和半关闭

    应用程序可以关闭 TCP 输入和输出信道中的任意一个,或者将两者都关闭。套接字 close() 为完全关闭,shutdown() 为半关闭。

  2. TCP 关闭及重置错误

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
贡献者:1
讨论数量: 0
发起讨论 只看当前版本


暂无话题~