从输入URL到展示页面发生了什么:
- DNS解析URL为对应的IP地址
- 根据IP地址建立 TCP 连接
- 发起HTTP请求
- 服务器处理HTTP请求,浏览器接收HTTP响应
- 页面渲染,构建DOM树
- 关闭 TCP 连接
一、DNS域名解析
TCP/IP中使用IP地址来确定网络上的一台主机,但是IP地址不方便记忆,且不能表达地址组织信息,于是人们发明了域名,并通过域名系统来映射域名和IP地址,域名解析的过程实际是将域名还原为IP地址的过程。
域名解析过程:
发送端主机作为域名系统树形结构的一个子节点,通过域名信息,从下到上查找对应IP地址的过程。如果到根节点(根域名服务器)还找不到,即找不到该主机。
二、TCP连接
在通过第一步的DNS域名解析后,获取到了服务器的IP地址,在获取到IP地址后,开始建立一次连接,这是由TCP协议完成的,主要通过三次握手进行连接:
- 第一次握手:建立连接时,客户端发送SYN到服务器,并进入SYN_SENT状态,等待服务器确定;
- 第二次握手:服务器收到SYN,必须确认客户的SYN,同时自己也发送一个SYN给客户端,即SYN+ACK包,此时服务器进入SYN_RECV状态;
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送ACK包,此包发送完毕后,客户端和服务器都进入ESTABLISHED状态,完成三次握手,TCP连接建立成功。
完成三次握手后,客户端和服务器开始传送数据。
三、发起HTTP请求
HTTP请求包括请求行、请求头、请求体:HTTP协议详解
四、浏览器接收HTTP响应
服务器在收到浏览器发送的HTTP请求之后,会将收到的HTTP报文封装成HTTP的Request对象,并通过不同的Web服务器进行处理,处理完的结果以HTTP的Response对象返回,主要包括状态行、响应头、响应体三个部分。
HTTP响应状态码如下:
响应体为服务器返回给浏览器的信息,主要由HTML,CSS,JS,图片文件等组成。
五、页面渲染
浏览器拿到响应文本后,解析HTML代码,请求JS,CSS等资源,最后进行页面渲染,呈现给用户。
页面渲染一般分为以下几个步骤:
- 解析HTML文件,构建DOM树
- 解析CSS文件,构建CSSOM树(CSS规则树)
- DOM树与CSSOM树合成渲染树
- 构建好渲染树之后,会过滤掉display:none 这种无需渲染的节点,将render tree渲染到页面
六、断开TCP连接
当数据传输结束之后,四次挥手断开TCP连接:在断开连接之前客户端和服务器都处于ESTABLISHED状态,双方都可以主动断开连接,以客户端主动断开连接为优。
- 第一次挥手:客户端打算断开连接,向服务器发送FIN报文(FIN标记位被设置为1,1表示为FIN,0表示不是),FIN报文中会指定一个序列号seq=n,之后客户端进入FIN_WAIT_1状态;
- 第二次挥手:服务器收到连接释放报文段(FIN报文)后,就向客户端发送ACK应答报文,以客户端的FIN报文的序列号 seq+1 作为ACK应答报文段的确认序列号ack = seq+1 = n + 1。此时服务器进入CLOSE_WAIT(等待关闭)状态,此时的TCP处于半关闭状态,客户端到服务器的连接释放。客户端收到来自服务器的ACK应答报文段后,进入FIN_WAIT_2状态;
- 第三次挥手:服务器也打算断开连接,向客户端发送连接释放(FIN)报文段,之后服务器进入LASK_ACK(最后确认)状态,等待客户端的确认;
- 第四次挥手:客户端收到来自服务器的连接释放(FIN)报文段后,会向服务器发送一个ACK应答报文段,之后客户端进入TIME_WAIT(时间等待)状态,服务器收到ACK应答报文段后,服务器就进入CLOSE(关闭)状态,到此服务器的连接已经完成关闭。
客户端处于TIME_WAIT状态时,此时的TCP还未释放掉,需要等待2MSL后,客户端才进入CLOSE状态。
七、广域网数据传输流程
广域网数据传输流程图如下:
总结
本篇文章到这里就结束了,本文简单的描述了从输入URL到页面展示中间发生了什么,事实上实际中要比这个复杂的多,如果你觉得有收获的话,就留下你的👍吧!