5-8-2 TCP运输连接管理—TCP连接的释放
TCP 通过四报文挥手来释放连接。
我们来举例说明,数据传输结束后, TCP 通信双方都可以释放连接。
现在 TCP 客户进程和 TCP 服务器进程都处于连接已建立状态,假设使用 TCP 客户进程的应用进程通知其主动关闭 TCP 连接, TCP 客户进程会发送 TCP 连接释放报文段并进入终止等待 1 状态。
该报文段手部中的终止位FIN和确认位ACK的值都被设置为1,表明这是一个 TCP 连接释放报文段,同时也对之前收到的报文段进行确认。序号 seq 字段的值设置为u,它等于 TCP 客户进程之前已传送过的数据的最后一个字节的序号。加1。请注意, TCP 规定终止为 FIN 等于 1 的报文段,即使不携带数据,也要消耗掉一个序号确认号。 ACK 字段的值设置为v,它等于 TCP 客户进程之前已收到的数据的最后一个字节的序号。加 1 TCP。服务器进程收到 TCP连接释放报文段后,会发送一个普通的 TCP确认报文段,并进入关闭等待状态。该报文段手部中的确认为 a C k 的值被设置为1,表明这是一个普通的 TCP确认报文段序号。
seq 字段的值设置为v,它等于 TCP 服务器进程之前已传送过的数据的最后一个字节的序号,加1,这也与之前收到的 TCP 连接释放报文段中的确认号匹配。确认号ack字段的值设置为u,加1,这是对 TCP 连接释放报文段的确认。 TCP 服务器进程,这时应通知高层应用进程, TCP 客户进程要断开与自己的 TCP 连接。此时从 TCP 客户进程到 TCP 服务器进程这个方向的连接就释放了。这时的 TCP 连接属于半关闭状态,也就是 TCP 客户进程已经没有数据要发送了,但 TCP 服务器进程如果还有数据要发送, TCP 客户进程仍要接收。也就是说,从 TCP 服务器进程到 TCP 客户进程这个方向的连接并未关闭,这个状态可能会持续一段时间。 TCP客户进程收到 TCP确认报文段后,就进入终止等待 2 状态,等待 TCP。
服务器进程发出的 TCP。连接释放报文段。若使用 TCP 服务器进程的应用进程已经没有数据要发送了,应用进程就要通知企业 TCP 服务器进程释放连接。由于 TCP 连接释放是由 TCP 客户进程主动发起的,因此 TCP 服务器进程对 TCP 连接的释放称为被动关闭连接。
TCP 服务器进程发送 TCP 连接释放报文段,并进入最后确认状态,该报文段手部中的中指位FIN和确认位ACK的值都被设置为1,表明这是一个TCP 连接释放报文段,同时也对之前收到的报文段进行确认。现在假定序号 seq 字段的值为w,这是因为在半关闭状态下, TCP 服务器进程可能又发送了一些数据。确认号 ACK 字段的值为 u 加1,这是对之前收到的 TCP 连接释放报文段的重复确认。
TCP。客户进程收到 TCP连接释放报文段后,必须针对该报文段发送普通的t、 c p 确认报文段之后进入时间等待状态。该报文段手部中的确认位ACK的值被设置为1,表明这是一个普通的 TCP确认报文段序号 seq 字段的值设置为u,加1,这是因为 TCP 客户进程之前发送的 TCP 连接释放报文段虽然不携带数据,但要消耗掉一个序号确认号 ACK 字段的值设置为 w 加1,这是对所收到的 TCP 连接释放报文段的确认。
TCP 服务器进程收到该报文段后就进入关闭状态,而 TCP 客户进程还要经过 2 倍的 MSL 后才能进入关闭状态。 MSL 的意思是最长报文段寿命 RFC 793 文档建议为 2 分钟,也就是说 TCP 客户进程进入时间等待状态后,还要经过 4 分钟才能进入关闭状态,这完全是从工程上来考虑的,对于现在的网络, m s l 取为 2 分钟可能太长了,因此 TCP允许不同的实现,可根据具体情况使用更小的 MSL 值。
那么, TCP 客户进程在发送完最后一个确认报文段后,为什么不直接进入关闭状态,而是要进入时间等待状态 2 倍 MSL 后才进入关闭状态,这是否有必要来看这种情况? TCP 服务器进程发送 TCP 连接,释放报文段后进入最后确认状态。 TCP 客户进程收到该报文段后,发送普通的 TCP 确认报文段并进入关闭状态,而不是时间等待状态。然而,该 TCP 确认报文段丢失了,这必然会造成 TCP 服务器进程对之前所发送的 TCP 连接释放报文段的超时重传,并仍处于最后确认状态。重传的 TCP 连接释放报文段到达 TCP 客户进程,由于 TCP 客户进程属于关闭状态,因此不理睬该报文段,这必然会造成 TCP 服务器进程反复重传, TCP 连接释放报文段并一直处于最后确认状态而无法进入关闭状态。因此,时间等待状态以及处于该状态 2 倍 MSL 的时长可以确保 TCP 服务器进程可以收到最后一个 TCP 确认报文段,而进入关闭状态。
另外, TCP客户进程在发送完最后一个 TCP确认报文段后,再经过 2 倍 m s l 时长就可以使本次连接持续时间内所产生的所有报文段都从网络中消失,这样就可以使下一个新的 TCP 连接中不会出现旧连接中的报文段。以上就是 TCP 通过 4 报文挥手释放连接的过程。最后我们再来看看 TCP 中保活计时器的作用。设想这样一种情况, TCP 双方已经建立了连接,后来 TCP 客户进程所在的主机突然出现了故障,显然 TCP 服务器进程以后就不能再收到 TCP 客户进程发来的数据。因此应当有措施使 TCP 服务器进程不要再白白等待下去。换句话说, TCP 服务器进程应该如何发现这种情况?桑萨就是使用保活计时器, TCP 服务器进程每收到一次 TCP 客户进程的数据,就重新设置并启动保活计时器。若保活计时器定时周期内未收到 TCP 客户进程发来的数据,则当保活计时器,到时候 TCP 服务器进程就像 TCP 客户进程发送一个探测报文段,以后每隔 75 秒钟发送一次。若一连发送 10 个探测报文段后仍无 TCP 客户进程的响应, TCP 服务器进程就认为 TCP 客户进程所在主机出了故障,接着就要关闭这个连接。本节课到这里就结束了,我们将本节课的内容小结如下,同学们,我们下节课再见。