作为程序员的我们每天都在和网络请求打交道,而前端程序员接触的最多的就是HTTP请求。平时工作中,处理网络请求之类的操作是最多的了。但是一个请求从客户端发出到被服务端处理、再回送响应,再被客户端接收这一个闭环的底层细节可能并没有深究过。

本文由源中瑞IT徐瑞ruiecjo编辑,如文中某些点如果表述有误,欢迎指出,不胜感激。

从输入URL到页面展现的过程

输入URL后,会先进行域名解析。优先查找本地host文件有无对应的IP地址,没有的话去本地DNS服务器查找,还不行的话,本地DNS服务器会去找根DNS服务器要一个域服务器的地址进行查询,域服务器将要查询的域名的解析服务器地址返回给本地DNS,本地DNS去这里查询就OK了。

浏览器拿到服务器的IP地址后,会向它发送HTTP请求。HTTP请求经由一层层的处理、封装、发出之后,最终经由网络到达服务器,建立TCP/IP连接,服务器接收到请求并开始处理。

服务器构建响应,再经由一层层的处理、封装、发出后,到达客户端,浏览器处理请求。

浏览器开始渲染页面,解析HTML,构建render树,根据render树的节点和的对应关系,进行布局,绘制页面。

这4个步骤包含了一个HTTP请求的完整生命周期,文章着重介绍第2步和第3步,也就是请求是如何在两个物理端点之间进行通信的。数据的发出和接收必然会经历一些处理、解析的过程,这些过程在系统的不同层次进行。

个HTTP请求从源端发出到在终端接收的处理过程都是要经过以下四层。其中每一层都有各自的协议。

HTTP的曲折:网络请求到层层封装和终端拆分_第1张图片

上图中只举例出了最常见的协议,实际上每一层都有细分的协议:

应用层:应用程序负责将数据以相应规则(协议)进行包装,发给传输层

HTTP:超文本传输协议

FTP:文件传输协议

SMTP:简单邮件传送协议

SNMP:简单网络管理协议

传输层:负责将应用层传过来的数据进行分组,为确保终端接收数据的顺序和完整性,会对每个分组进行标记,交给网络层

TCP:传输控制协议

UDP:用户数据协议

网络层:负责将传输层发来的数据分组发送到目标终端

ICMP:Internet互联网控制报文协议

IGMP:Internet组管理协议

IP:网际协议

链路层:为网络层发送和接收数据单元

ARP:地址解析协议

RARP:逆地址解析协议

封装

源端发送HTTP报文时,报文会以数据流的形式通过一条已经打开的TCP连接按序传输,TCP收到数据流后会将其分割成小的数据块,每个小块被添加的TCP首部与数据块共同组成了TCP分组,分组经由网络层发送,网络层遵循IP协议,当收到分组发送请求后,会将分组其放入IP数据报,填充报头,将数据报发经由链路层发送出去。

HTTP的曲折:网络请求到层层封装和终端拆分_第2张图片

分用

终端接收到一个以太网数据帧时,数据自底层向上流动,去掉发送时各层协议加上的报文首部,每层协议都要检查报文首部的协议标识,从而确定上层协议,保证数据被正确处理,这个过程叫分用。

HTTP

HTTP属于应用层,用户触发交互所产生的行为数据和服务端对此的响应都由它封装成HTTP报文,再交由下层协议进行处理。报文的作用是客户端与服务端沟通的载体,双方都要遵循统一规则对信息进行处理,这一规则称为HTTP。

客户端与服务端的交互往往非常复杂,为了使双方都能高效、明确、安全地通信(例如传递意图与状态、承载数据、携带认证信息、控制连接行为与缓存),需要依赖报文中的结构来实现,下面先从结构开始看。

地址解析协议:ARP

IP只能让数据在逻辑端点之间流动,但是IP之下还有网络接口层,这一层也有自己的地址(MAC地址:用于在网络中唯一标识一个网卡),从IP地址到MAC地址需要一个转换的过程,ARP就是提供这一服务的。

ARP协议实现了从IP地址到MAC地址的映射。一开始,起点并不知道目标的MAC地址,只有目标IP,要获取这个地址就涉及到了ARP的请求和应答。同样,ARP也有自己的分组,先看一下分组格式。

以太网数据帧

上面所有东西都准备好了,封装发送的其实是以太网数据帧。以太网目的地址、以太网源地址、帧类型这三者组成了帧首部。在首部之前还会插入前同步码和帧开始定界符,告知接收端做一些准备工作。帧检验序列 FCS被添加进尾部,用来检测帧是否出错。.

传输和接收
接收到上层传过来的数据报之后,根据MTU以及数据报大小来决定是否分割成小块,也就是IP数据报被分片的过程。

把数据报(块)封装成一帧,传给底层组件,底层组件将帧转换为比特流,并发送出去。

以太网上的设备接收到帧,检查帧里边的目标地址,如果与本机地址匹配,帧就会被处理,一层一层向上传递(分用过程)。

一个网络请求从源端一层层封装,再到终端一层层拆分,最后的所有过程基本梳理清楚,文章只是简单梳理了一下大概流程,并且只以HTTP报文通过TCP协议经过IP传送这一过程为例,实际还有很多概念没有覆盖,比如链路层的尾部封装、IP的动态选路、逆地址解析协议RARP、UDP协议相关的概念,建议大家可以阅读下面列出的参考资料,相信会有更多收获。