我知道当一个进程崩溃时,现有的 TCP 套接字将通过向其他对等方发送 RST 数据包(段)而被放弃,并且其他对等方上的相关套接字 fd 将接收 RST 数据包。
还有其他发送RST数据包的情况吗?例如,如果一个进程在套接字 fd 上调用 close(),但该套接字上仍有未读数据,它是否还会通过该套接字 fd 向其他对等方发送 RST 数据包(段)?
我知道当一个进程崩溃时,现有的 TCP 套接字将通过向其他对等方发送 RST 数据包(段)而被放弃,并且其他对等方上的相关套接字 fd 将接收 RST 数据包。
还有其他发送RST数据包的情况吗?例如,如果一个进程在套接字 fd 上调用 close(),但该套接字上仍有未读数据,它是否还会通过该套接字 fd 向其他对等方发送 RST 数据包(段)?
一般来说,只要发生 TCP 软件“意外”的事情,就会产生复位。生成重置的一些最常见的特定情况包括:
接收到来自任何设备的任何 TCP 段,但接收该段的设备当前没有与之建立连接(请求新连接的 SYN 除外。)
收到带有无效或不正确的序列号或确认号字段的消息,表明该消息可能属于先前的连接或以某种其他方式是虚假的。
在没有进程侦听连接的端口上收到 SYN 消息。
如果您观察到奇怪RST
的行为,您可能是TCP 重置攻击的受害者
关于你的最后一个问题,我想当RST
你关闭一个带有未读数据的套接字到套接字缓冲区时不会发出 no ,因为它不会破坏任何 TCP 规则(数据包被正确传递,只是没有详细说明它的过程)。相反,FIN
将发送一个。