在 TCP 3 次握手过程中,我们研究了如何使用 SYN位段在传输控制协议 (TCP) 中在客户端和服务器之间建立连接。在本文中,我们将研究 TCP 如何关闭 Client 和 Server 之间的连接。在这里,我们还需要将位段发送到FIN位设置为 1 的服务器。
TCP 支持两种类型的连接释放,就像大多数面向连接的传输协议一样:
- 优雅的连接释放——
在 Graceful connection release 中,连接一直打开,直到双方都关闭了连接的两侧。 - 突然的连接释放 –
在 Abrupt connection release 中,要么一个 TCP 实体被强制关闭连接,要么一个用户关闭两个方向的数据传输。
突然的连接释放:
发送 RST 段时会执行突然的连接释放。出于以下原因,可以发送 RST 段:
- 当为不存在的 TCP 连接接收到非 SYN 段时。
- 在开放连接中,一些 TCP 实现会在收到带有无效标头的段时发送 RST 段。这将通过关闭相应的连接来防止攻击。
- 当某些实现需要关闭现有的 TCP 连接时,它们会发送一个 RST 段。由于以下原因,它们将关闭现有的 TCP 连接:
- 缺乏支持连接的资源
- 远程主机现在无法访问并且已停止响应。
当一个 TCP 实体发送一个 RST 段时,如果它不属于任何现有的连接,它应该包含 00 否则它应该包含连接的序列号的当前值,并且确认号应该设置为下一个预期的顺序此连接上的序列号。
优雅的连接发布:
终止 TCP 连接的常用方法是使用 TCP 标头的 FIN 标志。这种机制允许每个主机单独释放它自己的连接端。
机制如何在 TCP 中工作:
- 第 1 步(来自客户的 FIN) –
假设客户端应用程序决定要关闭连接。 (注意服务器也可以选择关闭连接)。这会导致客户端向服务器发送一个FIN位设置为1的 TCP 段并进入FIN_WAIT_1状态。在FIN_WAIT_1状态下,客户端等待来自服务器的 TCP 段和确认 (ACK)。 - 第 2 步(来自服务器的 ACK)——
当服务器收到来自发送方(客户端)的 FIN 位段时,服务器立即向发送方(客户端)发送确认(ACK)段。 - 第 3 步(客户端等待)——
在FIN_WAIT_1状态下,客户端等待来自服务器的 TCP 段并确认。当它接收到这个段时,客户端进入FIN_WAIT_2状态。当处于FIN_WAIT_2状态时,客户端等待来自服务器的另一个段,其中 FIN 位设置为 1。 - 第 4 步(来自服务器的 FIN) –
在服务器发送 ACK 段一段时间后(因为服务器中的一些关闭过程),服务器将 FIN 位段发送给发送方(客户端)。 - 第 5 步(来自客户端的 ACK)——
当Client从Server接收到FIN位段时,客户端确认服务器的段并进入TIME_WAIT状态。 TIME_WAIT状态让客户端在 ACK丢失的情况下重新发送最终确认。 TIME_WAIT状态客户端花费的时间取决于它们的实现,但它们的典型值是 30 秒、1 分钟和 2 分钟。等待之后,连接正式关闭,客户端的所有资源(包括端口号和缓冲区数据)都被释放。
下图说明了服务器端和客户端访问的一系列状态,假设客户端开始断开连接。 在这两个状态转换图中,我们只展示了如何正常建立 TCP 连接和关闭。
客户端访问的 TCP 状态 –
服务器端访问的 TCP 状态 –
这里我们没有描述在某些情况下会发生什么,例如当连接的双方想要同时启动或关闭时。如果您有兴趣了解更多有关 TCP 的此问题和其他高级问题,我们鼓励您阅读 Stevens 的综合性书籍。
门问题 –
考虑运行在两台不同机器上的 TCP 客户端和 TCP 服务器。完成数据传输后,TCP 客户端调用close终止连接,并向TCP 服务器发送一个FIN 段。服务器端 TCP 通过发送客户端 TCP 接收到的 ACK 进行响应。根据 TCP 连接状态图(RFC 793),客户端 TCP 连接在哪种状态下等待来自服务器端 TCP 的 FIN?
(A) 最后确认
(B) 时间等待
(C) FIN-WAIT-1
(D) FIN-WAIT-2
解释:(四)
GATE CS 2017(第 1 组),问题 12
参考 –
TCP 连接终止 – 维基百科
http://www.bau.edu.jo/UserPortal/UserProfile/PostsAttach/10617_1870_1.pdf