5.8.2 TCP的运输连接管理——TCP的连接释放.pdf
TCP的连接释放
- TCP 连接释放过程比较复杂。
- 数据传输结束后,通信的双方都可释放连接。
-
TCP通过“四报文挥手”来释放连接
TCP 连接的建立采用客户服务器方式。
- 主动发起连接建立的应用进程叫做TCP客户 (client)。
- 被动等待连接建立的应用进程叫做TCP服务器 (server)。
- 任何一方都可以在数据传送结束后发出连接释放的通知
过程
第一次挥手:
现在TCP客户进程和TCP服务器进程都处于连接已建立状态 TCP客户进程的应用进程通知其主动关闭TCP连接 TCP客户进程会发送TCP连接释放报文段,并进入终止等待1状态 TCP连接释放报文段首部中
- 终止位FIN和确认为ACK的值都被设置为1,表明这是一个TCP连接释放报文段,同时也对之前收到的报文段进行确认
- 序号seq字段的值设置为u,它等于TCP客户进程之前已传送过的数据的最后一个字节的序号加1
- 确认号ack字段的值设置为v,它等于TCP客户进程之前已收到的、数据的最后一个字节的序号加1
请注意:TCP规定终止位FIN等于1的报文段即使不携带数据,也要消耗掉一个序号
第二次挥手:
TCP服务器进程收到TCP连接释放报文段后,会发送一个普通的TCP确认报文段并进入关闭等待状态 普通的TCP确认报文段首部中
- 确认位ACK的值被设置为1,表明这是一个普通的TCP确认报文段
- 序号seq字段的值设置为v,它等于TCP服务器进程之前已传送过的数据的最后一个字节的序号加1,这也与之前收到的TCP连接释放报文段中的确认号匹配
- 确认号ack字段的值设置为u+1,这是对TCP连接释放报文段的确认,也就是为发送方连接释放报文中的seq的值+1.
在进行第二次挥手后,会产生以下过程:
TCP服务器进程通知高层应用进程,TCP客户进程要断开与自己的TCP连接,此时的TCP连接进入半关闭状态。
所谓半关闭状态可以认为,此时客户端与服务器的连接不再传输数据,也就是客户端没有数据在发生。而此时服务器若有剩余数据要发送会继续发送。客户端到服务器这一信道关闭了,而服务器到客户端这一半没有关闭,因此称为半关闭状态。
这个半关闭状态可能会持续一段时间,直到发送方没有数据进行发送。
在以上等待过程中,客户端会进入终止等待2状态:
TCP客户进程收到TCP确认报文段后就进入终止等待2状态,等待TCP服务器进程发出的TCP连接释放报文段 若使用TCP服务器进程的应用进程已经没有数据要发送了,应用进程就通知其TCP服务器进程释放连接 由于TCP连接释放是由TCP客户进程主动发起的,因此TCP服务器进程对TCP连接的释放称为被动关闭连接
此时当服务器没有数据要传输后。进行第三次挥手:
TCP服务器进程发送TCP连接释放报文段并进入最后确认状态 该报文段首部中
- 终止位FIN和确认位ACK的值都被设置为1,表明这是一个TCP连接释放报文段,同时也对之前收到的报文段进行确认
- 序号seq字段的值为w,这是因为在半关闭状态下,TCP服务器进程可能又发送,因此w就是该段数据最后的序号。
- 确认号ack字段的值为u+1,这是对之前收到的TCP连接释放报文段的重复确认,因此值与发送方第一次挥手发送的seq值+1
TCP客户进程收到TCP连接释放报文段后开始第四次挥手:
此时针对第三次挥手的报文段发送普通的TCP确认报文段,之后进入时间等待状态。
该报文段首部中有以下关键数据位:
确认位ACK:值被设置为1,表明这是一个普通的TCP确认报文段。
序号seq字段:值设置为u+1,用来表示最后一个发送的字节序号,但是为何没有发送数据,而此时值要设置为u+1(对比第一次挥手数据)?,因为TCP客户进程之前发送的TCP连接释放报文段(带有FIN)虽然不携带数据,但要消耗掉一个序号。
确认号ack:值设置为w+1,这是对所收到的TCP连接释放报文段的确认
此时,TCP服务器进程收到该报文段后就进入关闭状态,而TCP客户进程还要经过2MSL后才能进入关闭状态:
MSL具体的值可以根据TCP协议的不同实现进行设置。
此时就会出现一个问题:
- 为什么不发送报文段后直接关闭,而是要等待2MSL个时间后才关闭?,是否有必要?
答案是有必要。
考虑以下情况:
若客户端发送完最后一次报文后,也就是第四次挥手后就直接进入关闭状态,此时若第四次挥手报文丢失,会导致服务器的超时重传。
此时客户端又已经关闭,导致不接受该报文,因此服务器会一直不断重传,并一直处于最后确认状态无法进入关闭状态。
因此,有以下结论:
客户端进入时间等待状态以及处于该状态2MSL时长,可以确保TCP服务器进程可以收到最后一个TCP确认报文段而进入关闭状态。
TCP客户进程在发送完最后一个TCP确认报文段后,在经过2MSL时长,就可以使本次连接持续时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的TCP连接中,不会出现旧连接中的报文段。
TCP保活计时器的作用
若出现这样一种情况:
TCP双方已经建立了连接,但是传输过程中TCP客户进程所在的主机出现了故障,此时TCP服务器进程以后就不能再收到TCP客户进程发来的数据,这时服务器进程会一直处于等待状态。
为了使TCP服务器进程不要再白白等待下去出现了TCP保活计时器: