- - PR -
TCPの再送処理について
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-07-23 17:58
>cn009さんへ
tcp_retries1 と tcp_synack_retriesの違いでいいのでしょうか? 引用には、tcp_syn_retriesとtcp_retries1の説明がのせてあったので。 | ||||||||
|
投稿日時: 2004-07-23 19:17
はい、tcp_retries1 と tcp_synack_retries の違いでした。 間違えて tcp_syn_ack と書いたのに気付いて慌ててしまい、 頭が混乱していたようです。 | ||||||||
|
投稿日時: 2004-07-24 23:15
>cn099さんへ
/proc/sys/net/ipv4にあるtcp_synack_retiresとtcp_retries1tcp_synack_retires について調べてみました。 まず、tcp_synack_retries1はコネクションを確立する際の受信側の話です。 また、tcp_retriesは、コネクションが接続された後のデータ配送における話です。 ・tcp_synack_retries TCPにおいてコネクションを確立するためには、送信側からSYNパケットを送り、 受信側にSYNパケットが届いたら受信側ではSYNACKパケットを送信側に送ります。 そして、送信側にSYNACKパケットが届くと、送信側はACKパケットを受信側に送る ことによりコネクションが確立されます。 もし、受信側が SYNACKパケットを送信した後,送信側が ACKパケットを送らない とどうなるでしょうか?受信側は、一定時間待ってもACKパケットが帰ってこない と、SYNACKパケットが途中で失われたと判断して SYNACKパケットを再送します。 tcp_synack_retriesは、TCP コネクションを試みるために、このSYNACKを再送する 回数です。値は255未満にする必要があり、既定値は5で、約180秒に相当します。 ・tcp_retries1 コネクションが確立されている接続上において、TCPがネットワーク層(IP層) にエラーの原因を報告せずに同じ再送方法で再送を試みる回数である。再送回数 がtcp_retries1を越えると、まず最初に、新しい再送を送る前に、可能ならば、 ネットワーク層(ネットワーク層は、パケットのルーティングを行っている。)に 経路を更新させる。デフォルトは3です。 tcp_synack_retriesはあっていると思うんですが、tcp_retires1の 「ネットワーク層へのエラー報告」というのが少しあいまいです。 あまりお役に立てなくてすみません。 [ メッセージ編集済み 編集者: yshita 編集日時 2004-07-24 23:19 ] [ メッセージ編集済み 編集者: yshita 編集日時 2004-07-24 23:21 ] [ メッセージ編集済み 編集者: yshita 編集日時 2004-07-24 23:23 ] | ||||||||
|
投稿日時: 2004-07-28 22:49
わざわざ日本語訳ありがとうございます。 そして、返信が遅くなってすみません。
私もこの部分がよく分からなかったんです。 IP等のL3実装コンポーネント等に連絡して、ルーティングの変更を試みるんですね。 ところで、その原文はどこにあるのでしょうか? 私の手元の /usr/src/linux-2.4.18/Documentation/networking/ip-sysctl.txt ではそれほど詳しく書かれていません。 (追記) http://ktarn.www.linux.or.jp/JM/html/LDP_man-pages/man7/tcp.7.html でしょうか? # 手元のは man-pages-1.38-1 と man-pages-ja-20011215-1 と古かったのが # 悪かったみたいです。すみません。 [ メッセージ編集済み 編集者: cn009 編集日時 2004-07-28 23:12 ] [ メッセージ編集済み 編集者: cn009 編集日時 2004-07-28 23:41 ] | ||||||||
|
投稿日時: 2004-08-01 19:32
返信が遅くなってごめんなさい。
tcp_retries1、tcp_synack_retriesについては、cn009さんが書いてあるとおり 以下を参考にしました。 http://ktarn.www.linux.or.jp/JM/html/LDP_man-pages/man7/tcp.7.html また、SYNACKパケットがどのようなときに再送されるか知りたかったので、 以下のURLの「SYN フラッディング」という題目で書かれている一文を参考 にしました。 http://www.gcd.org/sengoku/docs/NikkeiLinux00-10/tcp-attack.ja.html コネクション確立の際のの3ハンドシェイクの方法が わかれば、tcp_synack_retriesについては理解できると思います。 tcp_retries1は、いろいろ調べても、良い資料がないため、 理解がいまだに少しあいまいです。 おやくにたてないでごめんなさい。 | ||||||||
|
投稿日時: 2004-08-26 20:45
ネットワーク上でTCPによりパケットがどのように再送されるか調べ
る必要があり、tcpdumpを用いて観測したところ理解ができないこと があったので投稿させていただきました。 Aが送信元でありBが送信先です。 送信先でtcpdumpを起動しました。 ・再送ケース1 A > B:. 1074297:1075745(1448) ack 1 win 57920 B > A:. ack 1075745 win 63712 A > B:. 1078641:1080089(1448) ack 1 win 57920 B > A:. ack 1075745 win 63712 A > B:. 1080089:1081537(1448) ack 1 win 57920 B > A:. ack 1075745 win 63712 A > B:. 1075745:1077193(1448) ack 1 win 57920 A > B:. 1077193:1078641(1448) ack 1 win 57920 B > A: .ack 1078641 win 60816 この場合、1075745〜1078641まで2つのパケットがロスして いるため2つのパケットだけが再送がかかっています。 ・再送ケース2 A > B:. 3886465:3887913(1448) ack 1 win 57920 B > A:. ack 3887913 win 14480 A > B:. 3893705:3895153(1448) ack 1 win 57920 B > A:. ack 3887913 win 14480 A > B:. 3895153:3896601(1448) ack 1 win 57920 B > A: . ack 3887913 win 14480 A > B:. 3896601:3898049(1448) ack 1 win 57920 B > A: . ack 3887913 win 14480 B > A: . ack 3887913 win 28960 B > A: . ack 3887913 win 59368 A > B:. 3887913:3889361(1448) ack 1 win 57920 B > A: . ack 3889361 win 60816 A > B:. 3889361:3890809(1448) ack 1 win 57920 B > A: . ack 3890809 win 60816 A > B:. 3890809:3892257(1448) ack 1 win 57920 B > A: . ack 3892257 win 60816 A > B:. 3892257:3893705(1448) ack 1 win 57920 B > A: . ack 3898049 win 60816 A > B:. 3893705:3895153(1448) ack 1 win 57920 B > A: . ack 3898049 win 63712 A > B:. 3895153:3896601(1448)ack1 win 57920 この場合、3887913〜3893705まで4つのパケットが 再送されています。 これはわかるのですが、その後何故、届いているはずの 3893705〜3896601も続けて送っているのでしょうか? この後、普通に3896601からデータを続けて送ります。 上記の再送ケース1では、ロスしたパケットだけ再送して いるのに、ケース2では届いたはずのパケットまでもう一度 送っているのでしょうか? その原因を教えていただけないでしょうか? よろしくお願いいたします。 | ||||||||
|
投稿日時: 2004-08-29 17:46
説明しやすくするために番号を振ってみました。
・再送ケース2 (1) A > B:. 3886465:3887913(1448) ack 1 win 57920 (2) B > A:. ack 3887913 win 14480 (3) A > B:. 3893705:3895153(1448) ack 1 win 57920 (4) B > A:. ack 3887913 win 14480 (5) A > B:. 3895153:3896601(1448) ack 1 win 57920 (6) B > A: . ack 3887913 win 14480 (7) A > B:. 3896601:3898049(1448) ack 1 win 57920 (8 ) B > A: . ack 3887913 win 14480 (9) B > A: . ack 3887913 win 28960 (10) B > A: . ack 3887913 win 59368 (11) A > B:. 3887913:3889361(1448) ack 1 win 57920 (12) B > A: . ack 3889361 win 60816 (13) A > B:. 3889361:3890809(1448) ack 1 win 57920 (14) B > A: . ack 3890809 win 60816 (15) A > B:. 3890809:3892257(1448) ack 1 win 57920 (16) B > A: . ack 3892257 win 60816 (17) A > B:. 3892257:3893705(1448) ack 1 win 57920 (18) B > A: . ack 3898049 win 60816 (19) A > B:. 3893705:3895153(1448) ack 1 win 57920 (20) B > A: . ack 3898049 win 63712 (21) A > B:. 3895153:3896601(1448)ack1 win 57920
それは (19) や (21) の事でしょうか? Aでキャプチャしたデータが無いので、あくまでも推測ですが (18) のパケットがAに届く前に送信されたパケットだと思います。 また、(18) や (20) のACKパケットが途中で消えた可能性もあります。 Aが (19) や (21) を送信したときに (18) が届いていなければ 3898049 から送信すれば良いという事を知らないので (17) の続きを送信する事になります。 (4) のACKパケットを送信した後、(5) や (7) のパケットを受信しているので 送信してから相手に届くまでタイムラグがあると推測されます。 空きWindowサイズも影響するはずですが、14480バイトあるので あまり影響は無いと思います。 端末のドライバはフレームを受信し終わってから 上位層のIP層などに渡すのでケーブル直結でも遅延が生じます。 また、フレームの破損を検出できるストア・アンド・フォアード方式の スイッチなどは受信し終わってから送信するのでここでも遅延が生じます。 余談ですが、10Mのイーサネットの場合、1ビットを送信する時間は 100ナノ秒なので、1448バイトのデータを含むTCP/IPパケットを Ethernetフレームで送信する間隔は最短では { 1448(データ) + 20(TCPヘッダ) + 20(IPヘッダ) + 14(MACヘッダ) + 4(FCS) + 8(プリアンブル) + 12(フレーム間ギャップ) } * 8(ビット) * 100ナノ秒 = 1526(バイト) * 8(ビット) * 100(ナノ秒) = 約1.22ミリ秒 となります。 100Mのイーサネットの場合はこの1/10になります。 ギガビットの場合はジャンボフレームとかあるので ・・・省略です。(本当は勉強中です [ メッセージ編集済み 編集者: cn009 編集日時 2004-08-29 17:49 ] [ メッセージ編集済み 編集者: cn009 編集日時 2004-08-29 17:51 ] | ||||||||
|
投稿日時: 2004-08-30 14:23
cn099さんいつも教えていただきありがとうございます。
問題点が解消されました。 受信側では、(3),(5)と(19),(21)は同一パケットですが、 採用しているのは、(3),(5)の方で(19),(21)は破棄し ているんですよね? また、質問させていただくことがあるかもしれませんが そのときはよろしくお願いいたします。 | ||||||||
