Linux TCP/IP 堆栈终止连接的不同方式

Linux TCP/IP 堆栈终止连接的不同方式

我有一台 Linux 机器,它使用 SSH 客户端(OpenSSH_4.1p1)连接到 SSH 服务器。 SSH 客户端计算机的 IP 地址为 10.10.11.1,SSH 服务器的 IP 地址为 10.10.10.1。 SSH客户端的内核版本为3.2.0-4,SSH服务器的内核版本为2.6.38-8。如果我对 SSH 客户端发出 SIGTERM,则 TCP/IP 连接将终止,如下所示:

root@localhost:~# tcpdump -ni eth2 tcp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes
17:03:53.313956 IP 10.10.11.1.48340 > 10.10.10.1.22: Flags [F.], seq 699217476, ack 226096330, win 913, options [nop,nop,TS val 236994467 ecr 236953581], length 0
17:03:53.315108 IP 10.10.10.1.22 > 10.10.11.1.48340: Flags [.], ack 1, win 280, options [nop,nop,TS val 236958986 ecr 236994467], length 0
17:03:53.315931 IP 10.10.10.1.22 > 10.10.11.1.48340: Flags [F.], seq 1, ack 1, win 280, options [nop,nop,TS val 236958986 ecr 236994467], length 0
17:03:53.315950 IP 10.10.11.1.48340 > 10.10.10.1.22: Flags [.], ack 2, win 913, options [nop,nop,TS val 236994468 ecr 236958986], length 0
^C
4 packets captured
4 packets received by filter
0 packets dropped by kernel
root@localhost:~# 

..或者像这样:

root@localhost:~# tcpdump -ni eth2 tcp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth2, link-type EN10MB (Ethernet), capture size 65535 bytes
17:09:03.135285 IP 10.10.11.1.48341 > 10.10.10.1.22: Flags [F.], seq 2985791777, ack 685840991, win 913, options [nop,nop,TS val 237071923 ecr 237029567], length 0
17:09:03.137040 IP 10.10.10.1.22 > 10.10.11.1.48341: Flags [F.], seq 1, ack 1, win 280, options [nop,nop,TS val 237036440 ecr 237071923], length 0
17:09:03.137077 IP 10.10.11.1.48341 > 10.10.10.1.22: Flags [.], ack 2, win 913, options [nop,nop,TS val 237071923 ecr 237036440], length 0
^C
3 packets captured
3 packets received by filter
0 packets dropped by kernel
root@localhost:~#

这两个例子都不是“按书本”。在第一个示例中,两台主机都发送 SYN 以及 FIN("F." intcp转储输出)。为什么会这样呢?我希望它们只发送 FIN,如 TCP/IP 指南中所示。第二个例子也令人困惑——来自 10.10.10.1 的 ACK 在哪里?

相关内容