C 是否保证在进程终止时发送RST数据包?
如果我有一个连接了套接字的进程,并且我终止了这个进程,那么Windows将导致发送RST数据包C 是否保证在进程终止时发送RST数据包?,c,sockets,winapi,network-programming,winsock,C,Sockets,Winapi,Network Programming,Winsock,如果我有一个连接了套接字的进程,并且我终止了这个进程,那么Windows将导致发送RST数据包 是否可以保证(是否有文档记录)在进程终止时始终发送RST数据包,或者可以改为发送FIN数据包?TCP不应该在连接关闭时发送RST数据包。要关闭连接,TCP在客户端会经历以下状态: 发送一个FIN包。此操作将TCP状态更改为FIN\u WAIT\u 1 在FIN_WAIT_1中,TCP等待来自服务器的确认(ACK) 收到确认后,TCP进入FIN\u WAIT\u 2 在FIN\u WAIT\u 2中,T
是否可以保证(是否有文档记录)在进程终止时始终发送RST数据包,或者可以改为发送FIN数据包?TCP不应该在连接关闭时发送RST数据包。要关闭连接,TCP在客户端会经历以下状态:
FIN\u WAIT\u 1
FIN_WAIT_1
中,TCP等待来自服务器的确认(ACK)FIN\u WAIT\u 2
FIN\u WAIT\u 2
中,TCP等待来自服务器的FIN
数据包FIN
到达,客户端发送ACK
并输入TIME\u WAIT
TIME\u WAIT
在一段时间后退出(通常为30秒或1分钟)。此状态的目的是使最终的ACK
能够在丢失时重新发送到服务器李>
任何地方都没有RST数据包。RST用于响应意外流量,不用于关闭连接
例如,如果您将TCP数据包发送到端口80,而服务器没有运行HTTP服务器(并且假设数据包一直到服务器,并且没有被阻止/忽略),则会将RST回复发送回客户端。RST是对“未经请求”流量的响应。此流量用于现在不存在的进程。TCP堆栈将以RST响应此类流量。由于进程终止,它不会“启动”RST。对于Windows将导致发送RST数据包的说法,您是否有引用?如果远程服务器断电,您将得到什么数据包?或者如果反铲切断了互联网连接?@David Schwartz我在Wireshark中捕获了RST数据包。但我不确定是否总是这样(这就是我为什么要问的原因!)。请注意,当我终止进程时,发送缓冲区是空的(与我在别处读到的不同,如果发送缓冲区不是空的,那么将发送RST数据包)。CLOSE_WAIT没有超时。你想的是等待的时间。非常困惑,而且大部分是不相关的。@EJP是的,你是对的。我更新了答案。老实说,我不认为这会让整个答案“非常混乱”,而且最肯定的是,这并不是无关紧要的。显然,OP不知道TCP连接是如何关闭的,一个简单的是/否答案几乎没有用处。充其量,一句评论就足够了——在我看来,否决票是完全没有必要的。你真的认为这个答案没有用吗?嗯。看起来它描述了一个优雅的套接字关闭。如果我没记错的话,非正常关机不是有些不同吗?@HarryJohnston是的,它是不同的,取决于接收端发生了什么。如果接收进程崩溃或因任何原因被终止,
send()
将返回ECONNRESET
。在网络级别,要么接收方使用RST
数据包进行回复(如果主机仍处于活动状态),要么根本不回复。“RST用于响应意外流量,而不是关闭连接”当发送RST数据包以响应关闭进程时,发送该数据包是为了告诉另一端我已离开,如果没有发送RST数据包,则另一端仍会认为它已连接到我。