第一部分:Web的基础
第1章 HTTP概述
WEB的结构组件
代理:位于客户端和服务器之间的 HTTP 中间实体。
接收所有客户端的 HTTP 请求,并将这些请求转发给服务器(可能会对请求进行修改之后转发)。对用户来说,这些用程序就是一个代理,代表用户访问服务器。出于安全考虑,通常会将代理作为转发所有Web流量的可信任中间节点使用。代理还可以对请求和响应进行过滤。
缓存:HTTP的仓库,使常用页面的副本可以保存在离客户端更近的地方。
Web缓存(Web cache)或代理缓存(proxy cache)是一种特殊的 HTTP 代理服务器,可以将经过代理传送的常用文档复制保存起来。下一个请求同一文档的客户端就可以享受缓存的私有副本所提供的服务了。
网关:连接其他应用程序的特殊 Web 服务器。
网关(gateway)是一种特殊的服务器,作为其他服务器的中间实体使用。通常用于将 HTTP 流量转换成其他的协议。网关接受请求时就好像自己是资源的源端服务器 一样。客户端可能并不知道自己正在与一个网关进行通信。
隧道:对 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代理中。
- 报文向下游流动:不管是请求报文还是响应报文,所有报文都会向下游流动。
报文格式
请求报文:
<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)
通用首部:请求报文与响应报文通用
请求首部
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 在与代理建立连接时使用
响应首部
Age 响应持续时间 Retry-After 若资源不可用,则在此日期重试 Server 服务器应用程序软件的名称和版本
# 协商首部 Accept-Ranges 服务器可接受的范围类型
# 安全响应首部 Proxy-Authorization 来自代理对客户端的质询列表 Set-Cookie 可以在客户端设置令牌
实体首部
提供有关实体及其内容的大量信息。
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或多个字节)
保存TCP连接的正确运行
在任意时刻计算机可以有几条 TCP 连接处于打开状态,TCP 通过端口号可以将你连接到正确的应用程序上去。TCP 连接通过 4 个值来定义唯一的连接:<源IP地址、源端口号、目的IP地址、目的端口号>
用TCP套接字编程
套接字 API 允许用户创建 TCP 的端点数据结构,将这些端点与远程服务器的 TCP 端点进行连接,并对数据流进行读写。
对TCP性能的考虑
HTTP事务的时延
与建立 TCP 连接以及传输请求和响应报文的时间相比,事务处理时间可能很短。除非客户端或服务器超载,或正在处理复杂的动态资源,否则 HTTP 时延就是由 TCP 网络时延构成的。
HTTP连接的处理
串行事务处理时延
解决串行事务处理慢,提高 HTTP 的连接性能的技术有并行连接、持久连接、管道化连接、复用的连接。
并行连接
HTTP 允许客户端打开多条连接,并行地执行多个 HTTP 事务。
并行连接不一定快,实际上,浏览器会将并行连接的总数限制为一个较小的值(通常为4),服务器可以随意关闭来自特定客户端的超量连接。
持久连接
在事务处理结束后仍然保持在打开的状态的 TCP 连接被称为持久连接。持久连接会在不同事务之间保持打开状态,直到客户端或服务器决定将其关闭为止。管理持久连接要小心,很容易出现大量的空闲连接,耗费本地以及远程客户端和服务器上的资源。
持久连接有两种类型:HTTP/1.0+ “keep-alive”、HTTP/1.1 “persistent”。
管道化连接
HTTP/1.1 允许在持久连接上可选地使用请求管道。在响应到达之前,可以将多条请求放入队列。
关闭连接的奥秘
所有 HTTP 客户端、服务器或代理都可以在任意时刻关闭一条 TCP 传输连接。
Content-Length
每条 HTTP 响应都应该有精确的 Content-Length 首部,用以描述响应主体的尺寸。客户端或代理收到一条随连接关闭而结束的 HTTP 响应,且实际传输的实体长度与 Content-Length 并不匹配时,接收端就应该质疑长度的正确性。如果接收端是代理,应该将有问题的报文原封不动的转发出去,已维护语义的透明性。
正常关闭连接
TCP 连接是双向的,每一端都有一个输入队列和一个输出队列,用于数据的读或写。
完全关闭和半关闭
应用程序可以关闭 TCP 输入和输出信道中的任意一个,或者将两者都关闭。套接字 close() 为完全关闭,shutdown() 为半关闭。
TCP 关闭及重置错误