从url到网页打开的过程

758 阅读3分钟

这是我参与更文挑战的第14天,活动详情查看: 更文挑战

url => dns => ip => tcp(三次握手) => 拿到数据 => dom tree && cssom tree => render tree => layout => paint => tcp(四次挥手) => 结束请求

当浏览器输入url会先在dns服务器解析域名获取ip地址,然后浏览器会通过tcp协议向ip地址发送请求,tcp三次握手。

1171046-20190409190539159-883745097.png

  1. 浏览器像服务器发送报文SYN=1 Seq=X(我要向你发送请求了);
  2. 服务器像浏览器发送报文SYN=1 Ack=X+1 Seq=Y(好的,你发送吧,我准备好了)
  3. 浏览器像服务器发送报文Ack=Y+1 Seq=Z(好的,我发送请求)

请求成功,然后浏览器获取到前端资源,解析html生成dom树,解析css文件生成css树,dom树与css树构成render树, 然后layout计算节点的大小位置,然后paint通过计算好的大小位置,告知gpu渲染页面。

准备断开链接,最后tcp四次挥手。

1171046-20190409191208891-688664454.png

  1. 浏览器像服务器发送报文Fin=1 ACK=Z Seq=X(我准备关闭了)
  2. 服务器像浏览器发送报文ACK=X+1 Seq=Z(好的我收到了,我也准备关闭了)
  3. 服务器像浏览器发送报文Fin=1 ACK=X Seq=Y(你准备关闭吧)
  4. 浏览器像服务器发送报文ACK=Y Seq=X(好的,你也关闭吧)

那么我们第一步的dns域名解析是如何工作的呢?

  1. 发起请求后浏览器解析域名,首先它会查询本地的hosts文件,如果有和这个域名对应的规则,那么直接使用本地的hosts里的IP地址。如果本地没有则下一步。
  2. 浏览器会发出一个DNS请求到本地DNS(域名分布系统)服务器。本地DNS服务器一般都是你的网络接入服务器商提供。
  3. 查询你输入的网址的dns请求到本地dns服务器,查询是否有缓存记录,如果缓存中有此条记录,就可以直接返回结果,此过程是递归的方式进行查询。如果没有,本地DNS服务器还要向DNS根服务器进行查询。
  4. 根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。这种过程是迭代的过程
  5. 本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。
  6. 最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。