我有一个小型服务器(TCP 服务器),它在端口 5000 上最多接受 10 个连接。我在侦听模式下创建了一个套接字并接受连接。当接受成功时,我创建一个新线程并处理该线程中的流量。我在同一台机器上有一个客户端,它能够与该服务器连接和通信。
现在要了解 TIME_WAIT,我使用 ctrl+c 杀死我的服务器应用程序。我希望看到处于“已建立”状态的服务器套接字被转移到“TIME_WAIT”。但是,当我在关闭后执行 netstat 时,我没有看到处于“TIME_WAIT”状态的单个套接字。我知道“侦听”模式下的套接字直接转换为 CLOSED 状态。但我很困惑为什么接受返回且当前处于已建立状态的套接字不处于 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