【问题标题】:Is it guaranteed that an RST packet will be sent when a process terminates?是否保证在进程终止时会发送一个 RST 数据包?
【发布时间】:2015-08-26 06:52:06
【问题描述】:

如果我有一个带有连接套接字的进程,并且我终止了这个进程,那么 Windows 将导致发送一个 RST 数据包。

是否保证(是否在某处记录)在进程终止时始终发送 RST 数据包,或者是否可以发送 FIN 数据包?

【问题讨论】:

  • RST 是对“未经请求的”流量的响应。此流量用于现在不存在的进程。 TCP 堆栈将以 RST 响应此类流量。由于进程终止,它不会“启动”RST。
  • 您是否引用了您声称 Windows 将导致发送 RST 数据包的声明?
  • 如果远程服务器断电,你会得到什么数据包?或者如果反铲挖土机切断了它的互联网连接?
  • @David Schwartz 我在 Wireshark 中捕获了 RST 数据包。但我不确定这是否总是如此(这就是我问的原因!)。请注意,当我终止进程时,发送缓冲区为空(与我在其他地方读到的不同,如果发送缓冲区不为空,则将发送一个 RST 数据包)。

标签: c sockets winapi network-programming winsock


【解决方案1】:

TCP 不应该在连接关闭时发送 RST 数据包。为了关闭一个连接,TCP 在客户端会经历以下状态:

  1. 发送一个 FIN 数据包。此操作会将 TCP 状态更改为 FIN_WAIT_1
  2. FIN_WAIT_1 中,TCP 等待来自服务器的确认 (ACK)。
  3. 收到确认后,TCP 进入FIN_WAIT_2
  4. FIN_WAIT_2 中,TCP 等待来自服务器的FIN 数据包
  5. 一旦FIN到达,客户端发送ACK并输入TIME_WAIT
  6. TIME_WAIT 会在一段时间后退出(通常为 30 秒或 1 分钟)。此状态的目的是使最终的ACK 可以重新发送到服务器以防丢失。

任何地方都没有 RST 数据包。 RST 用于响应意外流量,用于关闭连接。

例如,如果您向端口 80 发送 TCP 数据包,并且服务器没有运行 HTTP 服务器(并且假设数据包一直到达服务器并且没有被阻止/忽略),那么 RST 回复是发回给客户。

【讨论】:

  • CLOSE_WAIT 未超时。您正在考虑TIME_WAIT。非常困惑,而且大多无关紧要。
  • @EJP 是的,你是对的。我更新了答案。老实说,我不认为这会使整个答案“非常困惑”,而且绝对不是无关紧要的。显然,OP 不知道 TCP 连接是如何关闭的,简单的是/否的答案几乎没有用处。充其量,评论就足够了——在我看来,投反对票是完全没有必要的。你真的觉得这个答案没用
  • 嗯。这看起来像是描述了一个优雅的套接字关闭。如果我没记错的话,非正常关机是不是有点不同?
  • @HarryJohnston 是的,情况不同,具体取决于接收方发生的情况。如果接收进程因任何原因崩溃或被杀死,send() 将返回ECONNRESET。在网络层面,接收者要么回复RST 数据包(如果主机还活着),要么根本不回复。
  • "RST 是用来响应意外流量,而不是关闭连接" 当一个 RST 数据包被发送以响应关闭一个进程时,它被发送来告诉另一端我走了,如果没有发送 RST 数据包,那么另一端仍然会认为它已连接到我。
猜你喜欢
  • 2015-05-29
  • 1970-01-01
  • 2021-04-26
  • 2021-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
相关资源
最近更新 更多