参考连接: 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.浏览器就根据渲染树直接把页面绘制到屏幕上。