我知道TIME_WAIT
是为了防止延迟的数据片段被误解为属于随后的连接而设置的。在连接处于TIME_WAIT等待状态时到达的任何数据片段都会被丢弃。
在我的实验中,当客户端发送RST数据包而不是FIN数据包时,我看不到TIME_WAIT
。为什么?
服务器
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,因为它在关闭套接字之前没有读取服务器已发送的缓冲数据。
RST
数据包时,你不会从另一端收到任何其他的RST
数据包...你可能会丢失它,但不会延迟接收它...你只会收到一个...如果你因为RST
而切换到TIME_WAIT
,你将不会收到更多的RST
数据包(也不会收到FIN
或ACK
,其序列号超过连接中接收到的序列号)。此外,如果你收到了一个RST
,因为第三方注入了数据段,你必须确认错误的数据(被注入的数据)给对方,并将其视为有效。 - Luis ColoradoRST
仅表示另一端正在放弃连接(它进入了关闭状态)。如果你坚持发送更多数据,你将会收到(作为协议中LISTEN
部分的一部分)另一个RST
,直到你真正理解连接已经断开且没有修复的机会。 - Luis ColoradoRST
需要切换到TIME_WAIT
状态(因为没有连接状态,因为两端不同步,所以我认为CLOSED
状态是适当的)。如果您不同意,请写信给IETF修改RFC-793,而不是试图说服我一些无用且不正确的东西。 - Luis Colorado