web-dev-qa-db-ja.com

TCPエンジンはいつACKを送信することを決定しますか?

私のLANには、Sambaサーバーを実行するルーターがあり、PCはルーターに接続します。

サーバーへのアップロードとサーバーからのダウンロード中にワイヤーシャークを実行しました。

Wiresharkの結果は次のことを示しています。

  • アップロード中、サーバーは平均0.6msごとにACKを送信します
  • ダウンロード中、私のPCは平均0.025msごとにACKを送信します

その結果、ダウンロードでは約120,000フレームが生成されますが、アップロードでは70,000フレームしか生成されません。また、ダウンロード速度は約12.7Mバイト/秒、アップロード速度は20Mバイト/秒です。

だから私はこれの考えられる理由を理解したいと思います。

4
sliter

返されるACKパケットの量を減らすには、主に2つのメカニズムがあります。NagleアルゴリズムとDelayed ACKで、どちらも RFC 1122 で説明されています。どちらもオプションであるため、それらを使用しないように構成されているか、適切な実装が欠落しているホストがあります。 特に、構成でsocket options = TCP_NODELAYを使用することにより、SambaにNagleアルゴリズムを無効にするように指示できます

SMBファイルコピーのアップストリーム/ダウンストリームデータレートの違いには、TCP ACKパケットが豊富にあること以外の理由がある可能性があります。

3
the-wabbit

TCP実装は1つおきのデータパケットをACKします。したがって、通常、2つのデータパケットが受信されてからACKが送信されます。もちろん、送信者はACKを待機していません。 ACKがない場合でも、ウィンドウがいっぱいになるまで送信を続けます。

Nagleや遅延ACKなど、ここで潜在的に関係している他の要因があります。しかし、あなたがそれらの影響を見ているようには見えません。

2
David Schwartz