想定環境
サーバ
192.168.0.10
apache
FedoraCore 4
クライアント
192.168.0.11
上記環境にて以下のことを行います。
1.クライアントがサーバの80番ポートに接続します。
2.クライアントからHTTPデータを一切送りません。クライアントでは、以下のコマンドを実行しただけの状態。
% telnet 192.168.0.10 80
上記の状態のtcpdumpを見てみると以下のようになります。(適宜改行を入れてあります)
http://d.hatena.ne.jp/matsubobo/20070704
■質問
3-way handshakeが終了した後にサーバが一定期間ごとにSYN+ACKを送信することは
正しい実装なのでしょうか?
このようなTCP実装をしている場合、大量のソケットがオープンされてしまい、
サーバのリソースを食ってしまうことが心配事です。
SYN+ACKを再送している間、(18:39:59.729946以降の通信)
サーバのソケットはSYN_RECV状態になってしまいます。
よろしくお願いいたします。
サーバが一定期間ごとにSYN+ACKを送信することは
正しい実装なのでしょうか?
ダンプ情報を見る限り、シーケンス番号が全て同一になっています。
つまり何らかの原因で、3-way handshake が完了せず、パケットの再送を行っているようです。
-S コマンドで ACK パケットの本来のシーケンス番号が分かるので、きちんと返しているか確認するところからはじめてはどうでしょうか。
TELNET コマンドは色々と機能が有るのでこの目的には適していないように思います。
最初は私もそう思いましたが、3-way-handshakeは完了しているようです。
サーバがSYN+ACKの再送と、クライアントがそれに応答する。という繰り返し中にtelnetで文字を入力したら、サーバへ送信されます。
telnetで1文字でも入力すれば上記のような SYN+ACKのやりとりは行われません。
tcpdumpの-Sオプションありがとうございます。このオプションを使って試した結果、何か判明しましたら報告させていただきます。