tcp3次握手4次挥手分析

一.三次握手

在这里插入图片描述
流程

  1. client发送syn
  2. server发送syn,ack
  3. client发送ack

问题

  1. 为什么需要三次握手,两次不行吗?

需要三次握手的目的是为了减少服务端资源浪费,开启无用的连接,假设只有1,2两步,则会出现如下问题

  1. 如果2丢失,那么server会建立无用的连接,其实client根本没有收到ack
  2. 由于网络原因,client发送的syn,server没有收到,client以为超时了,会重新连接,过了一会后,之前发送的syn又被server收到了,server会建立无用的连接

总之,如果是两次握手,会出现server认为已经建立连接了,但是client却不知道,也不会使用;如果是三次,则上面的问题都不会出现

二.四次挥手

在这里插入图片描述
流程

  1. client发送fin
  2. server发送ack
  3. server发送fin,ack
  4. client发送ack

问题

1. 为什么握手是三次,挥手是四次?

握手的第二次,发生了syn和ack,二挥手的第二次只发送了ack,为什么?连接建立建立时,server不需要做什么准备,可以直接返回syn和ack,而释放连接时,server收到fin后,有可能还有数据要处理,所以先发送ack,等处理完数据了,再发送fin,ack

2. 为什么客户端在TIME-WAIT阶段要等2MSL?

为的是确认服务器端是否收到客户端发出的ACK确认报文;
当客户端发出最后的ACK确认报文时,并不能确定服务器端能够收到该段报文。所以客户端在发送完ACK确认报文之后,会设置一个时长为2MSL的计时器。MSL指的是Maximum Segment Lifetime:一段TCP报文在传输过程中的最大生命周期。2MSL即是服务器端发出为FIN报文和客户端发出的ACK确认报文所能保持有效的最大时长。
服务器端在1MSL内没有收到客户端发出的ACK确认报文,就会再次向客户端发出FIN报文;
如果客户端在2MSL内,再次收到了来自服务器端的FIN报文,说明服务器端由于各种原因没有接收到客户端发出的ACK确认报文。客户端再次向服务器端发出ACK确认报文,计时器重置,重新开始2MSL的计时;
否则客户端在2MSL内没有再次收到来自服务器端的FIN报文,说明服务器端正常接收了ACK确认报文,客户端可以进入CLOSED阶段,完成“四次挥手”。

所以,客户端要经历时长为2SML的TIME-WAIT阶段;这也是为什么客户端比服务器端晚进入CLOSED阶段的原因

三.参考网址

https://baijiahao.baidu.com/s?id=1654225744653405133&wfr=spider&for=pc

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章