この付録では,伝送制御プロトコル (TCP) の性能について説明します。
ソケット・オプションによって次の項目を制御することにより,プログラムで TCP のスループットをチューニングする方法について説明します。
TCP のウィンドウ・サイズ
TCP のエラー回復
TCP の往復時間
TCP の信頼性
TCP のスループットは 2 つの要因で決定されます。 つまり,ネットワークがパケットを受け入れる速度である転送速度と,TCP セグメントが送信される時間とそのセグメントの肯定応答が着信する時間との間の遅延である往復にかかる時間です。 これらの要因により,TCP 接続上で最大のスループットを得るため,肯定応答受信の前に,バッファにいれるデータ量 (ウィンドウ) が決定されます。
転送速度または往復にかかる時間,あるいはその両方の値が大きい場合,TCP が使用する省略時の設定のウィンドウ・サイズでは,パイプを完全にロードしておくには不十分なことがあります。 このような状況では,送信側は,以前に送信したデータの肯定応答を受信するまで待機しなければならないため,TCP のスループットが制限されます。
TCP 接続に使用する受信ウィンドウの最大のサイズは,受信ソケットのバッファ・サイズによって決定されます。
また,送信側からの転送速度は,送信ソケットのバッファ・サイズによって制限されます。
TCP の送信バッファおよび受信バッファでは,省略時の値は 61440 バイトです。
D.1.1 TCP ソケット・バッファ・サイズのプログラミング
アプリケーションは,接続を確立する前に,setsockopt
システム・コールの SO_SNDBUF および SO_RCVBUF オプションを使用して,省略時の TCP の送信ソケットおよび受信ソケットのバッファ・サイズの指定を変更することができます。
SO_SNDBUF および SO_RCVBUF オプションで指定できる最大のサイズは,カーネル変数
sb_max
によって制限されます。
この値を増やす方法については,D.1.2.1 項を参照してください。
最大のスループットを得るために,接続の両端の送信ソケット・バッファおよび受信ソケット・バッファを同じサイズにしてください。
setsockopt
システム・コールを使用して TCP ソケット・バッファ・サイズ (SO_SNDBUF および SO_RCVBUF) を変更するプログラムを作成している場合は,TCP 接続に使用される実際のソケット・バッファ・サイズが,指定した値より大きくなることがあることに注意してください。
この状況は,指定したソケット・バッファ・サイズが,接続に使用される TCP の最大セグメント・サイズ (MSS) の倍数でない場合に起こります。
実際のサイズは,TCP によって決定され,折衝された MSS に最も近い倍数に切り上げられた指定のサイズです。
ローカル・ネットワーク接続では,MSS は,一般にネットワーク・インタフェース・タイプおよびその最大転送ユニット (MTU) によって決定されます。
D.1.2 TCP ウィンドウ・スケール・オプション
Tru64 UNIX では, RFC 1323:『TCP Extensions for High Performance』で定義されているように,TCP ウィンドウ・スケール・オプションをインプリメントしています。 TCP ウィンドウ・スケール・オプションを使用すると,より大きなウィンドウを使用できるようになりますが,これは,帯域幅が高く遅延が長いネットワーク上の TCP のスループットを上げるために設計されたものです。 このオプションを使用すると,ローカルな Gigabit Ethernet および FDDI ネットワークでの TCP のスループットを上げることもできます。
TCP ヘッダ内のウィンドウ・フィールドは 16 ビットです。 したがって,ウィンドウ・スケール・オプションを指定しない場合,使用することのできる最大のウィンドウは,2**16 (64KB) になります。 ウィンドウ・スケール・オプションが共同動作システム間で使用されるとき,ウィンドウは最大 (2**30)-1 バイトになります。 接続の確立時に TCP 対等層間で伝送されるオプションは,実際のウィンドウ・サイズを取得するために各 TCP ヘッダ内のウィンドウ・サイズ値に適用される,スケール・ファクタを定義します。
最大受信ウィンドウも,また,接続確立時に TCP が提供するスケール・ファクタも,最大受信ソケット・バッファ・スペースによって決定されます。
受信ソケット・バッファ・サイズが 65535 バイトより大きな値の場合,TCP は,接続確立時に,受信ソケット・バッファのサイズに基づいたスケール・ファクタを使用してウィンドウ・スケール・オプションを指定します。
TCP 接続された2つのシステムは,接続時にどちらかの方向に発生するウィンドウ・スケーリング用の,SYN セグメント内のウィンドウ・スケール・オプションを送信しなければなりません。
前述したように,スループットを最大にするため,接続の両端の送信バッファおよび受信バッファを,同じサイズにしてください。
D.1.2.1 システム・ソケット・バッファ・サイズ制限の増加
ソケット・カーネル・サブシステムの
sb_max
カーネル属性は,各送受信バッファに対して割り当てられるソケット・バッファ・スペースの量を制限します。
現在の省略時の値は 1048576 バイト (1MB) ですが,値を増やすこともできます。
ローカルな Gigabit Ethernet 接続では,現在の値で十分です。 遅延が長くて帯域幅が高いパスに対しては,値を 1MB より大きくする必要があります。
メモリ内に現在あるカーネルの
sb_max
カーネル属性を変更するには,dxkerneltuner
ユーティリティか
sysconfig -r
コマンドを使用します。
詳細については,
dxkerneltuner
(8)sysconfig
(8)D.2 TCP の性能とエラー回復
TCP は,宛先にパケットが到着したかどうかを肯定応答によって判断します。 大きなウィンドウを使用する高速のコネクション (Gigabit Ethernet など) では,省略時のメカニズムを使用すると,スループットに大きく影響することがあります。
特に指定しなければ,パケットが紛失すると,TCP はそのパケットとそれ以降のパケットをすべて再送します。
アプリケーションでは,コネクションの確立前に TCP_SACKENA オプションを指定した
setsockopt
を使用することで,この省略時の動作を無効にできます。
このオプションが合意されると,データ受信側は送信側に,正しく到着したセグメントすべてについての情報を通知できるようになります。
このようにすると,送信側が再送する必要があるのは,実際に紛失したセグメントだけになります。
このオプションは,複数のセグメントが欠落した場合に便利です。
D.3 TCP の性能と往復時間の計測
TCP は,ウィンドウごとにパケットを 1 つだけ使って,往復時間を計測します。 大きなウィンドウを使用する高速のコネクション (Gigabit Ethernet など) では,往復時間の性能が非常に悪いと判断され,再送が多く発生する可能性があります。
特に指定しなければ,TCP は TCP ヘッダにタイムスタンプを設定して送信することはありません。
アプリケーションでは,コネクションの確立前に TCP_TSOPTENA オプションを指定した
setsockopt
システム・コールを使用することで,この省略時の動作を無効にできます。
このオプションの選択後,送信側は各データ・セグメント内にタイムスタンプを格納します。
受信側は,これらのタイムスタンプを受け付けるように構成されていれば,ACK セグメントにそのタイムスタンプを入れて返送します。
これにより送信側は,往復時間を計測する,信頼性の高いメカニズムを利用できます。
D.4 TCP の信頼性とシーケンス番号
TCP はシーケンス番号を使用して,パケットの順序が正しいかと,重複したパケットを受信していないかを判断します。 高速のコネクション (Gigabit Ethernet など) では,シーケンス番号が一巡する可能性があります。 つまり,異なる情報を含む 2 つのパケットが,同じシーケンス番号となる可能性があります。 これらのパケットは重複しているわけではありませんが,TCP は重複と判断してしまいます。
特に指定しなければ,TCP での古い重複パケットを拒否するメカニズムは有効になっていません。
アプリケーションでは,コネクションの確立前に,TCP_TSOPTENA オプションを指定した後で TCP_PAWS オプションを指定した
setsockopt
システム・コールを使用することで,この省略時の動作を無効にできます。
PAWS (Protect Against Wrapped Sequence numbers) オプションが有効になると,受信側は受信した古い重複セグメントを拒否します。
このオプションは,同期型 TCP コネクションでのみ使用されます。