这是「输入url到页面加载过程经历了什么系列」文章 之
3、开启网络线程 -> 发出http请求 -> 后端接收

发送出一个http请求的经过 - 图1

这篇着重讲http,即网络这一层
关键字: http报文结构,常用头部,缓存机制,http2.0,https等特性,跨域与web安全

简述概括

问题:从网卡把数据包传输出去到服务器发生了什么,提示OSI参考模型

image.png
image.png

1、mac->IP: 先从局域网把数据发送到公司的交换机(mac->ip)—— 物理层、数据链路层、路由层(IP, ARP)
(如果交换机没有缓存本地mac地址和IP地址的映射,此时会通过ARP协议来获得),
交换机的好处是可以隔离冲突域(因为以太网用的是CSMA/CD协议,这个协议规定网线上同一时刻只能有一台机器发送数据),这样就可以不仅仅同一时刻只有一台机器发送网络包了
image.png

2、IP: 找到服务器;交换机->路由器(相当于公司网关) —— 物理层、数据链路层、路由层
路由器具有转发和分组数据包的功能
(路由器通过选定的路由协议会构造出路由表,同时不定期的跟相邻路由器交换路由信息),
然后这算是经过了物理层、数据链路层(以太网),开始到网络层进行数据转发了
然后路由器转发IP数据报。通过路由器的分组传输,所有数据到达服务器
image.png

3、传输层:通过端口号找到服务器上的具体服务
image.png
然后服务器的上层协议传输层协议开始发挥作用,根据tcp包里的端口号,让服务器特定的服务来处理到来的数据包,
并且tcp是面向字节流的(tcp有四大特性,可靠传输、流量控制、拥塞控制、连接管理),
所以我们node的request对象,它的监听事件data事件为什么要用字符串一起拼接起来呢(buffer),就是因为tcp本身就是字节流,request对象使用的data(http层面)是tcp传来的数据块

4、应用层http
image.png
最后数据由传输层转交给应用层,也就是http服务(或者https),后端经过一系列逻辑处理,返回给前端数据。

五层分层模型

从客户端发出http请求到服务器接收,中间会经过一系列的流程:
从应用层的发送http请求,到传输层通过三次握手建立tcp/ip连接,再到网络层的ip寻址,再到数据链路层的封装成帧,最后到物理层的利用物理介质传输。

应用层、传输层、网络层、数据链路层、物理层
image.png
image.png

数据包在传送时的封装和解封装如下所示:
发送时封装:将请求的数据+ip等,找到接收方的具体地址
收到时的解封理解:将比特流数据,解析成发送时候的具体参数数据,后端使用
image.pngimage.png

image.png

数据链路层数据包(以太网数据包)格式,除了应用层没有头部,其他都有

层级/作用/传输单位/功能/具体协议
image.png

应用层: HTTP

浏览器打包请求 产生http包

image.png

关键字:http状态码、缓存机制,http2.0,https等特性;
报文结构,常用头部,
http的keep-alive长连接;
cookie

具体详见:
HTTP

应用层: DNS解析:url -> ip

由域名/网址得到IP的过程叫做域名解析,大致流程:

  • 如果浏览器有缓存,直接使用浏览器缓存,否则使用本机缓存,再没有的话就是用host(本地文件存的/etc/host)
  • 如果本地没有,就向dns域名服务器查询(当然,中间可能还会经过路由,也有缓存等),查询到对应的IP

dns解析是很耗时的,因此如果解析域名过多,会让首屏加载变得过慢,可以考虑dns-prefetch优化
(详见💡日常技术沉淀/项目相关/浏览器优化策略-preXXX之DNS Prefetching

传输层: TCP

tcp将http长报文划分为短报文,通过三次握手与服务端建立连接,进行可靠传输


建立TCP连接前,客户端服务端都是关闭状态
直到:客户端主动打开连接,服务端被动打开,处于监听状态,等待接收客户端的请求

image.png
三次握手的步骤:(抽象派)

  1. client: server server 在吗 收到请回答
  2. server: 收到收到,我是server 你准备好了吗
  3. client: 我是,我准备好了,请开始通话吧

为什么要三次握手?
防止服务器端因接收了早已失效的连接请求报文,从而一直等待客户端请求,最终导致形成死锁、浪费资源

四次挥手的步骤

  1. 1.c-s:连接释放,我不会再主动发数据消息给你了,只能被动接收了
  2. 2.s-c:连接释放确认,好的,了解,我知道你要终止连接了
  3. 3.s-c:连接释放,我也没有要给你发送的数据了,那就释放连接吧
  4. 4.c-s:连接释放确认:发送收到终止确认,我收到了你的连接释放,我已确认

引申问题:
1、tcp/ip的并发限制
浏览器对同一域名下并发的tcp连接是有限制的(2-10个不等)
而且在http1.0中往往一个资源下载就需要对应一个tcp/ip请求
所以针对这个瓶颈,又出现了很多的资源优化方案(如cdn返回的资源 域名是多样化的)

2、get和post的区别
GET和POST方法出了在http层面有区别外,在TCP层面也有区别
get会产生一个tcp数据包,post两个;

具体详见:
TCP

参考资料