从输入URL到页面加载的过程
之前一直都是直接看一下总结的八股文章,对于实际的整个链路并不是特别熟悉,这次花了一天多的时间看了很多资料,对于整个页面加载的流程有了自己的理解,从前端开始访问的浏览器多线程、缓存等问题,到计算机网络的各层协议的处理,再到服务器接收请求的整个过程,都进行了一些了解,原始文档是在飞书中写的,所以在这边排版可能会存在一些问题,已经修改了一部分。
文章的不足之处也请大佬在评论中指出!
1. HTTP 解析URL:
浏览器是多进程,浏览器内核是多线程,浏览器接收URL,浏览器根据解析出的协议,根据解析的内容生成HTTP请求,开辟一个网络线程去请求资源,会先查找本地缓存是否缓存了该资源,如果有缓存资源那么直接返回资源给浏览器进程;如果在本地缓存中没有查找到资源,那么直接进入网络请求流程;
2. DNS(应用层协议) 解析:
如果输入的是域名,需要将域名解析成对应的 IP 地址,如果请求协议是HTTPS,那么还需要建立SSL/TLS连接(TLS的四次握手在TCP的三次握手之后);(DNS的解析过程见问题5) 通过DNS获取到IP之后,就可以把HTTP的传输工作交给操作系统中的协议栈。
应用程序(浏览器)通过调用 Socket 库,来委托协议栈工作。协议栈的上半部分有两块,分别是负责收发数据的 TCP 和 UDP 协议,这两个传输协议会接受应用层的委托执行收发数据的操作。
协议栈的下面一半是用 IP 协议控制网络包收发操作,在互联网上传数据时,数据会被切分成一块块的网络包,而将网络包发送给对方的操作就是由 IP 负责的。
此外 IP 中还包括 ICMP 协议和 ARP 协议。
- ICMP 用于告知网络包传送过程中产生的错误以及各种控制信息。
- ARP 用于根据 IP 地址查询相应的以太网 MAC 地址。
IP 下面的网卡驱动程序负责控制网卡硬件,而最下面的网卡则负责完成实际的收发操作,也就是对网线中的信号执行发送和接收操作。
3. TCP 连接:
利用IP地址和服务器通过三次握手,建立 TCP 连接(HTTP是基于TCP协议传输的)(详细内容见问题15)
TCP 的连接状态查看,在 Linux 可以通过 netstat -napt 命令查看
4. 向服务器发送 HTTP 请求:
连接建立之后,浏览器端会构建请求行、请求头等信息,并把和该域名相关的 Cookie 等数据附加到请求头中,然后向服务器发送构建的请求信息。
五层协议栈:从应用层的发送http请求,到传输层通过三次握手建立tcp/ip连接,再到网络层的ip寻址,再到数据链路层的封装成帧,最后到物理层的利用物理介质传输。
- HTTP报文(请求方式+URL+数据)
- 传输层添加TCP头部(源端口号+目的端口号)
- IP 增加 IP报文头部(协议号(06表示协议为TCP) + 源IP地址 + 目的IP地址)
- 添加以太网头部(MAC地址):接收方 MAC 地址、发送方 MAC 地址 ARP协议通过广播的方式帮我们找到MAC地址
- 网卡将包转为电信号通过网线发出
- 交换机:电信号到达网线接口,交换机里的模块进行接收,将电信号转换为数字信号,校验完成之后,如果是发送给自己的则将包放入缓冲区,接下来查询接收方MAC地址,交换机根据 MAC 地址表查询 MAC 地址,然后将信号发送到相应的端口。
如果没有在MAC地址表中查询到指定的MAC地址,就将接收方MAC地址置为广播地址,将包发送到除了源端口之外的所有端口。
- 路由器:这一步转发的工作原理和交换机类似,也是通过查表判断包转发的目标
5. 服务器处理请求,返回 HTTP 响应:
- Nginx可以处理静态请求,也可以将动态请求转发;
- Gateway网关处理,用于处理请求的路由、认证、授权等;
- 应用服务器服务器处理:请求被转发到后端服务器,执行相应的逻辑;
- 应用服务器生成HTTP响应。
6. 浏览器解析并渲染页面:遇到外链资源的情况下,会单独开启一个线程去下载资源;
7. 断开连接:TCP 四次挥手,连接结束
参考文档:
- 从输入URL到页面加载的过程?如何由一道题完善自己的前端知识体系! | Dailc的个人主页
- 一文读懂网关概念+Nginx正反向代理+负载均衡+Spring Cloud Gateway
- 在浏览器输入 URL 回车之后发生了什么(超详细版)