DNS解析、三次握手,浏览器缓存机制、四次挥手

461 阅读6分钟

1、浏览器打开网页加载的流程

1、DNS解析获取资源所在服务器的IP地址

2、然后通过:TCP/IP 三次握手 建立TCP链接,发起http请求

3、浏览器请求下载html

4、解析html并渲染页面,如果有link 、script、img 标签,停止渲染,就继续下载这些资源文件,下载完之后继续渲染。

5、四次挥手 中断链接请求;

1、DNS解析的过程:

域名层次结构:

image.png

域名管理归属:

image.png

1-1: 客户端在浏览器访问www.baidu.com 的网站时,浏览器向本地DNS服务器,发起www.baidu.com 这个域名对应的IP地址的查询。如果本地DNS服务器存在该记录,就把IP地址返回给浏览器。如果没有,本地DNS服务器就向DNS根服务器发起查询请求;

1-2: 本地DNS服务器,向DNS根服务器发起查询www.baidu.com IP地址的请求,根DNS服务器把对应的顶级域名所在服务器地址A返回给本地DNS服务器;

1-3: 本地DNS服务器,根据地址A,继续向顶级DNS服务器发起查询www.baidu.com IP地址的请求;顶级DNS服务器把对应的二级域名所在服务器地址B返回给本地DNS服务器;

1-4: 本地DNS服务器,根据地址B,继续向二级DNS服务器发起查询www.baidu.com IP地址的请求,二级DNS服务器发现有这条记录,然后对应的IP地址,返回给本地DNS域名服务器。

1-5: 本地DNS服务器,拿到对应的IP之后返回给浏览器,并且把这个域名对应的IP保存起来。

c1a95c56ceb1a652fa01c63a39be2d1.png

2、三次握手的流程

所谓三次握手(Three-Way Handshake)即建立TCP连接,就是指建立一个TCP连接时,需要客户端和服务端总共发送3个数据包以确认连接的建立。 在socket编程中, 这一过程由客户端执行connect来触发,整个流程如下:

2-1 第一次握手:Client随机产生一个值J赋给标志位SYN(Synchronize Sequence Numbers:同步序列号),即SYN=j。并将该数据包发送给服务端,客户端进入SYN_SENT状态,等待Server确认。

2-2 第二次握手:Server收到数据包后知道Client请求建立连接,Server将标志位SYN随机产生一个值为k和ACK=j+1(ACK:确认字符Acknowledgement),并将该数据包发送给Client以确认连接请求,Server进入SYN_RCVD状态。

2-3 第三次握手:Client收到确认后,检查ack是否为J+1,如果正确则发送ack=K+1数据包发送给Server,Server检查ack是否为K+1,如果正确则连接建立成功,Client和Server进入ESTABLISHED状态,完成三次握手,随后Client与Server之间可以开始传输数据了。

bb0e3c6607f3787b9cf9b81f5725055.png

3、浏览器缓存机制

浏览缓存,是对第二次访问,或者刷新页面的场景:

浏览器缓存的目的:

1、减少服务器带宽消耗(用户节省流量);

2、减少服务器的压力;

3、提高页面渲染的速度。

3-1、浏览器请求静态资源时

以下说明都是针对有缓存的情况:

服务端在响应头返回的3个重要字段:

cache-control:

cache-control的取值: max-age/ (public/private)/immutable/no-cache/no-store max-age:是缓存的有效时间;

public:客户端和代理服务器都可以缓存该资源;

private:只让客户端可以缓存该资源;代理服务器不缓存;

immutable:在缓存有效的时间内,就算用户刷新页面,浏览器也不会发起请求去服务;

客户端第二次打开页面,在缓存的有效时间的期内,就直接读取缓存,statu code:200 ;

如果用户做了刷新操作,就向服务器发起http请求:statu code:304

如果用户强制刷新(清理了缓存,再请求),就和第一次打开一样,重新向服务器请求资源,除了设置为public或者immutable的资源

cache-control: no-cache 跳过本地缓存,每次都服务端请求,no-cache等同于max-age=0。

cache-control: no-store 不缓存,这个会让客户端、服务器都不缓存

ETag:(Entity Tag)实体唯一标签(资源唯一标签)

last-modified:资源最后修改时间

image.png

以下是第二次发起请求的流程:

image.png

4、关闭TCP链接的四次握手的流程

第1次握手:客户端接受数据完毕,向服务器发送关闭链接的数据包,FIN=1(finish),序列号seq=u; 此时客户端进入终止等待状态1(FIN-WAIT-1)

第2次握手:服务器收到关闭连接的数据包之后,给客户端发送确认接收数据包:ACK=1,ack=u+1(确认FIN),序列号seq=v;

此时:服务器进入关闭等待状态(close-wait),不接受客户端任何请求了,服务器同时检查一遍客户端需要的数据是不是真的发送完毕,

如果还有需要发送的数据,就继续给客户端发送,这时客户端仍然可以接受数据。

2-1:客户端收到服务器的确认包之后,客户端进入终止等待2状态(FIN-WAIT-2),这时如果服务器有数据发过来继续接收。

第3次握手:服务器确认数据发送完毕后,向客户端发送关闭连接的数据包,FIN=1, ACK=1,ack=u+1(确认上次数据包)序列号seq=w;

此时服务器进入等待确认关闭状态(last-ack)

第4次握手:客户端收到服务器关闭连接的数据报之后,向服务器发出确认数据包 ACK=1,ack=w+1(确认上次数据包),seq=u+1, 此时:客户端进入时间等待状态(Time-wait)

5、服务端收到客户端发送的确认数据包后断开TCP连接,

6、客户端等待时长为:2MSL Maximum Segment Lifetime MSL:的值根据不同的情况而不同,一般30s 60s 120s; 直到这个时间内没有收到服务器任何数据包,等待时间到了,客户端断开连接。

目的:保证客户端发送的最后一个确认关闭数据包,服务端可以收到。在这个时间内如果没有服务器没有收到确认的数据包。服务器会认为客户端没有收到第三次握手的数据包 ,此时就会重新向客户端发送一次。客户端收到之后,就发送第四次握手的数据包,并重置2MSL。

2709828aa8d5ebdfbe71b20251aed51.png