gpt4 book ai didi

tcp - tcp堆栈如何区分关闭和关闭?

转载 作者:可可西里 更新时间:2023-11-01 02:33:17 24 4
gpt4 key购买 nike

众所周知:

//////////////////////////////////////////////////////

close() 将终止 tcp 连接上的两个方向

shutdown() 可以阻止单向或双向通信

//////////////////////////////////////////////////////

这里,让我疑惑的是tcp栈是如何区分它们的?

我写了一个示例程序:

首先我使用:

....
connect(192.168.1.100) //there is a server process running in 192.168.1.100
....
close(socketfd);
sleep(1000);

然后我使用 wireshark 转储数据包:

01 -->syn

02 <--syn,ack

03 -->ack

04 -->fin,ack

05 <--ack

netstat -an |grep 192.168.1.100

我已经运行了大约 5 分钟,它打印出:

一开始是“tcp 0 0 ... FIN_WAIT2”,然后大约 2 分钟后没有输出,似乎连接已被破坏。

然后,我使用:

....
connect(192.168.1.100)
....
shutdown(socketfd,SHUT_WR);
sleep(1000);

使用wireshark转储数据包:

01 -->同步

02 <--同步,确认

03 -->确认

04 -->fin,ack

05 <--确认

...

netstat -an |grep 192.168.1.100

运行大约 10 分钟,它总是打印:“TCP 0 0 ... FIN_WAIT2”


从wireshark的输出来看,close和shutdown似乎没有区别,

但是从 netstat 的输出来看,它的行为是不同的。

那么为什么行为不同呢?

最佳答案

仅关闭套接字和执行shutdown(SHUT_RDWR) 在线路上没有区别。两者都会导致 TCP 堆栈发出 FIN 并停止接受来自另一端的数据包。唯一的区别在于您的程序:在 shutdown 之后文件描述符仍然有效,但是在 close 之后它就无效了。可以肯定的是,在 shutdown 之后除了关闭它之外仍然有效的文件描述符不能做太多,但它仍然有效。

在您的情况下,您使用的是 SHUT_WR,而不是 SHUT_RDWR,因此您的套接字仍准备好从另一端接收数据。但是您的服务器不发送任何数据。如果您的服务器在客户端关闭结束后发送了一些数据,您会看到 closeshutdown(SHUT_WR) 之间的区别。 close() 客户端将使用 RST 响应服务器的数据,而 shutdown(SHUT_WR) 客户端将接受服务器的数据并确认它。 shutdown(SHUT_RDWR) 客户端的行为与 close() 客户端相同。

在大多数客户端-服务器 TCP 协议(protocol)(​​例如 HTTP)中,服务器一收到来自客户端的 FIN,无论如何都会终止连接。因此,对于这些协议(protocol),客户端是半关闭还是完全关闭套接字都没有太大区别,因为服务器无论如何都会立即关闭其连接端。我可以看到您的服务器并没有像这样,因为我没有看到它发送自己的 FIN(只有您的客户端发送 FIN)。

关于tcp - tcp堆栈如何区分关闭和关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9819745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com