MSS(MaximumSegmentSize:最大セグメントサイズ)
MTU(MaximumTransmissionUnit)
MSSはTCP/IPにおいて1セグメントで送信できる最大サイズ。IPヘッダ(20バイト)、TCPヘッダ(20バイト)は含まない。
MTUは1回の転送(1フレーム)で転送できる最大サイズ。
PPPoEの場合は、ヘッダーが追加されるので、、
となる。ちなみにRWIN ( Receive Window Size ) は、ACKを待たずに送信できるサイズ。受信側のバッファサイズとなる。
Nagleアルゴリズム
IPヘッダーやTCPヘッダーのオーバーヘッドを軽減することが目的。よくある例は、telnetのように1バイトずつ送信するような場合、実際にはこの1バイトにに対してIPヘッダー20バイト、TCPヘッダー20バイトが付き、計41バイト送付することになり、伝送効率が非常に悪くなる(「小さなパケット問題」)。
Nagleアルゴリズムでは、MSS以下の複数の送信メッセージを一つに束ね、まとめて送信する。特に、送信パケットで送信側が ACK を受け取っていないのがある場合、送信するに値するまで送信側はバッファリングを行い、そして、一度にまとめて送信することで、効率を上げる。送信をする条件としては
- 未送信データが最大セグメントサイズ以上になる
- 過去の送信パケットで ACK が未受信の物がなくなる(*)
- タイムアウトになる
がある。これに関する各OSの設定は、以下の通り。
■Windows
Nagleアルゴリズムを無効化するオプション
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSMQ\Parameters
値の名前:TcpNoDelay
値:(DWORD)0が有効、1が無効
socketオプションでTCP_NODELAYを指定し、マシンA側でNagleアルゴリズムをオフにする。
小さなデータを受信した際に、毎回ACKを返すのは効率が悪いので、ちょっとだけ待ち(最大500ms)、その後のデータの応答とACKをまとめて返すことで効率を上げる仕組み。ただしMSS以上のデータを受信した際には、2回目の受信でACKを返さなければならない。
がある。これに関する各OSの設定は、以下の通り。
■Windows
TCP遅延ACKの頻度を指定する
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{Interface GUID}*
値の名前:TcpAckFrequency
値:(DWORD) デフォルト2。変更する際は1。
※デフォルトでは、セグメントを2個受信したらACKを返す。1にするとセグメント毎にACKを返す(つまり
TCP遅延ACKを無効化)。
ACKのタイムアウト値の設定
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{Interface GUID}*
■Linux
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{Interface GUID}*
値の名前:TcpDelAckTicks
値:(DWORD)2(200ms)がデフォルト。1-6(100-600ms)を指定できる。0,1は200msになるらしい。
socketオプションでTCP_QUICKACKを指定することで、遅延ACKを無効化できるみたい(でも永続的ではないよう
なので、使用の際には注意が必要みたい)。
もう1つ遅延ACKの送信のタイムアウトの設定は以下の設定でできるみたい。
0 件のコメント:
コメントを投稿