TCP四次挥手

 

  关于TCP要牢记TCP是面向连接的全双工的可靠的字符流协议,还有网络并不可靠,所以我们需要重传和ack机制,那我们就比较容易弄懂下面的两个问题。下面围绕着两个问题对四次的挥手的过程进行记忆和理解。

1、为什么握手是三次挥手是四次。

  理论上任何一端数据需要发送了都可以发起关闭请求,下面我们假设发起关闭请求是客户端,被动关闭的是服务端。为什么客户端没有数据需要处理了不可以立马关闭呢,要记住TCP是可靠的全双工通信协议,客户端没有数据需要做发送处理,不代表服务端就没有数据需要发送了,类比自然对话,A没有话要说,你可以说我的话已经全部说完了,选择闭嘴,但我们不能立马捂住耳朵,因为B还有话要说呢,想想如果A说完立马走了,相当不可靠。因为了为了让客户端知道服务端是收到关闭请求,所以服务端得立即ack,表示已经知道客户端的请求了,这也是可靠性的保证,凡发起请求必有ack。之后就是服务端发送完数据发起自己也想关闭连接,客户端对服务端发起ack,这样子就完成了四次挥手。

2、为什么客户端发起了ack之后,服务端可以立马关闭,而客户端则要等待2MSL,才能进入关闭状态呢。

  要理解这个问题,首先我们需要弄清楚什么叫MSL。MSL是Maximum Segment Lifetime的英文缩写,可译为“最长报文段寿命”,它是任何报文在网络上存在的最长的最长时间,超过这个时间报文将被丢弃,RFC793中规定MSL为2分钟。要记住TCP是可靠的协议,之所以要有2MSL的等待,是因为端口是可以复用的,保证服务器已经接收到来客户端的ack,然后正常关闭服务器测的连接,要不复用端口的时候会对新的连接造成干扰。为了更方便说明,我们先假设我们认同是2MSL是最保守可靠的方案,什么现象表明服务器已经接收到了ack了,一个方法是服务器对于ack进行ack,客户端就ack又ack,这样子就无限循环了。还有一种就是TCP之所以可靠是因为还有针对唯有ack的数据段会有重发机制。所以如果服务器没有关闭了没有再次发送FIN请求,我们就基本可以假定服务器已经收到了ack了,所以2MSL=FIN报文(来)+ack报文(去),当然也可以是2MSL=ack报文(去)+FIN报文(来),在2MSL的时间再也没有收到服务器的fIN请求,所以我们可以认为服务已经收到ack关闭连接了。

 

附上参考文章

https://blog.51cto.com/10706198/1775555

ttps://www.jianshu.com/p/9968b16b607e

https://www.zhihu.com/question/67013338
  1. 物理层(一层)PDU指数据位Bit)。
  2. 数据链路层(二层)PDU指数据帧Frame)。
  3. 网络层(三层)PDU指数据包Packet)。
  4. 传输层(四层)PDU指数据段Segment)。

  

 

posted on 2020-05-04 21:35  爱搁浅  阅读(166)  评论(0编辑  收藏  举报