细说浏览器输入URL后发生了什么

一、DNS域名解析:找到域名对应的IP关系,拿到服务器IP

         我们在浏览器输入网址,其实就是要向服务器请求我们想要的页面内容,所有浏览器首先要确认的是域名所对应的服务器在哪里。将域名解析成对应的服务器IP地址这项工作,是由DNS服务器来完成的。

       客户端收到你输入的域名地址后,它首先去查找缓存,检查在该文件中是否有相应的域名、IP对应关系如果有,则向其IP地址发送请求,如果没有,再去找DNS服务器。一般用户很少去编辑修改hosts文件。

二、建立TCP链接

          费了一顿周折终于拿到服务器IP了,下一步自然就是链接到该服务器。对于客户端与服务器的TCP链接,必然要说的就是『三次握手』。

三次握手:https://zhuanlan.zhihu.com/p/53374516

       换个易于理解的视角来看为什么要3次握手。

     客户端和服务端通信前要进行连接,“3次握手”的作用就是双方都能明确自己和对方的收、发能力是正常的

  第一次握手:客户端发送网络包,服务端收到了。这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。

  第二次握手:服务端发包,客户端收到了。这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。 从客户端的视角来看,我接到了服务端发送过来的响应数据包,说明服务端接收到了我在第一次握手时发送的网络包,并且成功发送了响应数据包,这就说明,服务端的接收、发送能力正常。而另一方面,我收到了服务端的响应数据包,说明我第一次发送的网络包成功到达服务端,这样,我自己的发送和接收能力也是正常的。

  第三次握手:客户端发包,服务端收到了。这样服务端就能得出结论:客户端的接收、发送能力,服务端的发送、接收能力是正常的。 第一、二次握手后,服务端并不知道客户端的接收能力以及自己的发送能力是否正常。而在第三次握手时,服务端收到了客户端对第二次握手作的回应。从服务端的角度,我在第二次握手时的响应数据发送出去了,客户端接收到了。所以,我的发送能力是正常的。而客户端的接收能力也是正常的。

三、发送HTTP请求

        与服务器建立了连接后,就可以向服务器发起请求了。

四、服务器处理请求、返回响应结果

         服务器端收到请求后的由web服务器(准确说应该是http服务器)处理请求,诸如Apache、Ngnix、IIS等。web服务器解析用户请求,知道 了需要调度哪些资源文件,再通过相应的这些资源文件处理用户请求和参数,并调用数据库信息,最后将结果通过web服务器返回给浏览器客户端。

       在HTTP里,有请求就会有响应,哪怕是错误信息。

五、关闭TCP连接

       关闭TCP连接,需要4次挥手:https://blog.csdn.net/smileiam/article/details/78226816

     由于TCP连接是全双工的,因此每个方向都必须单独进行关闭。这原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
TCP协议的连接是全双工连接,一个TCP连接存在双向的读写通道。 
简单说来是 “先关读,后关写”,一共需要四个阶段。以客户机发起关闭连接为例:
1、服务器读通道关闭
2、客户机写通道关闭
3、客户机读通道关闭
4、服务器写通道关闭
       关闭行为是在发起方数据发送完毕之后,给对方发出一个FIN(finish)数据段。直到接收到对方发送的FIN,且对方收到了接收确认ACK之后,双方的数据通信完全结束,过程中每次接收都需要返回确认数据段ACK。
详细过程:
 第一阶段 客户机发送完数据之后,向服务器发送一个FIN数据段,序列号为i
      1、服务器收到FIN(i)后,返回确认段ACK,序列号为i+1关闭服务器读通道
      2、客户机收到ACK(i+1)后,关闭客户机写通道
(此时,客户机仍能通过读通道读取服务器的数据,服务器仍能通过写通道写数据)
第二阶段 服务器发送完数据之后,向客户机发送一个FIN数据段,序列号为j;
    3、客户机收到FIN(j)后,返回确认段ACK,序列号为j+1关闭客户机读通道
    4、服务器收到ACK(j+1)后,关闭服务器写通道
     这是标准的TCP关闭两个阶段,服务器和客户机都可以发起关闭,完全对称。
     FIN标识是通过发送最后一块数据时设置的,标准的例子中,服务器还在发送数据,所以要等到发送完的时候,设置FIN(此时可称为TCP连接处于半关闭状态,因为数据仍可从被动关闭一方向主动关闭方传送)。如果在服务器收到FIN(i)时,已经没有数据需要发送,可以在返回ACK(i+1)的时候就设置FIN(j)标识,这样就相当于可以合并第二步和第三步。读《Linux网络编程》关闭TCP连接章节,作以下笔记

六、浏览器解析HTML、浏览器布局渲染

      浏览器接收到来自服务器的响应资源后,会对资源进行分析。

      浏览器通过解析HTML,生成DOM树,解析CSS,生成CSS规则树,然后通过DOM树和CSS规则树生成渲染树。渲染树与DOM树不同,渲染树中并没有head、display为none等不必显示的节点。

      要注意的是,浏览器的解析过程并非是串连进行的,比如在解析CSS的同时,可以继续加载解析HTML,但在解析执行JS脚本时,会停止解析后续HTML,这就会出现阻塞问题,关于JS阻塞相关问题,这里不过多阐述。

     根据渲染树布局,计算CSS样式,即每个节点在页面中的大小和位置等几何信息。HTML默认是流式布局的,CSS和js会打破这种布局,改变DOM的外观样式以及大小和位置。这时就要提到两个重要概念:replaint和reflow。

replaint:屏幕的一部分重画,不影响整体布局,比如某个CSS的背景色变了,但元素的几何尺寸和位置不变。

reflow: 意味着元件的几何尺寸变了,我们需要重新验证并计算渲染树。是渲染树的一部分或全部发生了变化。这就是Reflow,或是Layout。
    所以我们应该尽量减少reflow和replaint,我想这也是为什么现在很少有用table布局的原因之一。

    最后浏览器绘制各个节点,将页面展示给用户。

 

参考文章:https://segmentfault.com/a/1190000012092552

                  https://mp.weixin.qq.com/s?__biz=MzA3ODQ0Mzg2OA==&mid=2649050329&idx=2&sn=510bd269e93ebd92246e3f8efd742d18&chksm=875348eab024c1fc84023ba89a8657d86b1da76dd32a15f948d3f91f72563d8f8451f6eac0fb&mpshare=1&scene=1&srcid=&sharer_sharetime=1569151909507&sharer_shareid=8f1fed8ae3c7db1ac6c70331c43bf575&key=0e97a3aed232b8eba8cf3b89a7e482c9273b20422952100fc901d29cce21fa20d2ffece4a949038157ac4611241454639cc4130fb36c2a2129b312fbc28f4efb4bff9b1bc0b3511c390454ba7c96bc5d&ascene=1&uin=MzE0MzAzMTE2Mg%3D%3D&devicetype=Windows+10&version=62060833&lang=zh_CN&pass_ticket=navDbPhDCtiQsELWUqf1XuoCnZO5YKdr%2FxHgsnTjSf5oHHPfmdkDeJFqah20r%2BMY

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值