输入地址
当我们开始在浏览器中输入网址www.baidu.com的时候,浏览器其实就已经在智能的匹配可能的url 了,他会从历史记录,书签等地方,找到已经输入的字符串可能对应的 url,然后给出智能提示,让你可以补全url地址。对于 google的chrome 的浏览器,他甚至会直接从缓存中把网页展示出来,就是说,你还没有按下 enter,页面就出来了。
浏览器查找域名的 IP 地址
1、请求一旦发起,浏览器首先要做的事情就是解析这个域名,一般来说,浏览器会首先查看本地硬盘的 hosts 文件,看看其中有没有和这个域名对应的规则,如果有的话就直接使用 hosts 文件里面的 ip 地址。
2、如果在本地的 hosts 文件没有能够找到对应的 ip 地址,浏览器会发出一个 DNS请求到本地DNS服务器(如果是首次,由于没有DNS服务器的MAC地址,所以只需要将数据发送给网关路由器192.168.1.1(通过ARP获取其MAC地址),他会想办法发给DNS服务器)。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。
3、查询你输入的网址的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果,此过程是递归的方式进行查询。如果没有,本地DNS服务器还要向DNS根域名服务器进行查询。
4、根域名DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到顶级域服务器上去继续查询,并给出顶级域服务器的地址。这种过程是迭代的过程。
5、本地DNS服务器继续向其他域名服务器发出请求,在这个例子中,请求的对象是.com域名服务器。.com域名服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。
6、最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址220.181.27.48对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。
网络部分
1、应用层DNS解析域名发起HTTP请求报文(域名 to IP)
通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话(HTTP请求包)到220.181.27.48。然后通过传输层(TCP进行封装数据包,输入到网络层)。
其中:http请求包括
请求行:GET/POST…,目标URL,HTTP 版本
请求头:客户端的Cookie和User-Agent就放在这里
请求体:比如客户端POST的数据就放在这里(对比:GET的数据放在请求行的URL里).
2、传输层TCP分割成报文段并加端口
在传输层(TCP 协议)把从应用层处收到的数据(HTTP 请求报文)进行分割(报文段),并在各个报文上打上标记序号及端口号后转发给网络层。
TCP协议为传输报文提供可靠的字节流服务。它为了方便传输,将大块的数据分割成以报文段为单位的数据包进行管理,并为它们编号,方便服务器接收时能准确地还原报文信息。把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用网络层的IP地址查找目的端。TCP协议通过“三次握手”等方法保证传输的安全可靠。
3、网络层查找MAC地址(路由器)(IP、ICMP、ARP、RARP)(IP to MAC)
IP协议的作用是把TCP分割好的各种数据包加上IP首部后传送给接收方。而要保证确实能传到接收方还需要接收方的MAC地址,也就是物理地址。IP地址和MAC地址是一一对应的关系。ARP协议可以将IP地址解析成对应的MAC地址。当通信的双方不在同一个局域网时,需要多次中转才能到达最终的目标,在中转的过程中需要通过下一个中转站(交换机)的MAC地址来搜索下一个中转目标。
4、网络接口层
在找到对方的MAC地址后,就将数据发送到数据链路层传输,由数据链路层的网桥、交换机根据mac地址进行端口转发,再由物理层的中继器、集线器进行信号传输放大等。这时,客户端发送请求的阶段结束
5、服务器接收数据
接收端的服务器在链路层接收到数据包,再层层向上直到应用层。这过程中包括在传输层通过TCP协议将分段的数据包重新组成原来的HTTP请求报文。
6、服务器响应请求,返回HTTP响应
服务接收到客户端发送的HTTP请求后,查找客户端请求的资源,并返回响应报文,响应报文中包括一个重要的信息——状态码。状态码由三位数字组成,其中比较常见的是200 OK表示请求成功。301表示永久重定向,即请求的资源已经永久转移到新的位置。在返回301状态码的同时,响应报文也会附带重定向的url,客户端接收到后将http请求的url做相应的改变再重新发送。404 not found 表示客户端请求的资源找不到。
其中:HTTP响应如下
响应行:HTTP版本,状态码,状态码描述
响应头:set-cookies,server信息
响应体:cookie,html,image,后端返回的请求数据等等
7、服务器返回相应文件
请求成功后,服务器会返回相应的HTML文件。接下来就到了页面的渲染阶段了。
四、浏览器方面:页面渲染,显示HTML
现代浏览器渲染页面的过程是这样的:
解析HTML以构建DOM树 –> 构建渲染树 –> 布局渲染树 –> 绘制渲染树。
DOM树是由HTML文件中的标签排列组成,渲染树是在DOM树中加入CSS或HTML中的style样式而形成。渲染树只包含需要显示在页面中的DOM元素,像<head>元素或display属性值为none的元素都不在渲染树中。
在浏览器还没接收到完整的HTML文件时,它就开始渲染页面了,在遇到外部链入的脚本标签或样式标签或图片js时,html文档会挂起渲染(加载解析渲染同步)的线程,不仅要等待文档中js文件加载完毕,还要等待解析执行完毕,才可以恢复html文档的渲染线程。会再次发送HTTP请求重复上述的步骤(有时候服务器会把可能客户端还需要的数据一起继续发送过来,客户端可以不用再次发送HTTP请求)。在收到CSS文件后会对已经渲染的页面重新渲染,加入它们应有的样式,图片文件加载完立刻显示在相应位置。在这一过程中可能会触发页面的重绘或重排。
原文:https://blog.csdn.net/qq_35642036/article/details/82788884