欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

转:从输入url到显示网页发生了什么

程序员文章站 2022-04-14 17:02:28
互联网内各网络设备间的通信都遵循TCP/IP协议,利用TCP/IP协议族进行网络通信时,会通过分层顺序与对方进行通信。分层由高到低分别为:应用层、传输层、网络层、数据链路层。发送端从应用层往下走,接收端从数据链路层网上走 ......

在浏览器中输入url到显示网页主要包含两个部分: 网络通信页面渲染
互联网内各网络设备间的通信都遵循tcp/ip协议,利用tcp/ip协议族进行网络通信时,会通过分层顺序与对方进行通信。分层由高到低分别为:应用层、传输层、网络层、数据链路层。发送端从应用层往下走,接收端从数据链路层网上走

1.浏览器的地址栏输入url并按下回车

我们常见的rul是这样的:,域名通常由3部分组成:协议 域名 端口号

  1. 协议:主要是http协议https协议,ftp协议,file协议
  2. 域名:url中间部分为域名或者ip
  3. 端口号:通常默认都是隐藏的 http默认端口号为80 https默认端口号为443

涉及知识点: 跨域
在前端进行数据请求时,由于浏览器的同源策略,协议,域名,端口号有一个不同会存在跨域请求,需要进行跨域处理,相关的跨域方法点击

2.dns域名解析

互联网上每一台计算机的唯一标识是它的ip地址,但是ip地址并不方便记忆。用户更喜欢用方便记忆的网址去寻找互联网上的其它计算机,也就是上面提到的百度的网址。所以互联网设计者需要在用户的方便性与可用性方面做一个权衡,这个权衡就是一个网址到ip地址的转换,这个过程就是dns解析,即实现了网址到ip地址的转换

解析过程

dns解析是一个递归查询的过程。

转:从输入url到显示网页发生了什么
上述图片是查找www.google.com的ip地址过程。首先在本地域名服务器中查询ip地址,如果没有找到的情况下,本地域名服务器会向根域名服务器发送一个请求,如果根域名服务器也不存在该域名时,本地域名会向com*域名服务器发送一个请求,依次类推下去。直到最后本地域名服务器得到google的ip地址并把它缓存到本地,供下次查询使用。从上述过程中,可以看出网址的解析是一个从右向左的过程: com -> -> 。但是你是否发现少了点什么,根域名服务器的解析过程呢?事实上,.,并不是我多打了一个.,这个.对应的就是根域名服务器,默认情况下所有的网址的最后一位都是.,既然是默认情况下,为了方便用户,通常都会省略,浏览器在请求dns的时候会自动加上,所有网址真正的解析过程为: . -> .com -> . -> .。

 

dns优化

dns缓存和dns负载均衡

dns缓存

dns存在着多级缓存,从离浏览器的距离排序的话,有以下几种: 浏览器缓存,系统缓存,路由器缓存,ips服务器缓存,根域名服务器缓存,*域名服务器缓存,主域名服务器缓存。

  1. 在你的chrome浏览器中输入:chrome://dns/,你可以看到chrome浏览器的dns缓存。

  2. 系统缓存主要存在/etc/hosts(linux系统)中:

    转:从输入url到显示网页发生了什么

     

dns负载均衡

真实的互联网世界背后存在成千上百台服务器,大型的网站甚至更多。但是在用户的眼中,它需要的只是处理他的请求,哪台机器处理请求并不重要。dns可以返回一个合适的机器的ip给用户,例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等,这种过程就是dns负载均衡,又叫做dns重定向

3.建立tcp连接

在通过dns域名解析后,获取到了服务器的ip地址,在获取到ip地址后,便会开始建立一次连接,这是由tcp协议完成的,主要通过三次握手进行连接。

  1. 第一次握手: 建立连接时,客户端发送syn包(syn=j)到服务器,并进入syn_sent状态,等待服务器确认;
  2. 第二次握手: 服务器收到syn包,必须确认客户的syn(ack=j+1),同时自己也发送一个syn包(syn=k),即syn+ack包,此时服务器进入syn_recv状态;
  3. 第三次握手: 客户端收到服务器的syn+ack包,向服务器发送确认包ack(ack=k+1),此包发送完毕,客户端和服务器进入established(tcp连接成功)状态,完成三次握手。 这里需要了解下ack,syn的意义
    转:从输入url到显示网页发生了什么
    完成tcp连接后开使向服务器进行请求

4.向服务器发送请求

完整的http请求包含请求起始行请求头部请求主体三部分。

转:从输入url到显示网页发生了什么

 

5.服务器接受响应

服务器在收到浏览器发送的http请求之后,会将收到的http报文封装成http的request对象,并通过不同的web服务器进行处理,处理完的结果以http的response对象返回,主要包括状态码响应头响应报文三个部分。
状态码主要包括以下部分:

1xx:指示信息–表示请求已接收,继续处理。
2xx:成功–表示请求已被成功接收、理解、接受。
3xx:重定向–要完成请求必须进行更进一步的操作。
4xx:客户端错误–请求有语法错误或请求无法实现。
5xx:服务器端错误–服务器未能实现合法的请求。

响应头主要由cache-control、 connection、date、pragma等组成。
响应体为服务器返回给浏览器的信息,主要由html,css,js,图片文件组成。

6.页面渲染

 如果说响应的内容是html文档的话,就需要浏览器进行解析渲染呈现给用户。整个过程涉及两个方面:解析渲染。在渲染页面之前,需要构建dom树和cssom树。  在浏览器还没接收到完整的 html 文件时,它就开始渲染页面了,在遇到外部链入的脚本标签或样式标签或图片时,会再次发送 http 请求重复上述的步骤。在收到 css 文件后会对已经渲染的页面重新渲染,加入它们应有的样式,图片文件加载完立刻显示在相应位置。在这一过程中可能会触发页面的重绘或重排。这里就涉及了两个重要概念:reflowrepaint

转:从输入url到显示网页发生了什么

 

  1. reflow,也称作layout,中文叫回流,一般意味着元素的内容、结构、位置或尺寸发生了变化,需要重新计算样式和渲染树,这个过程称为reflow。
  2. repaint,中文重绘,意味着元素发生的改变只是影响了元素的一些外观之类的时候(例如,背景色,边框颜色,文字颜色等),此时只需要应用新样式绘制这个元素就ok了,这个过程称为repaint。

所以说reflow的成本比repaint的成本高得多的多。dom树里的每个结点都会有reflow方法,一个结点的reflow很有可能导致子结点,甚至父点以及同级结点的reflow。

7.关闭tcp连接或继续保持连接

通过四次挥手关闭连接(fin ack, ack, fin ack, ack)。

转:从输入url到显示网页发生了什么

 

  1. 第一次挥手:client发送一个fin,用来关闭client到server的数据传送,client进入fin_wait_1状态。
  2. 第二次挥手:server收到fin后,发送一个ack给client,确认序号为收到序号+1(与syn相同,一个fin占用一个序号),server进入close_wait状态。
  3. 第三次挥手:server发送一个fin,用来关闭server到client的数据传送,server进入last_ack状态。
  4. 第四次挥手:client收到fin后,client进入time_wait状态,接着发送一个ack给server,确认序号为收到序号+1,server进入closed状态,完成四次挥手。

作者:rosenwang
链接:https://juejin.im/post/5bf23afa6fb9a049be5d1494
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。