TCP连接释放--四报文挥手

目录

 

一、TCP四次挥手:

二、为什么要经过2MSL时间而不直接进入关闭状态呢?


一、TCP四次挥手:

传输结束后,TCP通信的双方都可以释放连接,现在主机A中的TCP客户进程和主机B中的TCP服务器进程都处于连接已建立状态。


假设主机A中的应用进程通知其TCP释放连接(主动关闭),TCP客户进程发送TCP连接释放报文段,并进入终止等待1状态,该报文段的首部终止位为1(FIN=1),确认位(ACK=1)表明这是一个TCP连接释放报文段,序号seq的值为u(它等于之前发送的报文最后一个字节的序号加一)。(TCP规定FIN设置为1的报文段即使不携带数据也要消耗掉一个序号),确认号ack的值为v(它等于TCP客户进程之前已收到的最后一个字节的序号加一)。


主机B 收到TCP客户端发送的TCP连接释放报文段后发送了一个TCP确认报文段,并处于关闭等待状态。该报文段的首部位ACK设置为1,表明这个是一个普通的ACK确认报文段,序号seq设置为v(TCP服务器进程之前已传送过的最后一个字节的序号位+1,也与之前TCP服务器端收到的确认号匹配),确认号ack字段设置为u+1(这是对TCP连接释放报文段的确认)。

这时TCP服务器进程通知应用进程此时TCP客户进程要断开与自己的连接,此时从TCP客户进程到TCP服务器进程这个进程之间的连接就释放了。此时TCP的连接属于半关闭状态,TCP服务器进程已没有数据要发送。


如果此时TCP服务器进程仍有数据要发送,那么TCP客户进程会进行数据的接收,此时TCP客户端处于终止等待2状态,如果TCP服务器进程没有数据要发送,那么其发送TCP连接释放报文段并进入最后确认状态。TCP连接释放报文段的终止位FIN设置为1,ACK设置为1,表明这是一个TCP连接释放报文段,并对之前收到的报文段进行确认。TCP连接释放报文段的seq值为w(可能由于TCP服务器又发送了一些数据),ack设置为u+1(是对TCP连接释放报文的序号进行确认)。

 主机A中的TCP客户进程根据主机B的TCP服务端进程发送的TCP连接释放报文段,发送一个TCP确认报文段,并处于时间等待状态。确认位ACK的值设置为1,seq的值设置为u+1(因为TCP连接释放的序号值为u虽然不携带数据但是要消耗掉一个序号),确认号ack的值设置为w+1,这是对所收到的TCP连接释放的确认。


主机B收到主机A的TCP确认报文后处于关闭状态,而主机A中的客户进程还要经过两倍的MSL后才能进入关闭状态。 MSL:最长报文段寿命。


 二、为什么要经过2MSL时间而不直接进入关闭状态呢?

这是因为如果直接进入关闭状态,而TCP客户端发送的TCP确认报文段进行了丢失,那么TCP服务器端就接收不到最后的TCP确认报文段,TCP服务器端就会一直重传TCP连接释放但此时的TCP客户端已经处于关闭状态,就会对TCP服务器端发送的TCP连接释放不理睬,那TCP服务器端就会一直发送TCP连接释放,最终造成资源的浪费。


资料参考: 湖科大教书匠

猜你喜欢

转载自blog.csdn.net/weixin_43690348/article/details/112749306
今日推荐