第1章 了解Web及网络基础
-
TCP/IP协议各层次的作用
-
URI(Uniform Resource Identifier,统一资源标识符) & URL(Uniform Resource Locator,统一资源定位符)
-
URI 用字符串标识某一互联网资源,URL 表示资源的地点(互联网上所处的位置,Web 浏览器等访问 Web 页面时需要输入的网页地址),可见 URL 是 URI 的子集。
- 参考资料:http://web.jobbole.com/83452/
-
第2章 简单的HTTP协议
2.2 通过请求和响应的交换达成通信
-
请求报文是由请求方法、请求 URI、协议版本、可选的请求首部字段和内容实体构成的。
-
响应报文基本上由协议版本、状态码(表示请求成功或失败的数字代码)、用以解释状态码的原因短语、可选的响应首部字段以及实体主体构成。
2.3 HTTP 是不保存状态的协议
- HTTP 是一种不保存状态,即无状态(stateless)协议。
使用 HTTP 协议,每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成 如此简单的。
HTTP/1.1 虽然是无状态协议,但为了实现期望的保持状态功能, 于是引入了 Cookie 技术。有了 Cookie 再用 HTTP 协议通信,就可以管理状态了。
2.4 请求 URI 定位资源
- HTTP 协议使用 URI 定位互联网上的资源。
除此之外,如果不是访问特定资源而是对服务器本身发起请求,可以用一个 * 来代替请求 URI。下面这个例子是查询 HTTP 服务器端支持 的 HTTP 方法种类。
2.5 告知服务器意图的 HTTP 方法
GET :获取资源
GET 方法用来请求访问已被 URI 识别的资源。指定的资源经服务器端解析后返回响应内容。
POST:传输实体主体
虽然用 GET 方法也可以传输实体的主体,但一般不用 GET 方法进 行传输,而是用 POST 方法。虽说 POST 的功能与 GET 很相似,但 POST 的主要目的并不是获取响应的主体内容。
HEAD:获得报文首部
HEAD 方法和 GET 方法一样,只是不返回报文主体部分。用于确认 URI 的有效性及资源更新的日期时间等。
PUT :传输文件(一般不用)
PUT 方法用来传输文件。就像 FTP 协议的文件上传一样,要求在 请求报文的主体中包含文件内容,然后保存到请求 URI 指定的位置。
但是,鉴于 HTTP/1.1 的 PUT 方法自身不带验证机制,任何人都可以上传文件 , 存在安全性问题,因此一般的 Web 网站不使用该方法。
DELETE:删除文件(一般不用)
DELETE 方法用来删除文件,是与 PUT 相反的方法。DELETE 方 法按请求 URI 删除指定的资源。
但是,HTTP/1.1 的 DELETE 方法本身和 PUT 方法一样不带验证机 制,所以一般的 Web 网站也不使用 DELETE 方法。
OPTIONS:询问支持的方法
OPTIONS 方法用来查询针对请求 URI 指定的资源支持的方法。
TRACE:追踪路径
TRACE 方法是让 Web 服务器端将之前的请求通信环回给客户端的 方法。
发送请求时,在 Max-Forwards 首部字段中填入数值,每经过一个 服务器端就将该数字减 1,当数值刚好减到 0 时,就停止继续传输,最 后接收到请求的服务器端则返回状态码 200 OK 的响应。
客户端通过 TRACE 方法可以查询发送出去的请求是怎样被加工修改 / 篡改的。这是因为,请求想要连接到源目标服务器可能会通过代理 中转,TRACE 方法就是用来确认连接过程中发生的一系列操作。
但是,TRACE 方法本来就不怎么常用,再加上它容易引发 XST (Cross-Site Tracing,跨站追踪)攻击,通常就更不会用到了。
CONNECT:要求用隧道协议连接代理
CONNECT 方法要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
CONNECT 方法的格式如下所示:
2.6 使用方法下达命令
- 注:LINK 和 UNLINK 已被 HTTP/1.1 废弃, 不再支持。
2.7 持久连接节省通信量(HTTP/1.1 新特性)
2.7.1 持久连接
- 为解决 TCP 连接的问题,HTTP/1.1 和一部分的 HTTP/1.0 想出 了持久连接(HTTP Persistent Connections,也称为 HTTP keep-alive 或 HTTP connection reuse)的方法。持久连接的特点是,只要任意一端没 有明确提出断开连接,则保持 TCP 连接状态。
-
持久连接的好处在于减少了 TCP 连接的重复建立和断开所造成的 额外开销,减轻了服务器端的负载。另外,减少开销的那部分时间,使 HTTP 请求和响应能够更早地结束,这样 Web 页面的显示速度也就相应提高了。
2.7.2 管线化
- 持久连接使得多数请求以管线化(pipelining)方式发送成为可能。 从前发送请求后需等待并收到响应,才能发送下一个请求。管线化技术出现后,不用等待响应亦可直接发送下一个请求。
- 这样就能够做到同时并行发送多个请求,而不需要一个接一个地等待响应了。
- 比如,当请求一个包含 10 张图片的 HTML Web 页面,与挨个连接相比,用持久连接可以让请求更快结束。而管线化技术则比持久连接还 要快。请求数越多,时间差就越明显。
2.8 使用 Cookie 的状态管理
- Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。
- Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 Cookie。当下次客户端再往该服务器 发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。
-
服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪 一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
- 上图展示了发生 Cookie 交互的情景,HTTP 请求报文和响应报文的 内容如下。
第3章 HTTP 报文内的 HTTP 信息
3.2 请求报文及响应报文的结构
- 请求行:包含用于请求的方法,请求 URI 和 HTTP 版本。
- 状态行:包含表明响应结果的状态码,原因短语和 HTTP 版本。
- 首部字段:包含表示请求和响应的各种条件和属性的各类首部。一般有 4 种首部,分别是:通用首部、请求首部、响应首部和实体首部。
- 其他:可能包含 HTTP 的 RFC 里未定义的首部(Cookie 等)。
3.3 编码提升传输速率
3.3.2 压缩传输的内容编码
内容编码指明应用在实体内容上的编码格式,并保持实体信息原样压缩。内容编码后的实体由客户端接收并负责解码。
常用的内容编码有以下几种:
- gzip(GNU zip)
- compress(UNIX 系统的标准压缩)
- deflate(zlib)
- identity(不进行编码)
3.3.3 分割发送的分块传输编码
在 HTTP 通信过程中,请求的编码实体资源尚未全部传输完成之 前,浏览器无法显示请求页面。在传输大容量数据时,通过把数据分割 成多块,能够让浏览器逐步显示页面。
这种把实体主体分块的功能称为分块传输编码(Chunked Transfer Coding)。
分块传输编码会将实体主体分成多个部分(块)。每一块都会用 十六进制来标记块的大小,而实体主体的最后一块会使用“0(CR+LF)” 来标记。
使用分块传输编码的实体主体会由接收的客户端负责解码,恢复到 编码前的实体主体。
HTTP/1.1 中存在一种称为传输编码(Transfer Coding)的机制,它 可以在通信时按某种编码方式传输,但只定义作用于分块传输编码中。
3.4 发送多种数据的多部分对象集合
-
multipart/form-data
在 Web 表单文件上传时使用。
- multipart/byteranges
状态码 206(Partial Content,部分内容)响应报文包含了多个范 围的内容时使用。
在 HTTP 报文中使用多部分对象集合时,需要在首部字段里加上 Content-type。
使用 boundary 字符串来划分多部分对象集合指明的各类实体。在 boundary 字符串指定的各个实体的起始行之前插入“--”标记(例如: --AaB03x、--THIS_STRING_SEPARATES), 而 在 多 部 分 对 象 集 合 对 应 的字符串的最后插入“--”标记(例如:--AaB03x--、--THIS_STRING_ SEPARATES--)作为结束。
多部分对象集合的每个部分类型中,都可以含有首部字段。另外, 可以在某个部分中嵌套使用多部分对象集合。有关多部分对象集合更详 细的解释,请参考 RFC2046。
3.5 获取部分内容的范围请求
执行范围请求时,会用到首部字段 Range 来指定资源的 byte 范围。 byte 范围的指定形式如下。
针对范围请求,响应会返回状态码为 206 Partial Content 的响应报 文。另外,对于多重范围的范围请求,响应会在首部字段 Content-Type 标明 multipart/byteranges 后返回响应报文。
如果服务器端无法响应范围请求,则会返回状态码 200 OK 和完整 的实体内容。
image.png
3.6 内容协商返回最合适的内容
当浏览器的默认语言为英语或中文,访问相同 URI 的 Web 页面时, 则会显示对应的英语版或中文版的 Web 页面。这样的机制称为内容协 商(Content Negotiation)。
内容协商机制是指客户端和服务器端就响应的资源内容进行交涉, 然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字 符集、编码方式等作为判断的基准。
包含在请求报文中的某些首部字段(如下)就是判断的基准:
- Accept
- Accept-Charset
- Accept-Encoding
- Accept-Language
- Content-Language
内容协商技术有以下 3 种类型:
- 服务器驱动协商(Server-driven Negotiation)
由服务器端进行内容协商。以请求的首部字段为参考,在服务器端 自动处理。但对用户来说,以浏览器发送的信息作为判定的依据, 并不一定能筛选出最优内容。 - 客户端驱动协商(Agent-driven Negotiation)
由客户端进行内容协商的方式。用户从浏览器显示的可选项列表中 手动选择。还可以利用 JavaScript 脚本在 Web 页面上自动进行上述 选择。比如按 OS 的类型或浏览器类型,自行切换成 PC 版页面或 手机版页面。 - 透明协商(Transparent Negotiation)
是服务器驱动和客户端驱动的结合体,是由服务器端和客户端各自 进行内容协商的一种方法。
网友评论