C 为什么RST数据包不需要时间等待状态?

C 为什么RST数据包不需要时间等待状态?,c,linux,sockets,tcp,time-wait,C,Linux,Sockets,Tcp,Time Wait,我知道TIME\u WAIT是为了防止一个连接的延迟段被误解为后续连接的一部分。当连接处于TIME_WAIT WAIT状态时到达的任何段都将被丢弃 在我的实验中,我看不到客户机发送RST数据包而不是FIN数据包时的等待时间。为什么? 服务器 while (1) { int len = sizeof(struct sockaddr); fd = accept(sfd, &remote, &len); read(fd, buf, sizeof(buf));

我知道
TIME\u WAIT
是为了防止一个连接的延迟段被误解为后续连接的一部分。当连接处于TIME_WAIT WAIT状态时到达的任何段都将被丢弃

在我的实验中,我看不到客户机发送RST数据包而不是FIN数据包时的等待时间。为什么?

服务器

while (1) {
    int len = sizeof(struct sockaddr);
    fd = accept(sfd, &remote, &len);

    read(fd, buf, sizeof(buf));

    strcpy(buf, "Hello Client");
    write(fd, buf, strlen(buf));

    close(fd);
}
客户端

res = connect(sfd, result->ai_addr, result->ai_addrlen);

strcpy(buf, "Hello Server!");
write(sfd, buf, strlen(buf));

close(sfd);

注意:客户端发送RST而不是FIN,因为它在关闭套接字之前没有读取服务器已发送的缓冲数据。

因为它声明不存在此类连接,其效果是在不影响连接的情况下终止连接

换句话说,因为RFC 793明确表示,在接收到
RST
时,不发送任何响应,您必须进入
CLOSED
状态(在某些与建立连接相关的情况下除外,在这种情况下,您再次进入
LISTEN
状态)。
close(2)
接收数据的挂起连接,连接断开,因为您没有读取所有挂起数据(可能在缓冲区中、已确认、未确认或仅在传输中),您正在断开状态机,这就是引发RST的原因(在响应到达连接这边的任何数据段时,从您的主机发送到另一端)。如果如建议的那样,您阅读RFC文档,则连接处于错误状态,并将使用
RST
帧对它接收到的每个数据包进行回复…它不再处于
TIME\u WAIT
状态

在读取
EOF
之前调用
close(2)
(当您已经从另一端接收到
FIN
时,解除阻止读取0字节)条件是一个协议错误,因为接收方(您)正在丢失传输到您方的剩余数据。您有一个系统调用
关闭(2)
用于表示您不打算写入更多数据(一半关闭发送端),并允许等待剩余数据的到来,这将迫使您的端向另一端发送
FIN
,并将连接置于
FIN_WAIT1
状态(等待另一侧的
FIN
和/或
FIN&ACK
ACK

TIME\u WAIT
状态是一种状态,用于确保任何传输中的
数据包有足够的时间到达目的地并得到正确处理。由于连接失败,两端不同步,因此等待任何数据包到达没有意义,因为它们无法正确处理。响应
RST
时不发送数据包,连接通常进入
关闭状态

RFC-793明确表示:

第3.4节建立连接

[……]


因此,正如您所读到的,在任何情况下,
RST
的状态都是无
TIME\u WAIT
状态。

顺便说一句,
RST
确实是连接的一部分,它必须符合连接中断点的序列号,以及到目前为止接收到的确认。如果它在窗口中没有失败,它必须是ignored,这是假的。事实上,使用加密安全的初始序列号的原因是为了避免DOS攻击,这些攻击包括使用可预测的序列号发送RST段和中断连接。为什么
RST
不需要
TIME\u WAIT
状态?
RST
数据包也可以在网络中延迟。因此,我认为
TIME_WAIT
是必须的。@彭城您的问题是,为什么RST的到达不会使端口进入TIME\u WAIT状态。您在这里的评论是指一个本身延迟的RST数据包,即在TIME\u WAIT状态下到达的RST数据包。这是一个完全不同的条件和问题。在TIME\u WAIT状态下到达的RST将中止它..
RST
数据包可能会被延迟,甚至在网络中丢失。没有人等待
RST
数据包。等待
RST
数据包是没有意义的。
RST
数据包被发送到另一端,以通知双方之间的不同步状态。你不必等待它们。如果双方都实现了,则更何况假设是正确的,验证a
RST
的唯一方法是上面提到的方法(当数据传输到此处时完全关闭连接——这是一个实现依赖项,因为它与协议无关)或者有人为了使数据包在两端都处于不同步状态而注入数据包。即使在这种情况下,
TIME\u WAIT
也无法处理
RST
数据包。@EJP如果RST不需要TIME\u WAIT,由于RST数据包延迟,在高速网络中可能会发生数据错误。因此,我认为当服务器接收到RST数据包时,它应该等待时间。
Reset Processing

In all states except SYN-SENT, all reset (RST) segments are validated
by checking their SEQ-fields.  A reset is valid if its sequence number
is in the window.  In the SYN-SENT state (a RST received in response
to an initial SYN), the RST is acceptable if the ACK field
acknowledges the SYN.

The receiver of a RST first validates it, then changes state.  If the
receiver was in the LISTEN state, it ignores it.  If the receiver was
in SYN-RECEIVED state and had previously been in the LISTEN state,
then the receiver returns to the LISTEN state, otherwise the receiver
aborts the connection and goes to the CLOSED state.  If the receiver
was in any other state, it aborts the connection and advises the user
and goes to the CLOSED state.