5.8.2 TCP的运输连接管理——TCP的连接释放.pdf

TCP的连接释放

  • TCP 连接释放过程比较复杂。
  • 数据传输结束后,通信的双方都可释放连接。
  • TCP 连接释放过程是四报文握手

    TCP通过“四报文挥手”来释放连接

  • TCP 连接的建立采用客户服务器方式

  • 主动发起连接建立的应用进程叫做TCP客户 (client)。
  • 被动等待连接建立的应用进程叫做TCP服务器 (server)。
  • 任何一方都可以在数据传送结束后发出连接释放的通知

过程
第一次挥手:
image.png

现在TCP客户进程和TCP服务器进程都处于连接已建立状态 TCP客户进程的应用进程通知其主动关闭TCP连接 TCP客户进程会发送TCP连接释放报文段,并进入终止等待1状态 TCP连接释放报文段首部中

  • 终止位FIN和确认为ACK的值都被设置为1表明这是一个TCP连接释放报文段,同时也对之前收到的报文段进行确认
  • 序号seq字段的值设置为u,它等于TCP客户进程之前已传送过的数据的最后一个字节的序号加1
  • 确认号ack字段的值设置为v,它等于TCP客户进程之前已收到的、数据的最后一个字节的序号加1

请注意:TCP规定终止位FIN等于1的报文段即使不携带数据,也要消耗掉一个序号

第二次挥手:
image.png

TCP服务器进程收到TCP连接释放报文段后,会发送一个普通的TCP确认报文段并进入关闭等待状态 普通的TCP确认报文段首部中

  • 确认位ACK的值被设置为1,表明这是一个普通的TCP确认报文段
  • 序号seq字段的值设置为v,它等于TCP服务器进程之前已传送过的数据的最后一个字节的序号加1,这也与之前收到的TCP连接释放报文段中的确认号匹配
  • 确认号ack字段的值设置为u+1,这是对TCP连接释放报文段的确认,也就是为发送方连接释放报文中的seq的值+1.

image.png

在进行第二次挥手后,会产生以下过程:

TCP服务器进程通知高层应用进程TCP客户进程要断开与自己的TCP连接,此时的TCP连接进入半关闭状态

所谓半关闭状态可以认为,此时客户端与服务器的连接不再传输数据,也就是客户端没有数据在发生。而此时服务器若有剩余数据要发送会继续发送。客户端到服务器这一信道关闭了,而服务器到客户端这一半没有关闭,因此称为半关闭状态

这个半关闭状态可能会持续一段时间,直到发送方没有数据进行发送。

image.png
在以上等待过程中,客户端会进入终止等待2状态

TCP客户进程收到TCP确认报文段后就进入终止等待2状态,等待TCP服务器进程发出的TCP连接释放报文段 若使用TCP服务器进程的应用进程已经没有数据要发送了,应用进程就通知其TCP服务器进程释放连接 由于TCP连接释放是由TCP客户进程主动发起的,因此TCP服务器进程对TCP连接的释放称为被动关闭连接

此时当服务器没有数据要传输后。进行第三次挥手:
image.png

TCP服务器进程发送TCP连接释放报文段并进入最后确认状态 该报文段首部中

  • 终止位FIN和确认位ACK的值都被设置为1,表明这是一个TCP连接释放报文段,同时也对之前收到的报文段进行确认
  • 序号seq字段的值为w,这是因为在半关闭状态下,TCP服务器进程可能又发送,因此w就是该段数据最后的序号
  • 确认号ack字段的值为u+1,这是对之前收到的TCP连接释放报文段的重复确认,因此值与发送方第一次挥手发送的seq值+1

TCP客户进程收到TCP连接释放报文段后开始第四次挥手:
image.png

此时针对第三次挥手的报文段发送普通的TCP确认报文段,之后进入时间等待状态

该报文段首部中有以下关键数据位:

确认位ACK:值被设置为1,表明这是一个普通的TCP确认报文段

序号seq字段:值设置为u+1,用来表示最后一个发送的字节序号,但是为何没有发送数据,而此时值要设置为u+1(对比第一次挥手数据)?,因为TCP客户进程之前发送的TCP连接释放报文段(带有FIN)虽然不携带数据,但要消耗掉一个序号

确认号ack:值设置为w+1,这是对所收到的TCP连接释放报文段的确认

此时,TCP服务器进程收到该报文段后就进入关闭状态,而TCP客户进程还要经过2MSL后才能进入关闭状态:
image.png
MSL具体的值可以根据TCP协议的不同实现进行设置。
此时就会出现一个问题:

  • 为什么不发送报文段后直接关闭,而是要等待2MSL个时间后才关闭?是否有必要?

答案是有必要
考虑以下情况:
image.png

若客户端发送完最后一次报文后,也就是第四次挥手后就直接进入关闭状态,此时若第四次挥手报文丢失,会导致服务器的超时重传

此时客户端又已经关闭,导致不接受该报文,因此服务器会一直不断重传,并一直处于最后确认状态无法进入关闭状态

因此,有以下结论
客户端进入时间等待状态以及处于该状态2MSL时长,可以确保TCP服务器进程可以收到最后一个TCP确认报文段而进入关闭状态

TCP客户进程在发送完最后一个TCP确认报文段后,在经过2MSL时长,就可以使本次连接持续时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的TCP连接中,不会出现旧连接中的报文段

TCP保活计时器的作用

若出现这样一种情况:
TCP双方已经建立了连接,但是传输过程中TCP客户进程所在的主机出现了故障,此时TCP服务器进程以后就不能再收到TCP客户进程发来的数据,这时服务器进程会一直处于等待状态。
为了使TCP服务器进程不要再白白等待下去出现了TCP保活计时器:
image.png

总结

image.png