4

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

在我的实验中,我看不到TIME_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,因为它不会在关闭套接字之前读取服务器已经发送的缓冲数据。

4

2 回答 2

2

当您close(2)与接收数据挂起的连接时,连接中断,因为您没有读取所有挂起的数据(可能在缓冲区中、已确认、未确认或只是在传输中),您正在破坏状态机,这就是引发一个RST(从您的主机发送到另一端,以响应到达连接这一端的任何数据段)。如果按照建议,您阅读了 RFC 文档,则连接处于错误状态,并且将用一个RST帧回复它收到的每个数据包......它不再处于该TIME_WAIT状态。

close(2)在读取EOF(0 字节的非阻塞读取,当您已经FIN从另一端接收到)条件之前调用是协议错误,因为接收方(您)正在丢失传输到您方的剩余数据。你有一个系统调用shutdown(2),目的是表明你不写更多数据的意图(半关闭你的发送端),并允许等待剩余数据的到来,它迫使你端发送一个FIN到另一端并放状态中的连接FIN_WAIT1(等待ACK您的FIN和/或FIN&ACK来自另一方的)

笔记

TIME_WAIT状态是确保任何in-transit数据包都有足够的时间到达目的地并被正确处理的状态。由于连接失败,两端不同步,等待任何数据包到达是没有意义的,因为它们无法被正确处理。没有数据包被发送以响应 aRST并且连接通常进入该CLOSED状态。

RFC-793 特别指出:

Sec 3.4 建立连接

[...]

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.

所以,正如你所读到的......在任何情况下都没有TIME_WAIT状态。RST

于 2016-07-27T19:52:11.467 回答
0

因为它声明不存在这种联系,其效果是在不影响的情况下终止它。

换句话说,因为 RFC 793 明确表示在RST接收时不会发送响应并且您必须进入该CLOSED状态(除了在某些与连接建立相关的情况下,您会LISTEN再次进入该状态)。

于 2016-07-26T02:18:42.607 回答