TCPネットワーク通信のためのNagleアルゴリズム

エンジニアのJohn Nagleの名前を冠したNagleアルゴリズムはTCPアプリケーションの 「小さなパケットの問題」によって引き起こされるネットワーク輻輳を軽減するように設計されていますUNIXの実装は1980年代にNagleのアルゴリズムを使い始めましたが、今日でもTCPの標準的な機能です。

Nagleアルゴリズムの仕組み

Nagleのアルゴリズムは、 naglingと呼ばれる方法でTCPアプリケーションの送信側のデータを処理します。 小規模なメッセージを検出し、より大きなTCPパケットに蓄積してから、ワイヤを介してデータを送信することで、不必要に多数の小さなパケットの生成を回避します。 Nagleのアルゴリズムの技術仕様は、1984年にRFC 896として発行されました。 多くのデータが蓄積されるかどうか、および送信の間にどれくらい待つかは、全体的なパフォーマンスにとって重要です。

Naglingは、ネットワーク接続の帯域幅をより効率的に利用して、遅延( レイテンシ )を追加するという犠牲を払うことができます。 RFC 896に記載されている例は、潜在的な帯域幅の利点とその作成理由を示しています。

アプリケーションは、TCP_NODELAY ソケットプログラミングオプションを使用してNagleアルゴリズムの使用を制御します。 Windows、Linux、およびJavaシステムでは通常、デフォルトでNagleが有効になっているため、これらの環境用に作成されたアプリケーションは、アルゴリズムをオフに切り替えるときにTCP_NODELAYを指定する必要があります。

制限事項

Nagleのアルゴリズムは、TCPでのみ使用できます。 UDPを含む他のプロトコルは、それをサポートしていません。

Nagleが有効になっている場合、 インターネット通話や一人称シューティングゲームなどの高速ネットワークレスポンスを必要とするTCPアプリケーションはうまく動作しない可能性があります。 アルゴリズムがデータの小さなまとまりを一緒に組み立てるために余分な時間を要するために生じる遅延は、画面上またはデジタルオーディオストリーム上で目に見える遅れを引き起こす可能性があります。 これらのアプリケーションは通常、Nagleを無効にします。

このアルゴリズムはもともとコンピュータネットワークが今日よりはるかに少ない帯域幅をサポートしていた時に開発されました。 上記の例は、1980年代初頭のフォード・エアロスペースでのJohn Nagleの経験を基にしています。ここでは、ゆっくりと負荷のかかる長距離ネットワークのナーグトレードオフが理にかなっています。 今日、ネットワークアプリケーションが彼のアルゴリズムの恩恵を受ける状況はますます少なくなっています。