访问url流程及原理 + 三次握手 + 四次挥手

1、在浏览器地址栏输入url后,先将url解析成ip地址,先查找缓存(浏览器本地缓存,系统缓存,路由器等中间缓存,域名服务器),通过dns查询将url域名转换为对应的IP地址;
2、找到服务器的IP地址后,客户端发送请求,通过三次握手建立tcp连接,浏览器在建立好的tcp连接上发送http请求到服务端;
3、服务端处理请求,并发送响应到浏览器端,四次挥手断开连接;
4、浏览器接收到响应数据(html,css,js,图片等),解析文件;
5、解析html文件时,首先将接收到的数据按照编码方式转化为单个字符,再通过浏览器规范将单个字符组合成对应的标记,然后根据规范将标记转化为包含对应属性的对象————dom节点,然后形成dom树
6、在解析html文件时,会遇到<link>和<script>标签外链,样式文件和脚本文件,其中css文件的加载不会阻塞dom树的构建,但会阻塞render树的构建;脚本文件在加载后会立即执行,并且加载和执行的过程都会阻塞dom树的构建。这里还有一点就是css文件的加载会阻塞脚本文件的执行,因为脚本文件可能会依赖css文件。
7、加载好的css文件会按照类似的解析规则生成对应的css规则树,与dom树一起合并成render树,然后进行layout布局,再经过paint绘制,最后将页面呈现到浏览器内;
8、渲染render树时,首先计算好页面元素的占据空间信息和位置信息(回流),然后计算其背景色,字体颜色,边框颜色等外观信息(重绘),将所有元素都进行合成到一个复合图层上去,交给GPU进行渲染,最终呈现到浏览器中。
渲染

查找缓存 & DNS(域名系统)解析

DNS解析就是将域名转化为IP地址的过程
在这里插入图片描述

查找缓存

1、先在浏览器缓存里寻找DNS记录(域名对应的IP地址)。谷歌浏览器能够缓存1000条DNS记录,缓存的时间是1分钟
2、接着在host文件和系统缓存里寻找。
3、找一下路由器缓存:路由器缓存路由器映射表;
4、查找本地DNS服务器,ISP的DNS服务器:ISP(Internet Service Provider),是互联网服务提供商的简称。ISP有专门的DNS服务器对应DNS查询请求。;
5、本地DNS服务器都没有的话向域服务器发送请求,没找到的话递归到下一级的域服务器继续查找(域服务器递归寻找)。直到找到返回;

DNS解析域名并缓存

浏览器发起一个DNS的系统调用(向本体主控DNS服务器发起域名解析请求,一般是宽带运营商提供的);
(1)、宽带运营商服务器查找自身缓存;
(2)、运营商服务器(代替浏览器)发起一个迭代的DNS解析的请求;
在这里插入图片描述
在这里插入图片描述
运营商服务器把结果返回操作系统内核,同时缓存起来;(这个缓存可能会失效,根据时间长短)
操作系统内核把结果返回给浏览器;
最终浏览器拿到了www.imooc.com对应的IP地址,并缓存;

DNS的解析原理:

在这里插入图片描述
1)系统首先会查找本地的DNS缓存和hosts文件信息,确认其中是否有与,域名www.baidu.com所对应的IP地址。如果有,就直接访问这个IP地址所对应的www.baidu.com域名服务器。

2)如果没有找到,那么,系统将会把浏览器的解析请求发送给本地主机所指定的DNS服务器,称为LDNS。如果LDNS服务器中有域名www.baidu.com所对应的IP地址,则返回给客户端的浏览器,如果没有,则继续请求其他DNS服务器。

3)LDNS服务器会从DNS系统的根(.)开始请求对域名www.baidu.com的解析。根DNS服务器全球只有13台,根域名服务器是没有域名www.baidu.com解析记录的。但是它会有域名www.baidu.com所对应的顶级域.com的解析记录,因此直接把顶级域.com所对应的DNS地址返回给LDNS服务器。

4)LDNS服务器获取到顶级域.com对应的DNS服务器地址后,就会去.com服务器请求对www.baidu.com域名的解析。在顶级域名服务器也不会有www.baidu.com的解析记录的。但是它有www.baidu.com的父级域名的解析记录,即baidu.com。因此顶级域名.com服务器又会把baidu.com所对应的DNS服务器的IP地址返回给LDNS。

5)LDNS服务器收到baidu.com所对应的IP地址后,就会去baidu.com域名服务器请求对www.baidu.com的域名解析。Baidu.com域名对应的DNS服务器是该域名的授权DNS服务器。这个DNS服务器就是企业购买域名时用于管理解析的服务器。

6)baidu.com域名DNS服务器会吧www.baidu.com域名所对应的IP地址给解析出来,然后发给LDNS。

7)LDNS把解析出来的结果,www.baudu.com所对应的IP地址发送给客户端的浏览器。并且LDNS也会将其域名和对应的地址缓存到cache中。

8)客户端浏览器收到后,也会将其域名以及对应的IP地址缓存的到DNS缓存和hosts文件中。

TCP三次握手

得到ip地址后,浏览器通过ip地址找到服务器,并通过三次握手建立tcp连接。
TCP连接,全名Transmission Control Protocol,传输控制协议。是一种面向连接确保数据在端之间可靠传输的协议

浏览器以一随机端口向服务器的web程序发起TCP连接请求;通过层层路由设备,还可能要经过防火墙的过滤;到达到服务器端以后,进入网卡,然后进入到TCP/IP协议栈;然后建立起TCP/IP的链接;

TCP/IP 定义了电子设备如何连入因特网,以及数据如何在它们之间传输的标准。协议采用了4层的层级结构,每一层都呼叫它的下一层所提供的协议来完成自己的需求。通俗而言:TCP负责发现传输的问题,一有问题就发出信号,要求重新传输,直到所有数据安全正确地传输到目的地。而IP是给因特网的每一台联网设备规定一个地址。

浏览器需要和服务器进行三次握手才能建立连接
在这里插入图片描述1、客户端首先向服务器发送一个带有SYN标识和一个seq的随机数;
2、服务端收到后,需要给客户端回应一个ack,ack的值就是刚才的seq随机数的值+1,在回应包里,还包含一个SYN的标识和一个seq随机数。
3、客户端收到服务端发过来的回应包之后,再给服务端发送一个ack, ack的值就是刚才服务端发过来的seq的值+1。
在这里插入图片描述
①浏览器向服务器发送一个报文,报文里标志位是SYN,被置为1,表示希望建立连接,序列号seq为x,
②服务器收到数据包后,知道浏览器希望建立连接,返回一个SYN为1,ACK为1,序列号seq为y,确认序列号ack为x+1的报文
③浏览器收到报文后,知道服务器确认收到报文,于是对服务器的响应进行确认,发送一个ACK为1,序列号seq为x+1,确认序列号ack为y+1的报文。

ACK:响应标识,1表示响应,连接建立成功之后,所有报文段ACK的值都为1
SYN:连接标识,1表示建立连接,连接请求和连接接受报文段SYN=1,其他情况都是0;
FIN:关闭连接标识,1标识关闭连接,关闭请求和关闭接受报文段FIN=1,其他情况都是0,跟SYN类似;
seq number:序号,一个随机数X,请求报文段中会有该字段,响应报文段没有;
ack number:应答号,值为请求seq+1,即X+1,除了连接请求和连接接受响应报文段没有该字段,其他的报文段都有该字段;

三次握手的目的是为了信息对等和防止超时。

信息对等:
三次握手确保两台计算机成功建立连接确认自己和对方能够发送和接收请求

防止超时:
如果只有两次握手,那么假设A机器第一次握手请求超时,然后重新发送请求,这时B机器收到重新发送的那个请求,然后返回报文,AB两次握手建立连接。假设这时A机器第一次的报文终于到达B机器了,然后B机器收到后又发送报文给A,那么又建立起连接。这时AB之间有两个连接,脏连接建立
如果是三次握手,那么B机器返回的报文给A,A因为不是SYN_SENT状态,会直接丢弃。

浏览器发送Http请求

1)请求行
作用:用来说明客户端想要做什么。
内容:包括方法字段、请求地址以及HTTP协议版本
2)请求头
作用:通过客户端把请求的相关信息发给服务器
内容:包括媒体类型、语言类型、支持压缩、客户端类型、主机等信息。
3)空行
作用:告诉服务器空行以下内容不属于请求头部信息。
4)请求报文主体
作用:用来说明客户端具体想要做的事情。
内容:查看信息、应用post方法。

服务器返回Http响应

1)状态行
作用:用来说明服务端响应客户端的状态。
内容:包括洗衣及版本号、数字状态码、状态情况
2)响应头
作用:通过服务端把响应的相关信息给客户端
内容:包括Location、server、connect、vary等
3)空行
作用:告诉客户端空行以下内容不属于响应头部信息。
4)响应报文主体
作用:用来装载着要返回给客户端的数据
内容:包括文本、html、视频或者是图片。

浏览器根据响应进行解析渲染,呈现给用户

四次挥手:浏览器关闭TCP连接

在这里插入图片描述
①:浏览器向服务器发送FiN为1的报文,表示想要关闭连接,同时序列号seq为x
②:服务器收到报文后,知道浏览器想要关闭连接,返回一个ACK为1,表示确认收到,序列号req为y,确认序列号ack为x+1的报文。
服务器发完ACK报文后,做好释放连接的准备
③:服务器再发送一个标志位ACK和FIN为1,表示已经准备好释放连接,序列号seq为z,确认序列号为ack为x+1的报文
④:浏览器收到收,知道服务器已经做好全部的准备,就发送一个ACK为1,表示确认收到,序列号seq为x+1,确认序列号ack为z+1的报文。
在这里插入图片描述
四次挥手过程:
1)第一次挥手:客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送。
2)第二次挥手:服务器B收到这个FIN,它发回一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
3)第三次挥手:服务器B关闭与客户端A的连接,发送一个FIN给客户端A。
4)第四次挥手:客户端A发回ACK报文确认,并将确认序号设置为收到序号加1。

为什么服务器在接到断开请求时不立即同意断开:当服务器收到断开连接的请求时,可能仍然有数据未发送完毕,所以服务器先发送确认信号,等所有数据发送完毕后再同意断开。

第四次握手后,主机发送确认信号后并没有立即断开连接,而是等待了 2 个报文传送周期,原因是:如果第四次握手的确认信息丢失,服务器将会重新发送第三次握手的断开连接的信号,而服务器发觉丢包与重新发送的断开连接到达主机的时间正好为 2 个报文传输周期。

1、为什么需要三次握手

目的:为了防止已失效的连接请求报文段 又传送到了服务端,因而产生错误。主要防止资源的浪费。

具体过程:
当客户端发出第一个连接请求报文段时并没有丢失,而是在某个网络节点出现了长时间的滞留,以至于延误了连接请求在某个时间之后才到达服务器。这应该是一个早已失效的报文段。但是服务器在收到此失效的连接请求报文段后,以为是客户端的一个新请求,于是就向客户端发出了确认报文段,同意建立连接。

假设不采用三次握手,那么只要服务器发出确认后,新的连接就可以建立了。由于客户端没有发出建立连接的请求,因此不会管服务器的确认,也不会向服务器发送数据,但服务器却以为新的运输连接已经建立,一直在等待,所以,服务器的资源就白白浪费掉了。

  • 如果在TCP第三次握手中的报文段丢失了会出现什么情况?
    客户端会认为此连接已建立,如果客户端向服务器发送数据,服务器将以RST包响应,这样就能感知到服务器的错误了。

2、为什么要四次挥手

防止“已失效的连接请求报文”出现在连接中,在释放连接的过程中会有一些无效的滞留报文,这些报文在经过2MSL的时间内就可以发送到目的地,不会滞留在网络中。这样就可以避免在下一个连接中出现上一个连接的滞留报文了。

具体过程:
关闭连接时,当服务器收到客户端的关闭连接(FIN报文)时,仅仅表示客户端不再发送数据,但还能接收数据;而且服务器未必将全部数据发送到客户端,所以不可以立即close;数据传输完成后,再发送断开连接(FIN报文)给客户端来表示同意现在关闭连接,客户端回应(ACK),完成四次握手;

为保证在最后断开时,客户端发送最后一个ACK报文段能够被服务器接收到。如果客户端在收到服务器给它的断开连接的请求之后,回应完服务器就直接断开连接的话,若服务器没有收到回应就无法进入CLOSE状态,所以客户端要等待两个最长报文段寿命的时间,以便于服务器没有收到请求之后重新发送请求。

  • 6
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值