《图解 HTTP》 读书笔记
HTTP 在哪里
网络设备之间,包括计算机与网络设备之间要互相通信,那么双方必须要基于相同的协议。如何探测到通信目标,如何发起通信,怎么传递通信信息,怎么样结束通信等这些规则要事先约定,这些规则称为协议(protocol)。
我们通常使用的网络是在 TCP/IP 协议族的基础上运作的,而 HTTP 属于它的一个子集。
TCP/IP 分层
TCP/IP 协议族按层次划分可以分为 4 个层次,分别是应用层、传输层、网络层和数据链路层。
- 应用层决定了向用户提供应用服务时通信的活动。TCP/IP 协议族里面有不少应用服务,比如 FTP (File Transfer Protocol,文件传输协议)和 DNS (Domain Name System,域名服务系统),HTTP 协议也是在应用层。
- 传输层位于应用层之下,提供处于网络连接中的两台网络设备之间的数据传输。传输层有 2 个常见的协议, TCP (Transmission Control Protocol,传输控制协议)和 UDP (User Data Protocol,用户数据报协议)。
- 网络层用来处理网络上流动的数据包。数据包是网络传输的最小数据单位,该层规定了数据包通过怎么样的传输路线到达对方。通常情况下 2 台计算机之间会有数量不定的各类网络设备或者计算机,网络层的作用就是在众多传输路径中选择一条合适的传输线路。
- 链路层用来处理了解网络的硬件部分。包括硬件的设备驱动,网卡,光纤及连接器等一切传输媒介。
把 TCP/IP 分层是有好处的,各层之间的接口部分规划好之后,每个层次的内部设计可以自由变动而无需考虑上层和下层的任务。处理应用层上的应用只需考虑应用层面的问题,而无需考虑下层的 TCP 协议或者 UDP 协议,也无需考虑数据包是如何到达对方,更无需考虑网络的硬件部分构成。
TCP/IP 通信传输流
利用 TCP/IP 协议族进行通信时,会通过分层结构与对方通信。对于发送端从应用层向下走到网络层,对于接收端则从网络层向上走到应用层。
以应用层的 HTTP 协议为例,客户端在应用层首先发出一个查看 www.baidu.com Web 页面的 HTTP 请求。接着到了传输层,TCP 协议从应用层处收到的HTTP报文进行分割,并在各个分割的报文加上传输层相关的 TCP 首部后转发给网络层。在网络层,给报文加上网络层相关的 IP 首部后转发给链路层,最后链路层给报文添加上以太网首部,并发送数据包。流程如上图左边部分所示。
接收端的服务器在链路层接收到数据之后,数据按序往上层发送,直到应用层。当接收端的应用层收到数据的时候,服务器才算真正接收到客户端发送的 HTTP 请求。流程如上图右边部分所示。
发送端在层与层之间传输数据时,每经过一层都会被加上属于该层的首部信息。接收端在层与层之间传输数据时,每经过一层都会把该层对应的首部去掉。
IP 协议
- IP 协议。IP (Internet Protocol)协议位于网络层,IP 协议的作用是把各种数据包传送给对方。为了保证数据包的正常传输,IP 协议规定了 2 个重要的条件,一个是 IP 地址,一个是 MAC 地址(Media Access Control Address)。IP 地址指明了网络节点被分配到的地址,MAC 地址则是网卡的固定地址。IP 地址可以变换,MAC 地址则是烧录在硬件里面,通常情况下无法更改。
- ARP 协议。网络上的通信依赖于设备的 MAC 地址,网络上通信的双方不可能在通信开始前都彼此了解双方的 MAC 地址,但是通信的发送端肯定是了解接收方的 IP 地址。为了解决获取通信接收方的MAC 地址这个问题,网络设计人员设计了一个 ARP 协议(Address Resolution Protocol),这个 ARP 协议可以根据通信方的 IP 地址查出对应的 MAC 地址。
- routing 机制。网络传输线路千变万化,没有人能够全面掌握网络中的实时传输状况。为了能够让参与传输过程的计算机,路由器等网络设备粗略的了解传输线路。设计人员设计了一个叫做路由(routing)的机制。就像快递公司的送货过程,寄快递的人只要将自己的货物送到快递集散中心,就可以知道快递公司是否肯收件发货,该快递集散中心检查货物的地址,明确下一站该送往哪个区域的集散中心。接着,下一站的集散中心自己会判断货物的下一个线路。
如上图所示。发送端想往 IP 地址为 192.0.43.10 的地方发送数据包,步骤如下。
- 使用 ARP 协议解析出该 IP 地址对应的 MAC 地址。
- 将数据包发送给路由器,路由器根据 routing 机制转发数据包
- IP 地址为 192.0.43.10 的设备收到数据包
TCP 协议
按 TCP/IP 分层结构来看,TCP 协议位于传输层。设计人员设计 TCP 协议是为了在不可靠网络中,提供可靠字节流传输服务。TCP 协议为了更容易传输大数据将大数据分割成以报文段(segment)为单位的数据包进行管理,而且TCP 在数据包发送出去之后,会向对方确认是否成功送达。为了确保数据能够到达目标, TCP 协议设计了三次握手策略(three-way handshaking),除了三次握手之外,TCP 协议还有其他的各种手段来保证通行的可靠性。
- 发送端首先发送一个带 SYN 标志的数据包给对方
- 接收端收到后,回传一个带有 SYN/ACK 的数据包表示数据包确认收到。
- 发送端收到 SYN/ACK 之后,再发送一个带 ACK 标志的数据包。
- 握手结束
DNS 服务
用户通常使用域名来访问一些提供服务的服务器,而不是直接通过 IP 地址。比如,我们要访问百度的主页,通常情况下我们会使用域名而不是 IP 来访问。设计人员为这个使用情景设计了一个 DNS 服务(Domain Name Server),DNS 提供了域名到 IP 地址之间的解析服务。
- 发送端想访问 www.hackr.jp 这个网页
- 发送端使用 DNS 来查询 www.hackr.jp 的 IP 地址
- 发送端取得 IP 地址之后,发起请求
HTTP 请求的基本流程
HTTP 与以上提到的几个协议的关系可以用下面这张图来概括。
- 客户端想浏览 http://hackr.jp/xss/ 这个 web 页面
- 客户端使用 DNS 服务获取域名 hackr.jp 对应的 IP 地址
- 客户端利用应用层 HTTP 协议发起 HTTP 请求
- 客户端利用传输层 TCP 协议将 HTTP 请求报文分割成报文段,添加 TCP 头部信息
- 网络层利用 IP 协议和 Routing 机制传送数据包
- 服务端传输层的 TCP 协议重组请求报文
- 服务端应用层的 HTTP 协议处理客户端请求
- 服务端将请求结果返回