TCP状態がどのように機能するのか、特に接続の終了部分について読んでいます。
私が読んだ書籍やオンライン資料には、終了プロセスの場合(アクティブ)接続の終了を開始した側で次の状態に従うことが記載されています。
オープン、FIN-WAIT-1、FIN-WAIT-2、TIME-WAIT、終了
これは受信(手動)側で提供されます。
作成済み、緊密に待機中、最終確認済み、終了済み
これで問題が発生します。 /proc/net/ip_conntrackの接続状態を確認するために、両側でnf_conntrack_ipv4モジュールをモードプローブしました。
驚くべきことに、接続が終了すると、イニシエータ(アクティブ)と受信者(手動)の両方がTIME-WAIT状態に入ります。
私はイニシエータだけがこの状態を経験し、受信者は接続を終了したいと思います。
なぜこれが起こるのか説明できますか?
更新:このテストをどのように実行しますか?
IP 10.0.0.1(Ubuntu 12.04)を使用するVMがあり、ここで10.0.0.2(Debian 6)への2つのSSH接続を開始しました(10.0.0.2もVMです)。両端でip_conntrackを確認しましたが、これが私が得たものです。
root@machine1:~# cat /proc/net/ip_conntrack | grep 10.0.0.1
tcp 6 431997 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53925 dport=22 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53925 [ASSURED] mark=0 use=2
tcp 6 431944 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53924 dport=22 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53924 [ASSURED] mark=0 use=2
root@machine2:~# cat /proc/net/ip_conntrack | grep 10.0.0.1
tcp 6 432000 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53925 dport=22 packets=206 bytes=19191 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53925 packets=130 bytes=18177 [ASSURED] mark=0 secmark=0 use=2
tcp 6 431947 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53924 dport=22 packets=16 bytes=4031 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53924 packets=17 bytes=3741 [ASSURED] mark=0 secmark=0 use=2
これまではすべてがよさそうです。これで、machine2 への SSH 接続を切断し、次のような結果が得られます。
root@machine1:~# cat /proc/net/ip_conntrack | grep 10.0.0.1
tcp 6 431989 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53925 dport=22 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53925 [ASSURED] mark=0 use=2
tcp 6 117 TIME_WAIT src=10.0.0.1 dst=10.0.0.2 sport=53924 dport=22 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53924 [ASSURED] mark=0 use=2
root@machine2:~# cat /proc/net/ip_conntrack | grep 10.0.0.1
tcp 6 432000 ESTABLISHED src=10.0.0.1 dst=10.0.0.2 sport=53925 dport=22 packets=211 bytes=19547 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53925 packets=133 bytes=18925 [ASSURED] mark=0 secmark=0 use=2
tcp 6 115 TIME_WAIT src=10.0.0.1 dst=10.0.0.2 sport=53924 dport=22 packets=31 bytes=5147 src=10.0.0.2 dst=10.0.0.1 sport=22 dport=53924 packets=25 bytes=4589 [ASSURED] mark=0 secmark=0 use=2
答え1
Linux TCPスタックとconntrackには、TCP接続の2つの異なるビューがあります。あなたが見るものと/proc/net/ip_conntrack
カーネルが見るものは違います。カーネルの状態はに保存して/proc/net/tcp
表示/proc/net/tcp6
できますnetstat
。
ここに見られるように:https://serverfault.com/questions/313061/netstat-and-ip-conntrack-connection-count-differ-by-order-of-magnitude-why2つの数値が異なります。私の考えでは、出力をnetstat
見るとTIME-WAIT
答え2
これは、新しい接続がまだネットワークの周りに浮かぶ古い接続から古いセグメントを取得し、混乱させないようにするためです。