在浏览器中输入URL并回车后都发生了什么?

参考连接:  https://www.cnblogs.com/tisikcci/p/5866753.html

1首先:浏览器解析URL(统一资源定位符。俗称网页地址或者网址):

 

   URL主要包括:1:传输协议  2 服务器  3域名  4 端口  5 虚拟目录 6 文件名 7参数 8锚  

http://www.lalal.com:8080/wa/index.html?boardID=5&ID=24618&page=1    #name

 

 

2DNS解析(域名解析):根据域名解析ip地址

解析DNS步骤:

    1:查询浏览器缓存,如果没有找到

    2:检查系统缓存,如果没有找到

   3:检查路由器缓存,如果没有找到

    4:检查ISP(服务商),DNS(本地服务器缓存),如果没有找到

    5:递归查询:从跟域名服务器  到顶级域名服务器再到极限域名服务器依次搜索对应目标域名IP

 

3浏览器与网站建立TCP连接(三次握手):

    客户端(A)向浏览器(B)发送连接请求等待服务器确认,A随机选取一个序列号作为自己的初始序列号(seq=x)发送给B,同时使控制状态码 同步比特SYN置为1,表示要主动的连接B的意思。

  服务器收到请求后确认(将确认比特置为1即ACK=1)并回复一个指令使SYN置为1,并告诉A自己此时的序列号seq为y,使等待接收的数据包的序列号ack=x+1(使用ack对A的数据包进行确认,因为自己已经收到序列号为x的包,所以期望对方继续发送的哪个数据包的ack=x+1),

  客户端收到服务器的回复指令并返回确认,发送确认比特ACK为1,序列号seq=x+1,ack=y+1. 建立连接。

 

状态控制码:

  ACK:确认比特:只有当ACK=1时确认号字段才有效,代表这个封包为确认封包。当ACK=0时,确认号无效。

  SYN:同步比特SYN置为1,就表示这是一个连接请求或连接接受报文,通常带有 SYN 标志的封包表示『主动』要连接到对方的意思。

seq是序列号,这是为了连接以后传送数据用的,

ack是对收到的数据包的确认,值是等待接收的数据包的序列号。

讲解:

第一次握手:客户端向服务器端发送请求(SYN=1) 等待服务器确认;

第二次握手:服务器收到请求并确认,回复一个指令(SYN=1,ACK=1);

第三次握手:客户端收到服务器的回复指令并返回确认(ACK=1)。

在第一次消息发送中,A随机选取一个序列号作为自己的初始序号发送给B;第二次消息B使用ack对A的数据包进行确认,因为已经收到了序列号为x的数据包,准备接收序列号为x+1的包,所以ack=x+1,同时B告诉A自己的初始序列号,就是seq=y;第三条消息A告诉B收到了B的确认消息并准备建立连接,A自己此条消息的序列号是x+1,所以seq=x+1,而ack=y+1是表示A正准备接收B序列号为y+1的数据包。

通过三次握手就建立了客户端和服务端间的连接,可以进行数据传输。

4:请求和传输数据

 

比如要通过get请求访问“http://www.dydh.org/”,通过抓包可以看到:

请求网址(url):http://www.dydh.org/

请求方法:GET

远程地址:IP

状态码:200 OK

Http版本: HTTP/1.1

请求头: ...

响应头: ...

5浏览器渲染页面:

 

客户端拿到服务器端传输来的文件,找到HTML和MIME文件,通过MIME文件,浏览器知道要用页面渲染引擎来处理HTML文件。

a.浏览器会解析html源码,然后创建一个 DOM树。

在DOM树中,每一个HTML标签都有一个对应的节点,并且每一个文本也都会有一个对应的文本节点。

b.浏览器解析CSS代码,计算出最终的样式数据,形成css对象模型CSSOM。

首先会忽略非法的CSS代码,之后按照浏览器默认设置——用户设置——外链样式——内联样式——HTML中的style样式顺序进行渲染。

c.利用DOM和CSSOM构建一个渲染树(rendering tree)。
渲染树和DOM树有点像,但是是有区别的。

DOM树完全和html标签一一对应,但是渲染树会忽略掉不需要渲染的元素,比如head、display:none的元素等。

而且一大段文本中的每一个行在渲染树中都是独立的一个节点。
渲染树中的每一个节点都存储有对应的css属性。

d.浏览器就根据渲染树直接把页面绘制到屏幕上。

 

你可能感兴趣的:(面试)