当浏览器输入url按回车
一.浏览器解析出url中的域名
URL由通信协议+域名地址+端口号+资源路径组成,浏览器需要从url中解析要请求的域名
网站的URL会分为两部分:通信协议和域名地址。
域名地址都很好理解,不同的域名地址表示网站中不同的页面。而通信协议,简单来说就是浏览器和服务器之间沟通的语言。网站中的通信协议一般就是HTTP协议和HTTPS协议。
即浏览器解析出对应的url域名
二.DNS解析
找到域名对应的IP地址,该过程分为如下10步:
1.查询浏览器的DNS缓存
2.若浏览器缓存中未找到该域名对应的ip,则查找操作系统的DNS缓存,即hosts文件中的域名与ip的映射关系
3.若在操作系统缓存中也没有找到,则查找本地DNS服务器缓存。
4.若本地DNS缓存中仍然没有找到,则直接请求Root Server域名服务器
5.根域名服务器返回给本地服务器一个所查询域的主域名服务器(gTLD Server)地址,gTLD是顶级域名服务器,如.com、.cn、.org等。
6,.本地域名服务器向上一步返回的gTLD服务器发送解析请求。
7.gTLD接受请求查找并返回此域名对应的Name Server域名服务器的地址
8.本地域名服务器向Name Server域名服务器发送解析请求,Name Server域名服务器找到该域名对应的ip,连同一个TTL值返回给本地域名服务器。
9.本地域名服务器缓存该域名和ip的对应关系,缓存时间由TTL的值控制
10.把解析结果返回给用户,用户根据TTL值进行缓存。
三.客户端与服务器建立TCP连接
通过三次握手,建立了客户端和服务器之间的连接
第一次握手:客户端向服务器端发送请求(SYN=1) 等待服务器确认;
第二次握手:服务器收到请求并确认,回复一个指令(SYN=1,ACK=1);
第三次握手:客户端收到服务器的回复指令并返回确认(ACK=1)。
SYN同步序号,ACK确认序号
1,确认ACK,仅当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1;
2,同步SYN,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1;
三次握手详解:
- 第一次握手:A将SYN置1,选择一个seq=x(序号,起始发送位)。SYN报文段不能携带数据,但要消耗掉一个序号。这时TCP进程进入SYN-SENT(同步已发送)状态。
- 第二次握手:B收到请求报文段后,若同意则向A发送确认。在确认报文段中把SYN和ACK都置1,确认号是ack = x+1,同时也为自己选择一个初始序号seq=y。这个报文段也不能携带数据,但同样要消耗掉一个序号。TCP服务器进程进入SYN-RCVD(同步收到)状态。
- 第三次握手:TCP客户进程收到B的确认后,还要向B给出确认。确认报文段的ACK置1(连接建立,两边ACK必须全部置1),确认号ack = y+1,而自己的序号seq = x+1。TCP的标准规定,ACK报文段可以携带数据。但如果不携带数据则不消耗序号。在这种情况下,下一个数据报文段的序号仍是seq=x+1.这时TCP连接已经建立,A进入ESABLISHED(已建立连接)状态。
四.浏览器与服务器进行数据传输
浏览器向服务器发送http的请求报文,浏览器从服务器读取响应报文,然后浏览器关闭连接。
四次挥手详解
- 第一次挥手:A的应用进程先向其TCP发出连接释放报文段,并停止再发送数据,主动关闭TCP连接(注意此时关闭的是与自己客户端的连接)。FIN置1,序号seq=u,它等于前面已传送过的数据的最后一个字节的序号加1。这时A进入FIN-WAIT-1(终止等待1)状态,等待B的确认。请注意,TCP规定,FIN报文段即使不携带数据,它也会消耗掉一个序号。(与SYN相同)
- 第二次挥手:B收到连接释放报文段即发出确认。确认号是ack=u+1。而这个报文段自己的序号是v,等于B前面已传送过的数据的最后一个字节的序号加1.然后B就进入CLOSE-WAIT(关闭等待)状态。TCP服务器进程这时应通知高层应用进程,因而从A到B这个方向的连接就释放了,这时TCP连接处于半关闭状态。即A已经没有数据要发送了,但B若发送数据,A仍然需要接收。也就是说,从B到A这个方向的连接并未关闭。
- 第三次挥手:A收到来自B的确认后,就进入FIN-WAIT2(终止等待2)状态,等待B发出的连接释放报文段。若B已经没有要向A发送的数据,其应用进程就通知TCP释放连接。这时B发出的连接释放报文段必须FIN=1。现假定B的序号为w(在半关闭状态下B可能又发送了一些数据,因此与v有一定距离)。B还必须重复上次已发送过的确认号ack=u+1.这时B就进入LAST-ACK(最后确认)状态,等待A的确认。
- 第四次挥手:A在收到B的连接释放报文段后,必须对此发出确认。在确认报文段中把ACK置1,确认号为ack=w+1,而自己的序号是seq=u+1(根据TCP标准,前面发送过的FIN报文段要消耗一个序号)。然后进入到TIME-WAIT(时间等待)状态。现在TCP还没有释放掉。必须经过时间等待计时器设置的时间2MSL后,A才能进入到CLOSED状态。时间MSL叫做最长报文段寿命。
五.浏览器渲染页面
客户端拿到服务器端传输来的文件,找到HTML和MIME文件,通过MIME文件,浏览器知道要用页面渲染引擎来处理HTML文件。
1.浏览器会解析html源码,然后创建一个 DOM树。
在DOM树中,每一个HTML标签都有一个对应的节点,并且每一个文本也都会有一个对应的文本节点。
2.浏览器解析CSS代码,计算出最终的样式数据,形成css对象模型CSSOM。
首先会忽略非法的CSS代码,之后按照浏览器默认设置——用户设置——外链样式——内联样式——HTML中的style样式顺序进行渲染。
3.利用DOM和CSSOM构建一个渲染树(rendering tree)。
渲染树和DOM树有点像,但是是有区别的。
DOM树完全和html标签一一对应,但是渲染树会忽略掉不需要渲染的元素,比如head、display:none的元素等。
而且一大段文本中的每一个行在渲染树中都是独立的一个节点。
渲染树中的每一个节点都存储有对应的css属性。
4.浏览器就根据渲染树直接把页面绘制到屏幕上。
参考:https://blog.csdn.net/weixin_43814020/article/details/104215281