请求流程

域名解析 -> TCP3次握手 -> 发起http请求 -> 服务器响应接受请求并传输数据 -> 浏览器解析并渲染数据,展示效果 -> TCP4次挥手

域名解析

当用户在浏览器输入网址域名的时候,比如 https://www.yuque.com/ 时,浏览器会对域名进行解析,得到对应的IP地址
获取对应的ip地址
1.先去本地的文件 hosts 中查找此FQDN(全限定域名,带主机www跟域名yuque.com的)有没有指向的IP地址条目,如果找到 ,就结束解析
2.如果没有,就回浏览器本身DNS缓存里寻找,如果找到 ,就结束解析
3.没有找到,会去本机配置的首选DNS服务器查询,一般这是三大运营商提供的,通过UTP53端口发起请求,这个请求时递归查询,DNS服务器收到请求后,会查询自身缓存,找到IP条目,并且没有过期的话,就会返回给用户,结束解析。如果没有找到,DNS服务器会去找根服务器,全球13个根服务器(跟服务器地址本地DNS服务器内置)轮训查找请求,最终找到负责的根服务器,拿到IP地址

TCP3次握手

浏览器拿到域名对应的IP后,会拿一个随机端口向WEB服务器程序80端口发起TCP请求连接
举个例子
A:你好我时A,能听到我说话吗
B: 能听到,你能听到我说话吗
A: 可以,能听到
过程是
第一次握手:建立连接,客户端将SYN标记为 1,sep标记为X,并将SYN包发送到服务器,并进入SUN_SEN状态,等待服务器确认
第二次握手:服务器收到SYN包,知道客户端要建立链接,同事也向客户端也发送一个SYN包(SYN=1)和一个ACK包(ACK=1)随机产生一个数sep=y,ack=X+1(客户端的sep值X加一),来确认客户端的SYN,并进入SYN_RECV
第三次握手:客户端收到服务器发来的SYN+ACK包后,确认ack值,并回复服务器的一个ack确认,发送完毕后,双方进入ESTABLISHED状态
三次握手成功后,开始传输数据,完成的三次握手也就是,请求——应答——再次确认

发起http请求

1.建立TCP连接:
接受或拒绝连接请求,发送请求报文
2.接受请求:
接受客户端发来的请求报文中的信息对某一资源的一次请求过程(什么单进程,多进程之类的处理)
3.处理请求:
服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理
4.访问资源:
服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或者动态运行后生成的资源
5.构建响应报文:
一旦Web服务器识别出了资源,就执行请求中描述的动作,并返回响应报文。响应报文中,包含有响应状态码,响应首部,如果生成了响应主体的话,还包括响应主体
6.发送响应报文:
向客户端回复报文
7.记录日志:
最后当事务结束时,web服务器会在日志文件中添加一个条目,来描述已执行的事务

TCP4次挥手

数据传输完毕后,双方都可释放连接,最开始的时候,客户端跟服务器都是连接状态,然后客户端主动关闭,服务器被动关闭
举个例子:
A:兄弟我这边完事了,
B:知道了,我看看我这还有没有事
B:我看了一下我这也没事了
A:ok收到,下班
第一次挥手
客户端发送一个FIN报文,报文中会指定一个序列号,此刻客户端处于FIN_WEIT1状态
发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入终止等待1状态,等待客户端的确认
第二次挥手:
服务端收到FIN之后,会发送ACK报文,且把客户端的序列号值加一最为ACK报文的序列号值,表明已经收到客户端的报文了,此刻服务端出去CLOSE_WAIT状态(此刻服务端还可以发送数据到客户端)
服务端收到连接释放的报文后立即发出确认报文(ACK=1,确认号ack=u+1,序号seq=v)服务端进去等待关闭状态,此刻的TCP处于半关闭的状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进屋终止等待2状态,等待服务段发出的连接释放报文段,
第三次挥手:
如果服务端也想断开连接了,和客户端的第一次挥手一样,发送FIN报文,且指定一个序列号,此刻服务端出于LAST_ACK状态
服务端没有要向客户端发出的数据了,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1)服务端进去最后确认状态,等待客户端的确认
第四次挥手:
客户端收到FIN之后,一样发送一个ACK报文最为应答,且把服务端的序列号值+1作为自己ACK报文的序列号值,此刻客户端处于TIME_WAIT状态,需要过一阵子以确保服务端收到自己的ACK报文之后才会进去CLOSED状态,服务端收到ACK报文之后,就处于关闭连接了,处于CLOSED状态
客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1.seq=u+1,ack=w+1),客户端进去时间等待状态,此刻TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才会进去关闭状态
收到一个FIN之意味着在这一方向上没有数据流动

为什么需要三次握手

为什么需要三次,两次不可以吗?
为了防止有些已经不用失效的连接再次请求,浪费资源,
比如第一次请求因为一些原因,堵塞了,或者没收到,又发送了一次,正常连接了,后来第一次的请求自己又突然进来了,如果不是三次而是两次的话,就会直接响应连接返回,其实已经不用了,造成资源浪费,所以需要三次握手,反复确认一下

为什么需要四次挥手

因为连接的时候SYN是用来同步的,ACK是用来应答的,连接的时候可以直接回复,关闭的时候,服务端不会立即关闭,只能先回复以ACK报文,说明收到了,需要等服务端所有报文都发送完了,才会发送FIN报文,所以需要四次挥手