2014年6月7日土曜日

Tips:ネットワークあたりのトピックス


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が無効
 
■Linux

 socketオプションでTCP_NODELAYを指定し、マシンA側でNagleアルゴリズムをオフにする。

TCP遅延ACK
小さなデータを受信した際に、毎回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}*
  値の名前:TcpDelAckTicks
  値:(DWORD)2(200ms)がデフォルト。1-6(100-600ms)を指定できる。0,1は200msになるらしい。

■Linux

 socketオプションでTCP_QUICKACKを指定することで、遅延ACKを無効化できるみたい(でも永続的ではないよう
 なので、使用の際には注意が必要みたい)。

 もう1つ遅延ACKの送信のタイムアウトの設定は以下の設定でできるみたい。
 Redhat系:echo 1 > /proc/sys/net/ipv4/tcp_delack_min ※ミリ秒単位で指定


0 件のコメント:

コメントを投稿