《图解HTTP》--读书笔记

第一章、了解 web 及网络基础

1.2 http 的诞生

HTTP 于 1990 年问世,那时候 HTTP 并没有作为正式的标准被建立,被称为 HTTP/0.9

HTTP 正式作为标准被公布是在 1996 年 5 月,版本被命名为 HTTP/1.0,该协议至今仍被广泛用在服务器端。

HTTP/1.1 于 1997 年 1 月公布,是目前主流的 HTTP 协议版本。

HTTP/2.0 正在制定中。

1.3 TCP/IP

TCP/IP 不是某个协议,而是互联网相关的各类协议族的总称。详细内容参见TCP/IP 详解学习笔记

TCP/IP 协议族按层次分别为以下 4 层:

应用层:决定了向用户提供应用服务时的通信活动,该层包括 FTP DNS HTTP

传输层:对上层应用层,提供处于网络连接中的两台计算机之间的数据传输,该层包括 TCP UDP

网络层:用来处理在网络上流动的数据包,该层规定了通过怎样的路径达到对方计算机并把数据包传送给对方

链路层:用来处理连接网络的硬件部分,网卡 光纤

TCP/IP 通信传输流程(http 举例)

首先作为发送端的客户端在应用层(http 协议)发出一个想看某个 web 页面的 http 请求。接着,为了传输的方便,在传输层(tcp 协议)把从应用层处收到的数据(http 请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。在网络层(ip 协议)增加作为通信目的地的 MAC 地址后转发给链路层。这样,发往网络的通信请求就齐全了。

TCP/IP通信传输流程

1.4.1 负责传输的 IP 协议

IP 协议的作用是把各种数据包传送给对方

IP 地址指明了节点被分配到的地址,MAC 地址是指网卡所属的固定地址

1.4.2 确保可靠性的 TCP 协议

TCP 协议为了更容易送达大数据才把数据分割,采用三次握手策略确保数据最终送达对方

三次握手策略:

发送端首先发送一个带 SYN(synchronize)标志的数据包给对方,接收端收到后回传一个带有 SYN/ACK 标志的数据包以示传达确认信息。最后发送端再回传一个带 ACK(acknowledgement)标志的数据包代表握手结束。

1.5 负责域名解析的 DNS(Domain Name System)服务

DNS 提供域名到 IP 地址之间的解析服务

1.6 各种协议在 http 协议通信过程中的职责

按流程顺序分别为:

DNS 服务:把用户输入的域名解析为 IP 地址

HTTP 协议:生成针对目标 web 服务器的 HTTP 请求报文

TCP 协议:为了方便通信将 HTTP 请求报文分割成报文段,把每个报文段可靠的传给对方

IP 协议:搜索对方的地址,一边中转一边传送

TCP 协议:从对方那里接收报文段并按序号从组请求报文

HTTP 协议:对 web 服务器请求的内容的处理

1.7 URI/URL

URI(Uniform Resource Identifier)某个协议方案的资源的定位标识符

URL(Uniform Resource Locator)表示互联网资源的具体地点

第二章、简单的 http 协议

2.2 通过请求和响应的交换达成通信

请求报文是由请求方法、请求 URI、协议版本、可选的请求头部字段和内容实体构成的。

请求报文的构成

响应报文基本上是由协议版本、状态码、用以解释状态码的原因短语、可选的响应首部字段及实体主体构成。

响应报文的构成

2.3 HTTP 是不保存状态的协议

HTTP 协议自身不对请求和响应之间的通信状态进行保存

2.5 告知服务器意图的 http 方法

GET:用来访问已被 URI 识别的资源

POST:用来传输实体的主体

GET 方法和 POST 方法的区别:

  1. 安全性

    • GET 请求的数据会附在 URL 之后(就是把数据放置在 HTTP 协议头中),以?分割 URL 和传输数据,参数之间以&相连,参数将明文出现在 URL 上,容易被他人看到,URL 信息也可能会被记录到历史纪录中。
    • POST 请求是把提交的数据则放置在是 HTTP 包的包体中。
  2. 数据长度:

    • HTTP 协议没有对传输的数据和 URL 长度进行限制, 但特定浏览器和服务器对 URL 长度有限制, 因此对于 GET 提交时,传输数据就会受到 URL 长度的限制;
    • 由于 POST 操作不是通过 URL 传值,理论上数据长度不受限;
  3. GET 请求能够被缓存,以 GET 请求的 URL 能够保存为浏览器书签,而 POST 请求则都不能

  4. Get 是用来从服务器上获得数据,而 Post 是用来向服务器上传递数据。

以下其他方法均不常用

PUT:传输文件 HEAD:获得报文首部 DELETE:删除文件 OPTUIONS:询问支持的方法 TRACK:追踪路径 CONNECT:要求用隧道协议连接代理

2.7 持久连接节省通信量

持久连接的好处在于减少了 TCP 连接的重复建立和断开所造成的额外开销,减轻服务器端荷载。在 HTTP/1.1 中所有连接默认都是持久连接

持久连接使得多数请求以管线化方式发送,即能同时并行发送多个请求。

cookie 技术是通过在请求和响应报文中写入 cookie 信息来控制客户端的状态

Cookie 会根据从服务器发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存 cookie。当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。服务器端接收到客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。

第三章、http 报文内的 http 信息

3.1 HTTP 报文

HTTP 报文大致可分为报文首部和报文主体两块,两者有最初出现的空行来划分,通常并不一定要有报文主体

3.2 请求报文和响应报文的结构

请求行:包含用于请求的方法,请求 URI 和 HTTP 版本

状态行:包含响应结果的状态码,原因短语和 HTTP 版本

首部字段:包含表示请求和响应的各种条件和属性的各类首部,一般分别为:通用首部、请求首部、响应首部和实体首部。

其他:包含 HTTP 的 RFC 里未定义的首部(Cookie 等)

3.3 编码提升传输速率

常用的内容编码方式有以下几种:

  • gzip(GNU zip)
  • compress(UNIX 系统的标准压缩)
  • deflate(zlib)
  • identity(不进行编码)

3.5 获取部分内容的范围请求(Range Request)

执行范围请求时,会用到首部字段 Range 来指定资源的 byte 范围

针对范围请求,响应会返回状态码为 206 Partial Content 的响应报文

3.6 内容协商返回最合适的内容

内容协商机制是指客户端和服务器端就响应的资源内容进行交涉,然后提供给客户端最适合的资源。内容协商会以响应资源的语言、字符集、编码方式等作为判断的基准。如首部字段中的 Accept、Accept-Charset、Accept-Enoding、Accept-Language、Content-Language

第四章、返回结果的 http 状态

4.1 状态码告知从服务器端返回的请求结果

类别 Cool
1XX informational(信息性状态码) 接收的请求正在处理
2XX Success(成功状态码) 请求正常处理完毕
3XX Redirection(重定向状态码) 需要进行附加操作已完成请求
4XX Client Error(客户端错误状态码) 服务器无法处理请求
5XX Server Error(服务器端错误状态码) 服务器处理请求出错

4.2 2XX 成功

200 OK 表示从客户端发来的请求在服务器端被正常处理

204 No Content 表示服务器接收的请求已成功处理,但返回的响应报文中不允许返回任何实体的主体部分

206 Partial Content 表示客户端进行了范围请求,服务器成功执行了这部分 GET 请求

4.3 3XX 重定向

304 Not Modified 表示客户端发送附带条件的 GET 请求时,其访问的资源(自上次访问以来或者根据请求的条件)未变化

4.4 4XX 客户端错误

401 Bad Request 表示报文中存在语法错误

403 Forbidden 表示对请求资源的访问被服务器拒绝了

404 Not Found 表示服务器上无法找到请求的资源

4.5 5XX 服务器错误

501 Internet Sever Error 表示服务器端在执行请求时发生了错误

503 Service Unavailable 表示服务器暂时处于超负荷或正在停机维护,现无法处理请求

第五章、与 http 协作的 web 服务器

5.1 用单个虚拟主机实现多个域名

在相同的 IP 地址下,由于虚拟主机可以寄存多个不同主机名和域名的 Web 网站,因此在发送 HTTP 请求时,必须在 Host 首部内完整指定主机名或域名的 URI

5.2.1 代理

代理服务器的基本行为接收客户端发送的请求后转发给其他服务器,代理不改变请求 URI,转发时需要附加 Via 首部字段已标记出经过的主机信息。

使用代理服务器的理由:

  • 利用缓存技术(代理缓存)减少网络带宽的流量
  • 组织内部针对特定网站的访问控制,以获取访问日志为主要目的。

5.2.2 网关

网关能使通信线路上的服务器提供非 HTTP 服务(SQL 数据查询)

5.2.3 隧道

隧道的目的是确保客户端能与服务器进行安全的通信

第六章、http 首部

6.2.4 首部字段一览表

通用首部字段

首部字段名 说明
Cache-Control 控制缓存的行为
Cache-Control 逐跳首部、连接的管理
Date 创建报文的日期时间
Pragma 报文指令
Trailer 报文末端的首部一览
Transfer-Encoding 指定报文主体的传输编码方式
Upgrade 升级为其他协议
Via 代理服务器的相关信息
Warning 错误通知

请求首部字段

首部字段名 说明
Accept 用户代理可处理的媒体类型
Accept-Charset 优先的字符集
Accept-Encoding 优先的内容编码
Accept-Language 优先的语言
Authorization web 认证信息
Expect 期待服务器的特定行为
Form 用户的电子邮箱地址
Host 请求资源所在服务器
if-Match 比较实体标记 ETag
if-None-Math 比较实体标记
if-Modified-Since 比较资源的更新时间
if-Unmodified-Since 比较资源的更新时间
if-Range 资源未更新时发送实体 byte 的范围请求
Max-Forwards 最大传输逐跳数
Proy-Authorization 代理服务器要求的客户端认证信息
Referer 对请求中 URI 的原始获取方
Range 实体的字节范围请求
TE 传输编码的优先级
User-Agent http 客户端程序的信息

响应首部字段

首部字段名 说明
Accept-Range 是否接受字节范围请求
Age 推算资源创建经过时间
ETag 资源的匹配信息
Location 令客户端重定向指定 URI
Proxy-Authenticate 代理服务器对客户端的认证信息
Petry-After 对再次发起请求的时机要求
Server HTTP 服务器的安装信息
Vary 代理服务器缓存的管理信息
WWW-Authenticate 服务器对客户端的认证信息

实体首部字段

实体首部字段

第七章、确保 web 安全的 https

7.1http 缺点

  • 通信使用明文,内容可能被窃听
  • 不验证通信方身份,有可能遭遇伪装
  • 无法证明报文的完整性,有可能已遭篡改

7.2 HTTP+加密+认证+完整性保护=HTTPS

HTTPS 并非应用层的一种新协议,只是 HTTP 通信接口部分用 SSL 和 TLS 协议代替而已,其实就是身披 SSL 协议这层外壳的 HTTP

SSL 采用一种叫做公开密钥加密的加密处理方式

公开密钥加密使用一对非对称的密钥,私有密钥和公开密钥,发送密文的一方使用对方的公开密钥进行加密处理,对方收到被加密的信息后,再使用自己的私有密钥进行解密

公开密钥加密处理起来比共享密钥加密方式更为复杂,因此若在通信时使用公开密钥加密方式,效率会很低。所以 HTTPS 采用采用共享密钥加密和公开密钥加密两者并用的混合加密机制

混合加密机制原理:

  1. 使用公开密钥加密方式安全的交换共享密钥(在稍后的共享密钥加密中要使用的密钥)
  2. 确保交换的秘钥安全的前提下,使用共享密钥加密方式通信。

第八章、确认访问用户身份的认证

第九章、基于 http 的功能追加协议

9.2 消除 http 瓶颈的 spdy

http 瓶颈:

  • 一条连接上只可发送一个请求
  • 请求只能从客户端开始,客户端不可以接收除响应以外的指令
  • 请求/响应首部未经压缩就发送,首部信息越多延迟越大
  • 发送冗长的首部,每次发送相同的首部造成的浪费较多
  • 可任意选择数据压缩格式,非强制压缩发送

消除 http 瓶颈方法尝试:

  • Ajax 能实时地从服务器获取内容,可能导致大量请求产生
  • Comet 内容随可以实时更新,但为了保留响应,一次连接的持续时间变长了,消耗更多资源
  • SPDY 虽然能有效消除瓶颈,但当一个 web 网站使用多个域名下的资源时,改善效果受限制

9.3 使用浏览器进行双全工通信的 WebSocket

WebSocket 协议主要特点:

  • 支持由服务器向客户端推送数据功能
  • 减少通信量,不但每次连接总开销减少,而且首部信息也很少

为了实现 WebSocket 通信需要将 Http 的 Upgrade 首部字段值设为 websocket,对于之前的握手请求,返回状态码 101 Switching Proticols.成功握手确立 WebSocket 连接之后,不再使用 HTTP 的数据帧,而采用 WebSocket 独立数据帧

WebSocket API

javascript 可调用“The Websocket API”内提供的 websocket 程序接口,以实现 websocket 协议下双全工通信

第十章、构建 web 内容的技术

第十一章、web 的攻击技术