前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >HTTP的曲折:网络请求到层层封装和终端拆分

HTTP的曲折:网络请求到层层封装和终端拆分

原创
作者头像
源中瑞科技ruiecjo
修改2020-04-30 17:04:03
2.5K1
修改2020-04-30 17:04:03
举报

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

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

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

  1. 输入URL后,会先进行域名解析。优先查找本地host文件有无对应的IP地址,没有的话去本地DNS服务器查找,还不行的话,本地DNS服务器会去找根DNS服务器要一个域服务器的地址进行查询,域服务器将要查询的域名的解析服务器地址返回给本地DNS,本地DNS去这里查询就OK了。
  2. 浏览器拿到服务器的IP地址后,会向它发送HTTP请求。HTTP请求经由一层层的处理、封装、发出之后,最终经由网络到达服务器,建立TCP/IP连接,服务器接收到请求并开始处理。
  3. 服务器构建响应,再经由一层层的处理、封装、发出后,到达客户端,浏览器处理请求。
  4. 浏览器开始渲染页面,解析HTML,构建render树,根据render树的节点和CSS的对应关系,进行布局,绘制页面。

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

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

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

  • 应用层:应用程序负责将数据以相应规则(协议)进行包装,发给传输层
    • HTTP:超文本传输协议
    • FTP:文件传输协议
    • SMTP:简单邮件传送协议
    • SNMP:简单网络管理协议
  • 传输层:负责将应用层传过来的数据进行分组,为确保终端接收数据的顺序和完整性,会对每个分组进行标记,交给网络层
    • TCP:传输控制协议
    • UDP:用户数据协议
  • 网络层:负责将传输层发来的数据分组发送到目标终端
    • ICMP:Internet互联网控制报文协议
    • IGMP:Internet组管理协议
    • IP:网际协议
  • 链路层:为网络层发送和接收数据单元
    • ARP:地址解析协议
    • RARP:逆地址解析协议

封装

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

分用

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

HTTP

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

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

地址解析协议:ARP

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

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

以太网数据帧

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

传输和接收

  1. 接收到上层传过来的数据报之后,根据MTU以及数据报大小来决定是否分割成小块,也就是IP数据报被分片的过程。
  2. 把数据报(块)封装成一帧,传给底层组件,底层组件将帧转换为比特流,并发送出去。
  3. 以太网上的设备接收到帧,检查帧里边的目标地址,如果与本机地址匹配,帧就会被处理,一层一层向上传递(分用过程)。

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 传输和接收
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档