linux - 主动关闭服务器套接字

标签 linux sockets networking tcp

我有一个小型服务器(TCP 服务器),它在端口 5000 上最多接受 10 个连接。我已经在监听模式下创建了一个套接字并接受连接。当接受成功时,我创建一个新线程并处理该线程中的流量。我在同一台机器上有一个客户端,它能够与该服务器连接并通信。

现在为了了解 TIME_WAIT,我使用 ctrl+c 终止了我的服务器应用程序。我希望看到处于“Established”状态的服务器套接字转移到“TIME_WAIT”。但是,当我在关闭后执行 netstat 时,我没有看到处于“TIME_WAIT”状态的单个套接字。我知道处于“监听”模式的套接字会直接转换为 CLOSED 状态。但我很困惑为什么accept返回且当前处于Established状态的套接字不处于TIME_WAIT状态。

(我在 Linux 机器上,tcp_fin_timeout 值设置为 1 分钟。)

我的 tcpdump 如下所示:

localhost.49388 > localhost.5000:
    Flags [S], cksum 0xfe30 (incorrect -> 0xaa93), seq 3264533269, win 32792,
    options [mss 16396,sackOK,TS val 20216234 ecr 0,nop,wscale 3], length 0              
localhost.5000 > localhost.49388:
    Flags [S.], cksum 0xfe30 (incorrect -> 0xc6a0), seq 3352338762, ack 3264533270, win 32768,
    options [mss 16396,sackOK,TS val 20216234 ecr 20216234,nop,wscale 3], length 0
localhost.49388 > localhost.5000:
    Flags [.], cksum 0xfe28 (incorrect -> 0x9fbe), ack 1, win 4099,
    options [nop,nop,TS val 20216234 ecr 20216234], length 0           
localhost.5000 > localhost.49388:
    Flags [P.], cksum 0xfe42 (incorrect -> 0xa300), seq 1:27, ack 1, win 4096,
    options [nop,nop,TS val 20216484 ecr 20216234], length 26           
localhost.49388 > localhost.5000:
    Flags [.], cksum 0xfe28 (incorrect -> 0x9db0), ack 27, win 4099,
    options [nop,nop,TS val 20216484 ecr 20216484], length 0          
localhost.49388 > localhost.5000:
    Flags [P.], cksum 0x0211 (incorrect -> 0x6be1), seq 1:1001, ack 27, win 4099,
    options [nop,nop,TS val 20216484 ecr 20216484], length 1000              
localhost.5000 > localhost.49388:
    Flags [.], cksum 0xfe28 (incorrect -> 0x91cb), ack 1001, win 6144,
    options [nop,nop,TS val 20216484 ecr 20216484], length 0     
localhost.5000 > localhost.49388:
    Flags [R.], cksum 0xfe28 (incorrect -> 0x8eeb), seq 27, ack 1001, win 6144,
    options [nop,nop,TS val 20217216 ecr 20216484], length 0

最佳答案

*但是我很困惑为什么accept返回且当前处于Established状态的套接字不处于TIME_WAIT状态。*

因为您终止了该进程,从而阻止了任何类型的有序关闭。仅当进程实际在套接字上调用 close()(或 shutdown())时,您才会看到 TIME_WAIT - 它将向对等方发送 FIN - 然后保持事件状态足够长的时间,以接收发送给对等方的 FINACK 和对等方自己的 FIN(为此将发送回 ACK)。有三种方法可以到达TIME_WAIT,其中一种必须发生才能建立TIME_WAIT,但是只有当进程仍然处于事件状态并且可以转换到FIN_WAIT1(所有三个路径的开始)时,才会发生这种情况。您的 Ctrl-C 甚至阻止了启动序列的 close()

要看到TIME_WAIT,您必须安排进程主动关闭套接字,例如在为 SIGHUP 安装的处理程序中,或通过某种输入机制。随时终止进程是确保看不到您想要的内容的好方法。

关于linux - 主动关闭服务器套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14737896/

相关文章:

java - 使用 JDBC 连接到 DB2 Linux 数据库

java - 在UDP Socket Java Android上发送多个数据

c - 文件服务器及其关联的客户端

linux - 将 Web 服务器从端口 5000 重定向到本地主机上的端口 80 (Fedora)

java - 更改互联网连接类型

Linux USB CDC 发送意外字符

linux - 给定的shell命令有什么区别

linux - 如何在 linux 系统上获取 true type 字符的字形轮廓

python - Heroku 上的 TCP/IP 套接字

java - 虫洞攻击实现-传感器