面试题:从在地址栏中输入URL到页面加载显示完成,这个过程中都发生了什么?(比较详细)

从在地址栏中输入URL到页面加载显示完成,这个过程中都发生了什么?

(1)浏览器解析url
解析传输协议类型和请求的资源的路径

(2)缓存判断
浏览器判断请求的资源是否在缓存里

=> 存在且资源没有失效,则直接使用缓存里的资源
=> 不存在或资源失效,则向服务器发起新的请求,获取资源

(3)DNS解析
获取输入的URL中的域名的IP地址,判断本地是否有该域名的IP地址的缓存

=> 缓存中有 => 用缓存中的IP
=> 缓存中没有 => 向本地DNS服务器发起请求=> DNS检查自身是否有缓存=> 没有,则向根域DNS服务器【.】发起请求,获取顶级域名 > 再向顶级域服务器【.com.cn…】发起请求,获取权威域名 > 再向权威域DNS服务器发起请求 => 本地DNS服务器获取到IP地址,将IP返回给请求的用户

补充:用户向本地DNS服务器发起请求属于递归请求,本地DNS服务器向各级域名服务器发起请求属于迭代请求。

(4)获取mac地址
在进行建立TCP连接之前,需要先获取目标设备的mac地址,这样才能建立连接。

通过将IP地址与本机的子网掩码进行与运算(获取到网络地址),可以判断是否与请求的主机在一个子网里1,如果在同一个子网里,可以使用ARP协议通过广播获取到目的主机的mac地址,如果不在同一个子网里,那么请求应该转发给网关,由他代为转发,此时同样可以使用ARP协议来获取网关的mac地址,此时目的主机的mac地址应该为网关的地址。

客户端会首先发送一个ARP广播消息,请求网络上所有设备帮助它查找服务器的MAC地址。服务器收到这个请求之后,会回复一个包含自己MAC地址的ARP响应消息,告诉客户端自己的MAC地址。客户端收到这个响应消息之后,就可以准确地将TCP请求报文发送到服务器所在的网络设备上,从而进行后续的三次握手过程。

(5)TCP连接,三次握手
找到要进行连接的对象后,开始建立连接。确认客户端与服务器的接收与发送能力。

简单描述下三次握手过程如下:
1、客户端向服务器端发送一个带有SYN、连接请求报文段和一个随机序号的请求;
2、服务器端收到请求后向客户端发送SYN ACK报文段,确认连接请求,并且同时向客户端发送一个随机序号;
3、客户端接收服务器的确认应答后,进入连接建立的状态,同时也向服务器端发送一个ACK确认报文段,服务器接收到确认后,也进入连接建立状态,此时双方的连接就建立起来了。

(6)数据发送的过程
传输层:

TCP协议

=> 给从应从层传过来的请求信息添加TCP头【源端口号、目标端口号、确认位、状态位(syn、ack、rst、fin、urg、rsh)】

=> TCP头+HTTP请求信息组成TCP段(segment)

=> 分段:当HTTP请求信息太长,就要将其分段,每一段都添加上TCP头,分段大小为MSS(单个网络包所能容纳的 TCP 数据的最大长度)

=> TCP协议中有两个端口:浏览器监听端口、web服务器监听端口【默认端口号  HTTP:80,HTTPS:443】

=> 最终数据包的结构:【TCP头【HTTP请求信息】】

=> 传输层其他功能:拥塞控制、流量控制

=> 最终数据包的结构:【TCP头【HTTP请求信息】】

网络层

IP协议

=> 给从传输层传过来的数据包添加IP报头【源IP,目标IP,协议号(由传输层传过来的协议类型,例如TCP,用十六进制表示06)】

=> 子网号【网络地址】、主机号、广播地址、子网掩码【用于标识IP所属子网】

     网络地址 = 目标地址 子网掩码 按位与&

     主机号 = 目标地址 子网掩码取反 按位与&

     广播地址 = 目标地址 子网掩码取反 或运算|

=> 最终数据包的结构:【IP头【TCP头【HTTP请求信息】】】

网络接口层

(5)网卡中

=> 发包前,ARP协议会先检查ARP缓存

     => 如果缓存中保存了接收方的IP地址,那么就好找到相应的mac地址;

     => 如果路由中没有保存,那么就会进行广播查询询问所有以太网内的设备,获取接收方mac地址(这一步发生在三次握手之前)

=> 添加mac头部,mac报头内容【接收方mac地址、发送方mac地址、协议类型】

=> mac地址在出厂的的时候就刻在了设备网卡的rom中

=> 最终的数据包结构【mac头【IP头【TCP头【HTTP请求信息】】】】

=> 网卡驱动程序获取数据包后,包首添加报头和起始帧分界符,包尾添加fcs【帧校验序列,用于检验错误、包是否损坏】

=> 数据包结构就变成了【帧首【mac头【IP头【TCP头【HTTP请求信息】】】】帧尾】

=> 将数据包【数字信号】 => 电信号 => 发送【给交换机】


(6)交换机

=> 交换机的作用是将网络包原样转发到目的地

=> 本身不具备mac地址,但会保存目标设备的mac地址以及连接的端口号

=> 电信号 => 数字信号 => 校验fcs => 没问题的包直接全部保留到缓存中

       => 查询缓存表【目标设备mac地址、对应路由端口号】

       => 找到指定mac地址后,会将数据包发送给对应端口号的路由

(7)路由

=> 路由器的作用和交换机类似,都是用来转发数据包的,区别在于路由器的每个端口有mac地址和IP地址

=> 路由器接收到交换机传过来的数据后,会先进行fcs校验,

    没问题后再进行mac地址校验,看是不是发给自己的包,不是,则丢弃

=> mac地址校验完成后,会抛弃当前mac头,转而根据IP头中的内容进行转发操作

=> 先查询路由表判断转发目标,找到匹配的子网或者默认路由

=> 通过路由表的网关列判断对方的地址

如果网关是一个 IP 地址,则这个IP 地址就是我们要转发到的目标地址,还未抵达终点,还需继续需要路由器转发。
如果网关为空,则 IP 头部中的接收方 IP 地址就是要转发到的目标地址,也就是找到 IP 报头里的目标地址了,说明已抵达终点

=> 知道对方的 IP 地址之后,接下来需要通过 ARP 协议根据 IP 地址查询 MAC 地址,

     并将查询的结果作为接收方 MAC 地址,作为mac头部。

=> 路由器也有 ARP 缓存,因此首先会在 ARP 缓存中查询,如果找不到则发送 ARP 查询请求,找到接收方mac地址

=> 发送数据包

=> 发送出去的网络包会通过交换机到达下一个路由器。由于接收方 MAC 地址就是下一个路由器的地址,所以交换机会根据这一地址将包传输到下一个路由器。接下来,下一个路由器会将包转发给再下一个路由器,经过层层转发之后,网络包就到达了最终的目的地。

浏览器解析响应信息过程

(9)扒皮过程

=> 路由 => 交换机 => 网络接口层(扒掉mac头)=> 网络层(扒掉IP头)=> 传输层(扒掉tcp头) => HTTP请求信息(html文档)

(7)浏览器使用html解析器从网络(请求)或本地读取到html文件的字节流将其转换为字符流【html代码】

(8)构建DOM树。

1)浏览器根据html代码解析成一个个的标记,这些标记可以是开始标签,结束标签,属性名和属性值等

2)浏览器根据标记构建DOM节点对象,即通过标记构建对应的元素节点、文本节点、注释节点等。

3)构建父子关系。浏览器通过分析标签之间的关系,确定每个节点的父子关系。

(9)解析样式,构建CSSOM树。在构建DOM树的同时会解析CSS样式,构建CSSOM树。

(10)加载javascript代码。如果 HTML 文档中包含 JavaScript 代码,则浏览器会按照顺序加载并执行其中的脚本。执行顺序是按照在 HTML 文件中的顺序来执行的。

(11)构建渲染树。浏览器基于 DOM 树和 CSS 样式信息,构建出一个渲染树(render tree),即一个包含所有可见元素的树形结构。

(12)布局页面。根据布局算法计算出来的元素的位置和大小等信息对每个元素进行排版

(13)绘制页面。浏览器会根据渲染树的结构和样式属性,将页面绘制到屏幕上。

(14)TCP四次挥手,断开连接。
过程简单描述如下:
1)若客户端认为数据发送完成,则它需要向服务端发送连接释放请求。服务端收到连接释放请求后,会告诉应用层要释放tcp连接,然后会发送ack包,并进入CLOSE_WAIT状态,此时表明客户端到服务端的连接已经释放,服务端不再接受客户端发的数据了
2)但是由于TCP连接是双向的,所以服务端仍旧可以发送数据给客户端,服务端此时如果还有没发完的数据会继续发送,完毕后会向客户端发送连接释放请求,然后服务器便进入LAST-ACK状态。
3)客户端收到释放请求后,向服务端发送确认应答,此时客户端进入TIME_WAIT状态。
4)该状态会持续ZMSL(最大段生存期,指报文段在网络中生存的时间,超时会被抛弃)时间,若该时间段内没有服务端的重发请求的话就进入CLOSED状态。当服务端收到确认应答后,也进入CLOSED状态


  1. 通过将本机的IP地址与子网掩码进行与运算得到的结果,可以判断本机所处的网络号,然后再将请求主机的IP地址与子网掩码进行与运算,得到它所处的网络号,最后比较两个网络号是否相等,从而判断是否在同一个子网里。 ↩︎

猜你喜欢

转载自blog.csdn.net/lalala_dxf/article/details/131264382