首页 文章

主动关闭服务器套接字

提问于
浏览
0

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

现在要了解TIME_WAIT,我使用ctrl c杀死我的服务器应用程序 . 我希望看到处于“已 Build ”状态的服务器套接字被转移到“TIME_WAIT” . 但是,当我在关闭后执行netstat时,我看不到处于“TIME_WAIT”状态的单个套接字 . 我知道“监听”模式下的套接字直接转换为CLOSED状态 . 但我很困惑为什么接受返回并且当前处于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

1 回答

  • 0

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

    因为你杀死了进程,阻止了任何类型的有序关闭 . 只有当进程在套接字上实际调用 close() (或 shutdown() )时才会看到 TIME_WAIT - 这将向对等体发送 FIN - 然后保持活动足够长时间以接收发送给对等方的 FIN 和对等方自己的 ACK FIN (将返回 ACK ) . 有三种方法可以达到 TIME_WAIT ,其中一种方法必须在 TIME_WAIT Build ,但这只有在过程仍然存在才能转换到FIN_WAIT1(即所有三条路径的起点)时才会发生 . 你的Ctrl-C甚至阻止了启动序列的 close() .

    要查看 TIME_WAIT ,您必须安排主动关闭套接字的过程,例如在为 SIGHUP 安装的处理程序中,或通过某种输入机制 . 在任何时候杀死这个过程都是确保不能看到你想要的东西的好方法 .

相关问题