当在浏览器中输入URL并回车后,到页面最终渲染完成,大致经历以下流程:
过程比较细致,最下面有流程图以及100个字简要回答!
1. DNS解析
- 含义:URL通常是人类可读的域名形式,如 www.example.com ,但计算机网络通信需要的是IP地址。
- DNS(Domain Name System,域名系统)解析就是将域名转换为对应的IP地址的过程。
- 过程:浏览器首先会检查自身的DNS缓存,看是否有该域名对应的IP地址记录。若没有,则向本地DNS服务器发起查询请求。
- 本地DNS服务器也会先检查自身缓存,若未找到,它会向根DNS服务器查询,根DNS服务器会返回顶级域名(如 .com )服务器的地址。
- 本地DNS服务器再向顶级域名服务器查询,顶级域名服务器返回权威域名服务器地址,
- 最后本地DNS服务器向权威域名服务器查询,获取到域名对应的IP地址,并将其返回给浏览器,同时本地DNS服务器也会缓存该记录。
2. 建立TCP连接(三次握手)
- 含义:HTTP协议是基于TCP协议之上的应用层协议,在进行HTTP通信之前,需要先建立可靠的TCP连接。
- 过程:
- 第一次握手:客户端向服务器发送一个带有SYN(同步序列号)标志的TCP报文段,此时客户端进入SYN_SENT状态,等待服务器响应。
- 第二次握手:服务器接收到客户端的SYN报文段后,会向客户端发送一个带有SYN和ACK(确认号)标志的报文段。其中ACK是对客户端SYN的确认,值为客户端的SYN值加1;同时服务器也会发送自己的SYN值,此时服务器进入SYN_RCVD状态。
- 第三次握手:客户端接收到服务器的SYN + ACK报文段后,向服务器发送一个带有ACK标志的报文段,ACK值为服务器的SYN值加1,至此客户端和服务器都进入ESTABLISHED状态,TCP连接建立完成。
3. 发送HTTP请求
- 含义:TCP连接建立后,浏览器会根据用户输入的URL生成HTTP请求报文,并通过TCP连接发送给服务器。
- 内容:HTTP请求报文由请求行、请求头、空行和请求体组成。
- 请求行包含请求方法(如GET、POST等)、URL和HTTP协议版本;
- 请求头包含一些附加信息,如User - Agent(浏览器信息)、Accept(可接受的响应内容类型)等;
- 如果是POST请求,请求体中会包含要发送的数据。
4. 服务器处理请求并响应
- 含义:服务器接收到HTTP请求后,会对请求进行解析,根据请求的内容进行相应的处理,并生成HTTP响应返回给浏览器。
- 过程:服务器首先解析请求报文,获取请求方法、URL、请求头等信息。
- 然后根据请求的资源路径,在服务器端查找对应的资源。
- 如果是动态资源(如PHP、Python等脚本生成的内容),服务器会调用相应的脚本语言环境进行处理,可能涉及数据库查询、业务逻辑计算等操作。
- 最后,服务器将处理结果组装成HTTP响应报文。
5. 接收HTTP响应
- 含义:浏览器通过TCP连接接收服务器返回的HTTP响应报文。
- 内容:HTTP响应报文由状态行、响应头、空行和响应体组成。
- 状态行包含HTTP协议版本、状态码(如200表示成功,404表示未找到资源等)和状态描述;
- 响应头包含一些关于响应的附加信息,如Content - Type(响应内容类型)、Content - Length(响应内容长度)等;
- 响应体则是服务器返回的实际内容,可能是HTML、CSS、JavaScript等文件内容。
6. 浏览器渲染页面
-
解析HTML:浏览器从响应体中获取HTML内容,开始解析HTML文档,构建DOM树(文档对象模型)。在解析过程中,遇到 script 标签,如果是内联脚本或外部脚本引用,会暂停DOM树的构建,优先下载并执行脚本(因为脚本可能会修改DOM结构),执行完后继续构建DOM树。
-
解析CSS:浏览器同时解析CSS样式表,构建CSSOM树(CSS对象模型),它描述了页面的样式信息。
-
构建渲染树:将DOM树和CSSOM树合并成渲染树,渲染树的节点包含了每个元素的样式信息以及在页面中的位置等。渲染树只包含需要显示的元素,如 script 、 meta 等不影响页面显示的元素不会出现在渲染树中。
-
布局(回流):根据渲染树中每个节点的样式信息和位置,计算它们在页面中的几何位置和大小,确定每个元素在页面中的精确布局。这个过程会涉及到页面的回流,即当页面元素的几何属性(如宽、高、位置等)发生变化时,浏览器需要重新计算页面布局。
-
绘制(重绘):根据渲染树和布局信息,将每个元素的可视内容绘制到屏幕上。这涉及到颜色、边框、文本等的绘制。如果元素的样式(如颜色、背景色等)发生变化,但不影响布局,浏览器会进行重绘操作,只重新绘制受影响的部分。
7. 断开TCP连接(四次挥手)
-
含义:当数据传输完成,浏览器和服务器之间的TCP连接不再需要时,会通过四次挥手过程来关闭连接,释放资源。
-
过程:
-
第一次挥手:主动关闭方(通常是浏览器)发送一个带有FIN(结束标志)标志的TCP报文段,进入FIN_WAIT_1状态,表示它已经没有数据要发送了,但还可以接收数据。
-
第二次挥手:被动关闭方(服务器)接收到FIN报文段后,发送一个ACK报文段,确认收到FIN,此时主动关闭方进入FIN_WAIT_2状态,被动关闭方进入CLOSE_WAIT状态。
-
第三次挥手:被动关闭方处理完所有数据后,发送一个FIN报文段,进入LAST_ACK状态,表示它也没有数据要发送了。
-
第四次挥手:主动关闭方接收到被动关闭方的FIN报文段后,发送一个ACK报文段进行确认,然后进入TIME_WAIT状态。经过一段时间(2倍的MSL,最大段生存期)后,如果没有收到被动关闭方的重传请求,主动关闭方就关闭连接,被动关闭方在收到ACK报文段后也立即关闭连接。
一个简单的小图:
graph TD
输入URL --> DNS解析-获取ip地址 --> TCP连接-三次握手 --> 发送HTTP请求 -->
服务器处理并响应 --> 浏览器接收响应解析HTML-CSS构建渲染树-完成渲染 --> TCP断开连接-四次挥手
简要回答:输入url后,浏览器先进行DNS解析获取IP地址,接着通过三次握手建立TCP连接,然后发送HTTP请求,服务器处理并响应。浏览器接收响应,解析HTML,CSS构建渲染树,经布局与绘制完成页面渲染,最后经过四次挥手断开TCP连接。
这篇记录到此结束,感谢观看。