web-dev-qa-db-ja.com

TCPマージされたメッセージ?

186バイト(ヘッダーを除く)の100を送信するアプリケーションがありますTCPメッセージをホストAからホストBにギャップなしで連続して送信します。

私はtcpdumpを実行してホストA(送信者がいる場所)のパケットをキャプチャしましたが、(9のような)いくつかのメッセージの後に、次の〜25メッセージが1つの5 + Kメッセージにマージされることに気付きました。

送信側アプリケーションのsetsockopt()を使用してNagleのアルゴリズムをすでにオフにしており、計算されたTCPウィンドウは常に14Kバイトを超えています。したがって、最初の9つのメッセージのようには見えません。ホストBがいっぱいになり、ホストBはホストAにスローダウンを要求しました。

TCPメッセージがマージされた理由を理解する方法に関するヒントはありますか?

ありがとう!

3
Hei

私は、186バイト(ヘッダーを除く)の100を送信するアプリケーションがありますTCPメッセージをホストAからホストBにギャップなしで連続して送信します。

次に、ネットワークがトランスポートするよりも速くそれらを送信している可能性があります。その場合、送信者のTCP実装がネットワークでパケットを送信する準備ができるまでに、複数存在する可能性があります。キューに入れられたメッセージ。この場合、1つのTCPセグメントでできるだけ多く送信されます。TCPプロトコルは、バイトストリームサービスを提供します。 noメッセージ境界の概念があるため、それを行うことが許可されています。

Nagleのアルゴリズムをすでにオンにしています

Nagleのアルゴリズムあなたが言っていることを明示的に行いますTCP送信者が実行しています

Nagleのアルゴリズムは、多数の小さな送信メッセージを組み合わせて、それらを一度に送信することで機能します。

したがって、onをオンにしても、それを防ぐことはできません。これをoffにすると、場合によってはそれを防ぐことができますが、アプリケーションがメッセージのバーストを送信する場合、それを防ぐことはおそらくできません。

(つまり、「送信者のTCPがメッセージをマージした理由は?」に対する答えは、「できるから」です。)

3
user137177

表示されているのは、カーネルネットワークスタックからネットワークインターフェイスやドライバーにオフロードされている機能が原因であると考えられます。

ネットワークインターフェイスは、ネットワークから個々のパケットを受信し続けます。しかし、パケットがカーネルに渡される前に、それらはインターフェースまたはドライバーのいずれかによってマージされます。

次のコマンドを使用して、すべてのオフロード機能の現在の設定を確認できます。

ethtool -k eth0

この特定の機能を無効にする場合は、次のコマンドで実行できます。

ethtool -K eth0 generic-receive-offload off

この古い質問 でオフロードの詳細を読むことができます。

1
kasperd