- PR -

TCPの再送処理について

投稿者投稿内容
yshita
常連さん
会議室デビュー日: 2004/07/05
投稿数: 34
投稿日時: 2004-07-05 20:52
初めて投稿させていただきます。
これからよろしくお願いいたします。

TCPはパケットが送信先に届かなかった場合、送信元で再送を行いますが、何度、再送しても、パケットがロスしてしまう場合、いったい何回まで再送処理を行うようなっているのでしょうか?
OS依存っていうことを聞いたことがあるのですが、違うのでしょうか?

もし、知っている方がいたら教えていただけないでしょうか。
よろしくお願いします。
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-07-06 08:06
引用:

yshitaさんの書き込み (2004-07-05 20:52) より:
TCPはパケットが送信先に届かなかった場合、送信元で再送を行いますが、何度、再送しても、パケットがロスしてしまう場合、いったい何回まで再送処理を行うようなっているのでしょうか?
OS依存っていうことを聞いたことがあるのですが、違うのでしょうか?


OS依存だろうと思います。私もあまり知らないのですが...
とりあえず、SVR4 での TCP の実装では、最初に1.5秒間待ってから
再送し、以後「待ち時間を2倍に増やして再送する」というのを
繰り返して、64秒を超えたところでやめるようです。
# 「64 は 1.5 の倍数じゃないじゃん」という素朴な疑問もあるですが...

参考: "TCP/IP Illustrated, Volume 1" Chapter 21
yshita
常連さん
会議室デビュー日: 2004/07/05
投稿数: 34
投稿日時: 2004-07-08 19:52
ぽんすさん返信ありがとうございます。
非常にためになりました。
これからもよろしくお願いします。

もしどなたか、Linux(Red Hatなど)でTCPの再送処理についての
設定ファイルの場所を知っている方がいれば教えていただけないでしょうか?
よろしくお願いします。
cn009
ベテラン
会議室デビュー日: 2004/05/13
投稿数: 72
投稿日時: 2004-07-12 17:09
私もあまり詳しくないのですが、Linuxの場合
/proc/sys/net/ipv4/tcp_retries1
とか
/proc/sys/net/ipv4/tcp_retries2
とかでTCPの再送処理の確認・設定が出来るみたいです。

設定をリブート後にも保存するなら /etc/sysctl.config を使うと良いですね。

http://www.securityfocus.com/infocus/1711
でLinuxのネットワーク関連のパラメータの設定方法が紹介されてます。

/proc/sys/net/ipv4 の中には tcp_sack とか tcp_syn_retries とか
tcp_synack_retries とか tcp_fin_timeout とかイロイロありますね。

でも tcp_retries1 と tcp_syn_retries の違いがよく分かりません。
分かった方がおられたら教えてください。
yshita
常連さん
会議室デビュー日: 2004/07/05
投稿数: 34
投稿日時: 2004-07-22 21:09
cn009さん教えていただきありがとうございました。
返信が遅くなって申し訳ございません。
非常にためになりました。

Linuxの知識がそれほどないため、時間がかかるかと思いますが、
現在、理解しようとがんばっています。

これからもよろしくお願いします。
yshita
常連さん
会議室デビュー日: 2004/07/05
投稿数: 34
投稿日時: 2004-07-23 15:21
データ配送中にパケットがロスした場合に、何回までパケットを再送するかは、

http://www.silicontao.com/ProgrammingGuide/GNU_function_list/tcp.html

http://www.securityfocus.com/infocus/1711
(cn009さん教えて頂ありがとうございまたした。)

で、確認したところ、
/proc/sys/net/ipv4/tcp_retries2
で変更可能と書かれていました。

実際にLinux(Red Hat 9)で確認したところ、15と書かれていたんですが、
そんなに再送するものなんでしょうか?

英語の読解力があまりないため、不安です。

もしよかったらどなたか教えていただけなでしょうか?

[ メッセージ編集済み 編集者: yshita 編集日時 2004-07-23 15:28 ]
cn009
ベテラン
会議室デビュー日: 2004/05/13
投稿数: 72
投稿日時: 2004-07-23 15:39
引用:

でも tcp_retries1 と tcp_syn_retries の違いがよく分かりません。



すみません。tcp_retries1 と tcp_synack_retries の間違いでした。

/usr/src/linux-2.4.18/Documentation/filesystems/proc.txt によると
引用:

tcp_syn_retries
---------------

Number of times initial SYNs for a TCP connection attempt will be
retransmitted. Should not be higher than 255. This is only the timeout for
outgoing connections, for incoming connections the number of retransmits is
defined by tcp_retries1.


であり、/usr/src/linux-2.4.18/Documentation/networking/ip-sysctl.txt によると
引用:

tcp_retries1 - INTEGER
How many times to retry before deciding that something is wrong
and it is necessary to report this suspection to network layer.
Minimal RFC value is 3, it is default, which corresponds
to ~3sec-8min depending on RTO.


だそうです。

report this suspection to network layer の意味が分からないんですが
ICMPでエラー報告をするとかなんでしょうか??
cn009
ベテラン
会議室デビュー日: 2004/05/13
投稿数: 72
投稿日時: 2004-07-23 16:13
tcp_retries2 は ESTABLISHED 状態で、通信経路の問題などにより
応答が返ってこない場合にリトライする回数のようなので
15回というのは別に多いとは思いません。

ip-sysctl.txt には
引用:

tcp_retries2 - INTEGER
How may times to retry before killing alive TCP connection.
RFC1122 says that the limit should be longer than 100 sec.
It is too small number. Default value 15 corresponds to ~13-30min
depending on RTO.


とあり、デフォルトでは13〜30分の間そのコネクションのデータを保持するようなので
これが長いと感じる人はいるかもしれません。

"RTO" とは retransmission timeout の略らしいです。
また、RTO は RTT(round-trip time) を元に、指数関数的に増加するらしいです。

スキルアップ/キャリアアップ(JOB@IT)