高度な検索
Developer Connection
Member Login ログイン | ご入会 ADC連絡先


NW 26 - 大量の小型のパケットの交換は TCP の性能低下を起こす

(98 年 5 月 25 日更新)


Q: 自作の Open Transport TCP アプリケーションはたくさんの小さなパケットで情報交換します。相手側に応答を求める場合もそうでない場合もあります。パケットの送信に遅延が発生し、著しく性能が低下する場合があります。この問題を解決するにはどうしたらよいでしょうか。

A: 原因として考えられるのは TCP_NODELAY オプションです。XTI 仕様によると、たいていの状況では TCP はデータが渡されるとすぐに送信します。しかし、確認 (ACK) を得ていない送信データがある場合は、TCP は少量のデータの送信を遅らせ、ひとつのパケットにまとめておき、確認を受信してから送信します。このテクニックは Nagle アルゴリズムと呼ばれ、いわゆる「send-side silly window syndrome (送信側が愚かなウィンドウイングを行う現象)」を防ぐために設計されました。アプリケーションが一度に 1 バイトずつデータを生成すると、ネットワークにはデータ部分がわずか 1 バイトの TCP パケットが大量に流れてしまいます。Nagle アルゴリズムはこれを防ぎます。

アプリケーションの中にはこうしたパケット処理により著しい遅延が発生するものがあります。TCP_NODELAY オプションを設定するとこのアルゴリズムは無効になります。次のコードの断片はこのオプションの設定方法を表します。

err = SetFourByteOption(ep, INET_TCP, TCP_NODELAY, 1);

このコードは SetFourByteOption を使っていますが、これは『Inside Macintosh: Networking with Open Transport』の表 7-5 に載っています。

一般に、Nagle アルゴリズムを無効にするのは得策ではありません。ネットワークの使用効率が下がるからです。論理的に関連のあるデータをすべてまとめて送信するようにアプリケーションを構築するのがもっとすぐれた解決方法です。この場合、OT の不連続データの送信機能が役に立つと思います。

Rich Kubota (執筆)
Quinn "The Eskimo!" (改訂)
Worldwide Developer Technical Support

 


[ Technical Q&A's : Network : NW26 ]