MTUという名の暗黒大陸(FAQ)

初版 01/20/2002、第2版 03/30/2002

メールで「MTU」に関する質問も時々来るためFAQを作りました。
誤解が未だに自己増殖を続けているのは、ホントに困ったことですね(^^;
何か書けば書いたで余計にメンドーな質問が来るのを恐れつつも…(^^;


Q0 MTUって何なのさ?  
Q1 MTUってよくわからないんですが、調整する必要あります?
(MTU調整やMTU指定の必要性) 
Q2 自分のMTUの値って、どこを見ればわかるんですか?
(TCP交信時に相手ホストに通知される自ホストMTUの実際値:正確には通知されるMSS暫定値+40) 
Q3 MS-Windowsで MTUや各種 TCP設定を既定値に戻すには?

Q4 MTUを変更しても SpeedGuide.net で見ると変わらない
(無効な MTU指定) 
Q5 pingで調べたら MTU=1472。なぜに?
(PMTUとその調べ間違い) 
Q6 某ツールでMTUを自動調整モードにしています。固定の方がいいですか?
(PMTU発見機能に関するよくある誤解) 
Q7 フレッツADSLなのでMTUが1454です。1500にする方法ってないですか?
(過大MTU設定) 
Q8 PPPoE対応ルータを使っていますが、各PCの MTUも設定すべき?
(ルータ経由の LAN側ホスト、TCP-MSS調整機能) 
Q9 一番速い MTU を簡単に知る方法ってないですか?
(MTUと二種類の「速さ」の関係について)  ATM効果-補足

 

Q0 MTUって何なのさ?
(「何々とは…」の話は長くてわかりにくい。飛ばし読みするのが一番^^;)
郵便で書類を送る場合、封筒に詰めて宛名書きして送るように、インターネットでは「パケット」(正確には「IPデータグラム」)と呼ばれる梱包された単位でデータが送られます。また大量の書類(データ)は、幾つもの封筒(パケット)に分けて配送されます。

ところで、ネットの輸送手段や中継点は完全に機械化されているため、扱える封筒(パケット)のサイズには自ずと限界があります。ただしインターネット(=ネット間ネット)は、それに参加する各ネットの自由を最大限に認めるのが特徴であり、それが急速な進歩と爆発的な普及とをもたらした鍵でもあるため、扱える封筒(パケット)の上限サイズもバラバラです。

このネットの送信元や中継点などが、各々次に渡すことのできる封筒(パケット)サイズの上限MTU と言います。

MTU = Maximum Transmission Unit = 最大伝送単位 (rfc791で定義)

そのサイズがバラバラでもインターネットが機能して来たのは、大きすぎる封筒(パケット)の「詰め替え機能」が準備されていたからです。つまり、次に渡せないような大きな封筒(パケット)が来た場合には、渡せるサイズの複数の封筒(パケット)に 中身を詰め替えて送ることができます。これをパケットの断片化(フラグメンテーション)と言います。しかし断片化されたパケットは、最後に受け取った宛先のホストが、番号にしたがって元の状態に「組み直す」必要があります。これをパケットの 再組立(リアセンブリー)と言います。

このパケットの断片化や再組立は、機器にかなりの負荷をかけるため、インターネットの交通量が増加するにつれて、最小限 576バイト長のパケットは通すような習慣ができました。(インターネット・ホストが処理できることを要求されるパケット長は最大 576バイト:rfc791) さらに時代が進むと、イーサネット(=現在 LANカードの標準規格)の最大値である 1500バイト長のパケットが大量にネット上を流れるようになり [*]、イントラネットの普及によって他方式が一掃されたこともあいまって、それを断片化なしに通せないような中継機器は、多くの一般利用者がアクセスするネットワーク経路上からは姿を消しました。(ちなみに最近の IPv6では、要求される最小限度が 1280バイトで、推奨値は 1500バイト以上: rfc2460 )

    [*] ただし、送信側のホストが MTUを 1500に設定しても、常に最大 1500バイト長のパケットが送信されるわけではないです。TCPを使った交信では、最初の TCP接続確立時に、1パケットの TCP最大データ長(=MSS=最大セグメント・サイズ )を互いに相手側に伝えます。そしてデータ送信側は、受信側が指定した MSSを超えないパケットサイズで送信します。つまり両側ホストは、互いに相手の MTUを見て、適切に送信パケット・サイズを選んでいるのと同等になります。
    したがって、パケットの断片化が発生するのは、両端ホストを結ぶ道筋に、両端ホストの小さい方の MTUよりも、さらに小さな MTUを持つ中継点が存在する場合です。そのため、一方のホストだけ MTUを調整してやれば、断片化や PMTU-Dブラックホールなどが引起こす「隘路問題」を回避することができます。

こうして、LANカード経由(=イーサネット経由)で使用できる最大長 1500バイトのパケット( rfc894 )や、ダイヤルアップIP接続(=PPP接続)の既定長 1500バイトのパケット(rfc1661)などが、主な経路で断片化なしに効率的に通るようになった時、ブロードバンド化の波の中から出現したのが PPPoE(イーサネット上のPPP) と呼ばれるアクセス方式です。この PPPoE方式が、大半のインターネット利用者の意識からは消えていた「隘路問題」を、再浮上させることになりました。

PPPoE方式では、LANカード経由(=イーサネット経由)で送ることができる最大長1500バイトの中に、さらに「PPP」で包んだパケットを入れるために、PPP(+PPPoEヘッダ)の厚みを引いた長さのパケット(典型的には「NTT-フレッツ」などの 1454バイト)しか通すことができなくなります。つまり、PPPoE方式で転送される部分だけ、(ほんの少し)道が狭くなるわけです。

 自ホスト------アクセスサーバ===一般のインターネット===相手ホスト
    (PPPoE隘路)

しかしながら、当然、専用の接続ツールが必要な自ホストの MTU変更をやってくれるので、それでも一般利用者には何も問題はなかったのです。しかし同時にその頃、パワーユーザは(複数のホストを同時に使うために) UNIX機を利用した NATルータを導入し始めていて、当時の NATルータにはまだ TCP-MSS自動調整機能が導入されていないものが多かったため、終端ホスト側の MTU値を、既定の 1500 から 1454 などに変更する必要が生じました(断片化したパケットを NATルータが再組立できない場合や PMTU-Dブラックホールのケースで問題が発生するため)。

 自ホスト===NATルータ------アクセスサーバ===一般のインターネット===相手ホスト
     (PPPoE隘路)

このあたりから「MTU調整が必要」というウワサが、一般ユーザに流れ始めたように思います。

さらに、広帯域アクセス環境では TCP受信窓(RWIN)の不足がスループットの低下を招くため、適切な値に変更する必要のある話や、遅延の大きな電話音声回線用モデムや ISDNで、かなり以前からレスポンス改善を目的に行われていた「MTU調整」の話(実際には都市伝説的部分もかなりある^^;)などがミックスして、いまや「MTU」というやや専門的な用語が、一般ユーザの目に飛び込んで来ては不安にさせる、そんな混乱した事態になってしまったというわけですね(^^;。

Q1 MTUってよくわからないんですが、調整する必要あります?
(MTU調整やMTU指定の必要性)
次のようなことが起きている場合には、MTUをより小さな値に調整する必要があります。

[症状]

  1. 見れない大手の Webサイトが幾つかある(たぶんこの @Niftyサイトも^^;)。しかし同じ ISP(プロバイダ)を使っている他の利用者は、問題なく見れるという。  
  2. 少し長いメールや添付ファイル付きメールだけが"送信"できない。 
  3. FTPで(ログインや主な命令は作動するのに)ファイルを転送できない。ただし例外的に小さなファイルは問題ない。

[典型例]

  • MS-Windowsの ICS(インターネット共有=NATルータ)機能を使い、かつインターネット・アクセスが PPPoE 方式の場合。(解決法は ここ 
  • インターネット・アクセスが PPPoE方式で"RASPPPoE"というフリーの接続ツールを導入し、RASPPPoEの MTU調整機能が未設定の場合。

上のような障害が発生していない場合には、「技術的に明確な理由」が存在しない限り、MTU 既定状態に利用者が変更を加えるのは「百害あって一利なし」と思っておくのが一番健全です(^^;。(「 使えているコンピュータ環境はいじるな」という昔からの鉄則もありますし…^^;)

ただし、自分ではシステムの既定状態を変更していないつもりなのに、 既定状態を変更してしまうソフト(Realダウンロードや Web加速ソフトなど)を導入してしまっているケースも、かなりあります(普通はそのソフトを削除した後も変更状態が残ってしまう)。そのため Q2 のやり方で、一度は自分の環境の MTU や RWIN など、TCP/IP設定を調べておいた方が良いでしょう。(つまり一種の 健康診断ですね) MS-Windowsの MTUや各種 TCP/IP設定を既定状態に戻す方法は、 Q3 にあります。

どうしても少しマニアックな調整をやってみたいという堪え性の無い人(^^;は Q9 を参考にして下さい。

Q2 自分のMTUの値って、どこを見ればわかるんですか?
(TCP交信時に相手ホストに通知される自ホストMTUの実際値:正確には通知されるMSS暫定値+40)
まず「診断くん」でプロクシ判定をしておきましょう。  ここをクリック

    総合評価:?(A 以上 or 生 IP。下記参照)
    疑惑 0%:proxy の兆候は全く見られません。

と出れば一応「合格」です[*]

    [*] プロクシなど、一般に自ホストの TCP/IP接続を 代行するホストが介在していると、以下の方法では「自ホストの環境」ではなく「代行ホストの環境」が表示されてしまうため、この確認が必要になります。一部の CATVや組織の LAN経由などで、代行ホストを通さないとインターネットにアクセスできない環境の場合、自ホスト環境の実際値を調べる一般的で簡単な方法は、残念ながら(いまのところ)存在しないと思います。

次に、 ここ(SpeedGuide.net) をクリックすると、自環境の TCP/IP特性がわかります。

別窓に表示された表の、上から二段目に

    MTU = xxxx (xxxxはある数)

という欄がありますね? それが今インターネットにアクセスしている環境での「自ホスト MTU」の実際値です。

  • 「MTUが 1300以上」だったら、とりあえず「問題なし」と思って下さい。
  • 「MTUが 1300未満」だったら、『何か(または誰か)が MTUを変更したので、やり方を調べて 既定値に戻しておいた方が良いかも…』 と思っておいて下さい。ただし電話音声回線用モデムや ISDNでインターネットにアクセスしていて、かつ MS-Windowsのダイヤルアップ接続を使用している場合には、「MTU=576」が既定値です(その評価については Q9 参照)。

ちなみに、その表の中でもっと大事なのは、上から四段目にある

    Default Receive Window (RWIN) = xxxxx (xxxxxはある数)

という RWIN の値です。

  • この RWIN値がアクセス環境に合わないほど小さいと、下り実効速度(=実効受信速度)が抑制され、スループットが出なくなってしまいます("上り=データ送信"には影響しない)。 また、あまりにも大きいと不必要にリソースを浪費し、負荷の増加が(相手ホストも含めた)システム全体に悪影響を与えます。  
  • 必要な RWIN値は、アクセス手段の速度だけでなく、相手ホストとの往復時間(ブロードバンド化の進行で現在急速に改善されつつある)にも依存します。したがって、アクセス手段、アクセス・プロバイダ、アクセス地域、頻繁に利用する相手ホストの範囲などによって条件が異なります。各ユーザ毎の実際環境に合った適正値については TCP受信窓(RWIN)の最適化 を参照して下さい。 
  • よく(巷で^^;) 『ADSL(あるいはCATVなど)にしたのに遅かったのが"MTU調整"で劇的に速くなった』 と言われているのが、(意識の方では完全に二次的になってしまっている^^;)この RWINサイズの調整のことです。(大抵の場合、いわゆる「MTU調整」によって実際の MTUは変化せず、変化した場合も速度に及ぼす影響は微少なため、「MTU調整」ではなく「RWIN調整」と呼ぶべきでしょう)
Q3 MS-Windowsで MTUや各種 TCP設定を既定値に戻すには?
[すでに Dr.TCP以外のツールで設定した場合や、レジストリを直接変更するファイル(拡張子 .reg ファイルなど)をインストールしてしまっている場合には、できるだけそのツールや解除用 .inf ファイルなどで既定状態に戻した後、以下の確認を行って下さい]
  1. Dr.TCP を起動する。 
  2. 数値の入っている欄はすべて空白にする。
    ただし「ダイヤルアップ アダプタ」が導入されている場合、それが(英語ソフトのため)文字化けして見える欄右横の (IP) MTU欄(下図参照)は、数字のゼロ「0」が既定値です。(ゼロは、コントロール・パネル→ネットワーク→ダイヤルアップ アダプタのプロパティ→詳細設定→ IPパケットサイズの「自動」に相当:小576 中1000 大1500)  
  3. 選択項目はすべて「Default」(既定値)にする。 

    Dr.TCP v020↑
  4. Adapter Settings(アダプタ設定)を開き  
     
    他のネットワーク・アダプタがあればその各々について、選択した後、もしも右横の (max)MTU欄に数字が入っていたら 空白にする。 
     
  5. [Save](保存)ボタン(旧版は[Apply]ボタン)をクリックして、この設定を Windowsに 記憶させる。(再起動までは旧設定で作動) 
     
     設定は保存されました([OK]クリック)
  6. [Exit](出口)ボタンをクリックして、Dr.TCPを閉じる。  
  7. コンピュータを再起動して、再び Dr.TCP を開き、全設定が既定値になっているかどうかを確認する。(確認して終了するだけの時は[Exit]ボタンのみクリック)

ただし、128kbpsを超えるアクセス手段を使用している場合には、

  Tcp Receive Window(TCP受信窓) 略して RWIN

が既定値では小さすぎてスループットが出ない可能性があるため、自分の環境での 最適値 を求め、Dr.TCPで設定しておいた方が安全です。

また Win95/98 の場合には、TTL既定値 32 では小さすぎて到達できないサイトが出ないように、TTL欄には 128(または 64)を指定しておくのが最近のネットの巨大化状況です。

尚、MS-Windowsの場合、「MTU の既定値」というのは「 OS側からは何も指定していない状態」のことです。何も指定していない 時の MTUは、各ネットワーク・アダプタのドライバ が定義する MTU に決まります(LANカードは1500、フレッツ接続ツールは1454 など)。したがって一般利用者は、特別な理由が無い限り、この各ドライバが定義する MTU を(Dr.TCPその他ツールを用いた)別指定により二重定義または変更しなくても、正常に使用することができます。

Q4 MTUを変更しても SpeedGuide.net で見ると変わらない
(無効な MTU指定)

MTU指定が、Q2 の方法で調べても反映されない場合には、幾つかの可能性が考えられます。
  1. [プロクシ設定] Webブラウザにプロクシ (proxy) サーバが設定されていると、SpeedGuide.net では、プロクシサーバのあるホストの MTU が表示されます。したがって、Webブラウザのプロクシ設定を解除して調べる必要があります。  
  2. [ルータ経由接続] PPPeE対応の NATルータを自環境で使っていると 、ルータの MSS調整機能Q8 )によって、TCP接続時の MTU(正確にはMSS)が変更されます。(ただし、LAN側 PCの MTUがルータ設定値より大きい場合のみ MSS調整機能は作動)  
  3. [装置指定間違い] MTUはネットワークの「アダプタ」や「インターフェース」などと呼ばれる「ネットワーク用装置」毎に独立した値を持っています。この FAQ では、わかりやすく「ホストのMTU」と表現していますが、複数のネットワーク用装置がある場合には、外部接続によってその時インターネットと繋がっている装置の MTU を指定する必要があります。(PPPoEアダプタ等の仮想装置を持つ場合には、 仮想装置のMTU) 
  4. [不適切なMTU値] (67以下などの)明らかに小さすぎる MTU値を指定した場合は、OSが既定値に置き換えることがあります。また、MS-Windows の場合、各ネットワーク・アダプタのドライバが定義している MTUより大きな値を指定すると、やはり不適切なため無視されて、ドライバが定義した MTUになります。
Q5 pingで調べたら MTU=1472。なぜに?
(PMTUとその調べ間違い)
PMTU=1472 は勘違いの典型値ですね(^^;。正しく調べれば、おそらく PMTU=1500 だと思います。

自ホストMTU←→中継点MTU← … →中継点MTU←→相手ホストMTU
PMTU(=Path MTU=道筋MTU) = 道筋のすべての MTU中の最小値

勘違いする原因は幾つかあります。

  1. [+28忘れ] 「ping -f -l 1472 www.yahoo.co.jp」とかが ping の正常に返ってくる最大値だった場合、実際に往復したパケットのサイズは +28 して 1500 になります。指定した 1472バイトは ICMPエコー/エコー返信の「データ長」。28バイトは、IPヘッダ 20バイトに ICMPエコー/エコー返信のヘッダ 8バイトを加えた、パケットの「総ヘッダ長」です(rfc792)。  
  2. [MTU戻し忘れ] pingなどの(OSから見て)アプリケーション・レベルの命令やソフトで PMTUを調べる場合、もしもすでに何か(または誰か)が、自ホストの MTU を 1472 に設定していれば、そこから先により細い部分が無い限り 何度計っても 1472 が PMTU になります。pingなどで調べた PMTUが、現在の自ホストの MTUを超えることは絶対にないですパケットが"入り口"を通れない場合、いきなり自ホスト内で跳ね返されて、その先がもっと広いのかどうかを調べることができないためです。(というより PMTUは、転送の始点・終点となる両側ホストも含めた"道筋"の最小 MTUであるため) 
  3. [押売りMTU調整ツール(^^;] 自動的に(ping命令と全く同じ方法で) PMTU を調べてくれる「MTU調整ツール」で、PMTUが 1500の時に(よほど注意深い人以外は) 1472と勘違いするような表示を行なうものがあります。つまり、まず動揺させておいてから、「どう?MTU調整なんて要らないと、ま〜だ思ってるの?」と自己の存在を強烈にアピールして来るわけです(^^;。ちなみに英語のツールなんですが、この種の押売り手口は万国共通ですね(^^;。(なぜかそのツールはフリーなので、「押売り」ではなく「押付け」というべきかも…)

もしも本当に(複数の主要な相手ホストについて調べた) PMTUが、本来よりも小さな値だった場合には、アクセス・プロバイダ(または自ネットの管理者など)に早急な改善を申し入れ、改善されるまでの 一時的な回避策として自ホストの MTUをその(相手ホスト別)PMTUの最小値に設定して使う必要があるでしょう。

しかし商用アクセス・プロバイダであれば、Q1 のような利用者の症状を放置しておく可能性は極めて低いため、たいていはプロバイダ技術者が異常に気付くまでの「一時的な障害」か、上のような利用者の「勘違い」のはずです。

Q6 某ツールでMTUを自動調整モードにしています。固定の方がいいですか?
(PMTU発見機能に関するよくある誤解)
「某ツール」というのが何かわからないので、「自動調整」とか「固定」の意味もわからないです(^^;。

もしかして「"Path MTU Discovery"または"パス最大転送ユニットの発見アルゴリズム"を有効にすると MTUは自動調整される」というような意味あいのことが書かれているツールなら、その「自動調整」のニュアンスは「期待している機能」とはチト違っている可能性があります(^^;。

  1. PMTU発見機能はデータ送信用です。つまり、受信時のパケットサイズが「調整」される可能性があるのは、(自ホストではなく)「その時の交信相手ホスト」が PMTU発見機能をオンにしている場合です。 
    送信ホスト(MTU1) → インターネット → 受信ホスト(MTU2)
    ・ 送信するパケットの最大サイズは TCP接続時に MTU1、MTU2 の小さい方に決まる。
    ・ 送信ホストが PMTU発見機能をオンにしている場合には、送るパケットに「分割不可」と常に表書きする。
     
  2. また送信側が「調整」するのは、「パケットを分割しない限り中継点で転送不能」となる事態が発生した場合だけです。さらに「調整」と言っても、その事態が発生した相手ホストのみに関するもので、あくまでも 例外的で一時的な状況として処理されます(インターネット経路は動的に変化するため)。 
    配送の道筋に、パケットサイズより小さな MTU を持った区間があると:
    ・ 送信ホスト ← [業務連絡:宛先配送不能、要分割&分割不可] ← 中継点(MTU3)
    ・ 送信ホストは MTU3 または適当なサイズにパケットを小さくして再送。
    ・ 再びこの業務連絡(ICMP:DU-FNDS)が来れば、さらに小さくして再送。
     
  3. さらに、この「隘路検出メカニズム」も、ブラックホールが発生してうまく機能しない場合があり、検出メカニズムが機能しない場合には、データ転送不能→TCP交信切断が発生します。  
    ブラックホール: この業務連絡を行わない中継点があったり、中継点がローカルアドレスのため業務連絡が途中のファイアーウォールを通らないような状況が発生した場合、送信ホストは隘路を知らずに「分割不可」モードで送り続け、分割しなければ先に転送できないパケットは「闇」に吸い込まれてしまう(^^;。  
  4. 一般に PMTU発見機能は、オンにしておくべきでしょう(MS-Windowsの場合オフにすると、データ送信時の MTUが 576 になる)。しかし(一般利用者の場合)その役目は、自分がデータを送信する立場の時に、たまたま運悪く相手ホストが MTUの小さな旧式区間の先に居るような場合(貧乏組織の小FTPサイトにファイルをアップロードする時とか^^;)の相手ネット側負荷の増大防止です。
    つまり自ホストの MTUは自ネット側の適切な値に設定し、それとは独立に PMTU発見機能をオン(通常)にするかオフ(特別な場合)にするかを選ぶのであって、PMTU発見機能が自ホストの MTU設定のデタラメさやテキトーさを直してくれるわけではないです(^^;。

とにかく一つだけ確実に言えることは、MTUは頻繁に微調整するような対象ではない ということです。特別な理由が存在しない限り、システムの既定値にしておくべきでしょう。(マニアックな意味での調整については Q9 参照)

Q7 フレッツADSLなのでMTUが1454です。1500にする方法ってないですか?
(過大MTU設定)
爆発しても構わないのなら技術的には可能です(冗談^^;)。

もしもフレッツ接続ツール側の設定値などを変更して、無理やり MTU=1500 に設定したとします。そうすると、 Q1 のような症状が起きるばかりか、パケットの断片化あるいは PMTU発見メカニズムの作動が頻発して、スループットが低下してしまいます。つまり 百害あって一利なしなので、誰もやらないだけです。

それでもやってみたかったら、方法は自分で見つけて下さい(^^;(OS側から 1500にしても Q2 の方法で実際の値を調べれば変化していないはず)。ただし、もしも障害の発生しない僅かなパケットサイズ・マージンが見つかったとしても、それを利用して得られるスループットの改善は、完全に誤差の範囲です( Q9 参照)。

Q8 PPPoE対応ルータを使っていますが、各PCの MTUも設定すべき?
(ルータ経由の LAN側ホスト、TCP-MSS調整機能)
最近の PPPoE対応 NATルータには、TCP-MSS調整機能(MSSではなく最大パケットサイズである MTUや MRU の形式で設定する製品もある)が付いているので、LAN側ホストの MTUを WAN側(=外部接続側)の MTUに合わせる 必要はないです。

また LAN側の MTUは既定値の 1500にしておいた方が、各種の LAN用機器を使う時の環境がシンプルになると思います。

ただし RWINなど、MTU以外の TCP/IP特性は、LAN側ホストの設定が常に使用されます。そのため 広帯域アクセス環境であれば、インターネットと交信する LAN側ホストすべてについて 少なくともRWIN設定は必要と考えるべきでしょう。


[TCP-MSS調整機能(メカ大好き人間向け説明^^;)] TCPを使った交信(Web, FTP, E-mail, Netnews, …)では、データ送信時の最大パケット長、つまりそのセッションにおける MTUを実質的に取り決めるために、両側ホストが互いに TCP最大データ長である MSS暫定値を相手に通知します。この通知は、TCP接続時の 3-wayハンドシェイクと呼ばれる (1) SYN(接続要求)、(2) SYN/ACK(接続応答)、(3) ACK(確認応答)のパケットの内、最初の2パケットの TCPオプション欄 を使って行われます。例えばこのWebサイトにアクセスする時には、以下のような 3-wayハンドシェイクが行われます。

    (1) TCP-SYN(接続要求)パケット
     送信時刻: 21:19:33.176975
     送信元→先: 自ホスト:2140 → member.nifty.ne.jp:80
     パケット種: SYN、データ部:無、RWIN: 48344
     オプション: MSS=1460、SACK、窓拡大 1ビット、タイムスタンプ
     分割:不可

    (2) TCP-SYN/ACK(接続応答)パケット
     受信時刻: 21:19:33.233742
     送信元→先: member.nifty.ne.jp:80 → 自ホスト:2140
     パケット種: SYN/ACK、データ部:無、RWIN: 10136
     オプション: MSS=1460、窓拡大 0ビット、タイムスタンプ
     分割:不可

      @Niftyのサーバ群は、やや古い SUN社のワークステーションを使っているため、SACK機能がサポートされていない。そのため少し規模の大きなパケットロスが発生すると、スループットが著しく低下する。 (2002年3月以降 memberホストは新システムに移行し、この問題は解消された)
      窓拡大 0ビットは、窓拡大オプションが有効であるが、自分側の窓の拡大率を 1=2^0 つまり拡大無しで使うという意味。(人間の会話なら「オレは使わんけどアンタは使っていいよ」に相当^^;)

    (3) TCP-ACK(確認応答)パケット - 単に(2)を受信したという印
     送信時刻: 21:19:33.234155
     送信元→先: 自ホスト:2140 → member.nifty.ne.jp:80
     パケット種: ACK、データ部:無、RWIN: 56940(×2)
     オプション: タイムスタンプ
     分割:不可

      <以上の(1)(2)で確定した内容>
      ・MTU(最大IPパケット長) = 1500バイト
      ・MSS(最大TCPデータ長) = 1448バイト (タイムスタンプ・オプションにより 12バイト減少)
      ・SACK: 無効
      ・窓拡大: 上りデータ転送=不使用、下りデータ転送=拡大率2倍(2=2^1)
      ・タイムスタンプ: 有効

上のパケット(1)のオプション欄に MSS=1460 とあるのが、自ホストが接続時に相手ホストに通知している MSS暫定値であり、この値には通常 MTU-40 が用いられます。したがって MTU=1500 と通知しているのと同等になります。(MTU は IP属性であり、TCPは IP以外のパケットでも使用できる汎用仕様のため、やや関係の複雑な MSSが使用される)

また接続要求を受けた member.nifty.ne.jp は、通知された MSS暫定値を自環境と照合し、適切なサイズ(=異なる場合はより小さい方のサイズ)を選んで伝えます。その結果がパケット(2)のオプション欄にある MSS=1460 です。(ただしこの接続のようにタイムスタンプ・オプションが有効になると、ヘッダ長 +12 データ長 -12 というパケット長を変えない修正内容が追加されるため、最終的な確定値は MSS=1448 となります。もしもタイムスタンプ・オプションが無効なら MSS=1460 が確定値です)

    ちなみにオプション欄で MSSが通知されない場合には℃けた側は MTU=576 (MSS暫定値=536) と解釈します。これはインターネット規定により、576バイト長までのパケットなら(分断化の有無に関わらず)扱えることが取り決められているからです。しかし、より大きなサイズのパケットを送る場合には、受信側の能力を確認し(TCPでは MSSオプションを使用)、同時に中間経路の能力も(PMTU-D機能などを使って)確認する必要があります。

つまり NATルータや PPPoEツールなどのパケット仲介部で、TCP接続要求時固有の TCP-SYN (同期化)パケットを検出し、その中の MSSオプション数値を書き換えてやれば、(相手ホスト側から見た)自ホストの MTUを、仲介部で自由に変更することができるわけです。これが TCP-MSS調整機能であり、自ホストの設定値そのものではなく、それが相手ホストに伝わる時の値を途中で変更するものです。そのため MTU の確認では、 Q2 のような方法で、相手ホスト側が実際に受理した値を見る必要があります。

Q9 一番速い MTU を簡単に知る方法ってないですか?
(MTUと二種類の「速さ」の関係について)
ありますよ(^^;。しかしその前に「速い」というのが何を意味しているのか、少しだけ考えてみましょう。そうすれば、自ずと納得できる答えが見えて来るはずです(^^;。

ネット利用時に「速さ」と呼ばれている要素には、大きく2つの種類があります。

  • [スループット] 一つは、データ転送を始めてから終るまでの時間です。この時間が短いほど当然「速い」わけですね。この「速度」は、転送データ長を転送所用時間で割った bps(ビット/秒)Bps(バイト/秒) で計られます。技術的には「実効TCP/IPユーザ・データ帯域」とでも呼ぶべき対象で、データ転送の「速度」ではなく「帯域(bandwidth)」が正しい表現です。

    「速度(速い、遅い)」ではシロートすぎる、「帯域(広い、狭い)」ではカタすぎる、という場合には、「スループット(出る、出ない)」という(わかったようなわからないような^^;)カタカナ用語が使われます。ちなみに「Web速度計測ページ」や「FTP転送」から得られるスループットは、この TCP/IPユーザ・データ帯域の実効平均値です。

    この「スループット」と MTUの関係は、基本的に1パケット(=1梱包)に含まれる正味ユーザ・データ量の割合で決まるため、例えば標準的な TCP/IP転送の場合には、以下の表のようになります。
  •     MTU=1500 & TS-OFFを基準とした最高スループット変化率
    ---------------------------------------------------
    (1) (2) (3)=(2)-(1)
    MTU TS-OFF TS-ON TSの影響
    ----- -------- ------- --------
    1500
    0.0% -0.8% -0.8%
    1400 -0.2% -1.1% -0.9%
    1300 -0.4% -1.4% -0.9%
    1200 -0.7% -1.7% -1.0%
    1100 -1.0% -2.1% -1.1%
    1000 -1.4% -2.6% -1.2%
    900 -1.8% -3.2% -1.4%
    800 -2.4% -3.9% -1.5%
    700 -3.1% -4.9% -1.8%
    600 -4.1% -6.2% -2.1%
    500 -5.5% -7.9% -2.5%
    400 -7.5% -10.6% -3.1%
    [参考値] -------- ------- --------
    1454 -0.1% -0.9% -0.8%
    730 -2.9% -4.6% -1.7%
    576 -4.4% -6.5% -2.1%
    ---------------------------------------------------
    1) TS-ON:両側ホストとも TCPタイムスタンプ機能が有効
    2) TS-OFF:片側または両側ホストで同機能が無効

    つまり、正常に使用できる最大のMTU普通1500、PPPoE方式はフレッツの 1454など 1492以下の特定値 )の時に スループットは最大 になり、 MTUを小さくするにつれてスループットは低下 します[*] 。中サイズの MTU=1000 なら 1.4% (TS-OFF)、小サイズの MTU=576 なら 4.4% (TS-OFF) のスループット低下 が発生します。

      [*] 低下するのは「最高スループット」つまり「スループットの天井」であって、「天井が下がる」と言った方がわかりやすいかもしれません。つまり、元々のスループットが、下げた天井のレベルにすら達していないデータ転送の場合には、その影響はないか、あっても非常に複雑で微妙にプラスになるか微妙にマイナスになるか予想がつきません。またそんな場合には、ネットワーク混雑や相手ホスト負荷の時間変動も激しいため、実測比較しようにも毎回条件が大きく違いすぎて、どちらが良いかを判定できないでしょう。

    ちなみに、アクセス回線上を通過する時に PPPイーサネット のような「IPパケット単位への追加包装」がある場合には、正味ユーザ・データ量の割合がさらに低下します。そのため、MTUを小さくした時の最高スループット低下幅も、 上の表より大きくなります。PPPを使っているのは、「ダイヤルアップ接続 [*]」、「PPPoAまたは PPPoE方式の ADSL」、「NTTフレッツ・サービス」などです。また CATV や一部の ADSL では、回線部でイーサネットが使われているようです。

      [*] ただし「低速なダイヤルアップ接続用」として、PPPには「Van Jacobson- TCP/IPヘッダ圧縮(略して VJ圧縮): rfc1144」が準備されていて、「PPP+TCP/IP全体の包装」を劇的に薄く してくれます。したがって VJ圧縮は、TCP/IPスループットを増加させるばかりでなく、MTUを小さくした時の最高スループット低下幅をも 上の表よりかなり小さく保ってくれる超優れものです。

      [MS-Windowsで VJ圧縮をオンにする方法]
      マイコンピュータ→ダイヤルアップ・ネットワーク→各接続先アイコン毎のプロパティ→サーバーの種類→TCP/IP設定→「 IPヘッダー圧縮を使用 」にチェック印。(ダイヤルアップ・ネットワークや TCP/IP設定の位置は Windowsの種類によって多少違う)

      VJ圧縮が実際に有効になるには、ダイヤルアップ接続先のアクセス・サーバも同機能をオンにしている必要があります(ほとんどの ISPではオン)。もしも接続先のアクセス・サーバがこの機能をオフにしている場合には、PPP接続交渉の結果として VJ圧縮が無効になるだけです。つまり、ダイヤルアップ接続に時間が掛かったり接続に失敗するような害(=一部で流布している誤解)は何もないです。

    また、両側ホストとも TCPタイムスタンプ・オプションがオンになっていると(上の表の TS-ON列)、大きな MTU でも約 1% の最高スループット低下が生じます。しかし、RWIN(TCP受信窓)を大きく取る必要のある広帯域アクセス の場合には、タイムスタンプ機能が「転送の安定化と効率化」をもたらすため、普段はネットワーク・トラフィック変動に隠れて気付かない約 1% の最高スループット低下は「安い代償」と考えられています。

──◆──

    ・・・と初版では書いていたところ、「おすぎ」 さんから非常に鋭いご指摘を受けました。それは、標準的な ADSL のように「ATM」がアクセス回線部に使われている場合、固定長である ATMセル(48バイト・データ)の整数倍にならないパケット長(PPPその他の追加部分を含む)では、詰め物による効率悪化が発生し、上の表のように単調な最高スループット変化に、さらに 48バイト周期のノコギリ状の波が(下方向に)加わるという点です。

atm-effects

    その場合には、障害の発生しない最大の MTU値 (普通1500、PPPoE方式はフレッツの 1454 など 1492以下の特定値)とは限らず、それより 47 小さい MTU値までの間のどこかに、スループット最大の MTU が存在することになります。

    とりわけ NTT-フレッツADSLの MTU=1454 は、上の図のように、この効率の悪いパケット長(波の最も下近辺)らしく、僅かに MTUを小さくするだけで 3% 弱のスループット改善(波の頂点)が得られるようです。興味のある方は、以下のリンクを参照して下さい。(しかし、この周期を実験によって発見したTURBOさんは、凄い方ですね^^;)

  • [レスポンス] もう一つは、Webブラウズ時のいわゆる「サクサク感」です。「リンクをクリックすると、すぐに画面が変わる」、「ゾロッ…ゾロッ…ではなくサラサラサラッと滑らかにページが表示される」、「ADSL(あるいはCATVその他)にしたら快適!」あるいは逆に「なんか ISDNとあんまり変わらないような気が…」といった感想に大きく繋がるのが、「レスポンス」つまり手応えというか「反応 」の差です。

    これは、相手から最初の応答が返って来たり、次のデータが到着するまでの「待ち時間」つまり「遅延(delay)」によって決まる部分が大きいため、単位は ms(ミリ秒) で計られるのが普通です。
    よくテレビで、『ただいま衛星回線が繋がっております。こちらスタジオですが、ニューヨークの○○さぁ〜ん?(ん?絵だけ出るが無音声、回線不調?)』 『○○さぁ〜ん?(ハラハラ)』 『はいぃ〜○○ですぅ(ホッ)』 という「あのマ」を計った時間数値のネットワーク・ヴァージョンですね(^^;。

    この 遅延 の方は、(最高スループットとは逆に) MTUが小さいほど少なくつまり「速く」 なります。まず一番わかりやすい、アクセス手段の速度(=データ帯域)と遅延の関係を、 MTUサイズ別に見てみます。
  •    回線のデータ帯域と1パケットの転送に要する時間(MTU別)
    ------------------------------------------------------
    MTU(パケットサイズ)
    データ帯域 --------------------------
    1500 1000 576
    ---------- -------- -------- --------
    14.4kbps 833.3ms 555.6ms 320.0ms
    28.8kbps 416.7ms 277.8ms 160.0ms
    33.6kbps 357.1ms 238.1ms 137.1ms
    56 kbps 214.3ms 142.9ms 82.3ms
    64 kbps 187.5ms 125.0ms 72.0ms
    128 kbps 93.8ms 62.5ms 36.0ms
    512 kbps 23.4ms 15.6ms 9.0ms
    1 Mbps 12.0ms 8.0ms 4.6ms
    2 Mbps 6.0ms 4.0ms 2.3ms
    4 Mbps 3.0ms 2.0ms 1.2ms
    8 Mbps 1.5ms 1.0ms 0.6ms
    100 Mbps 0.12ms 0.08ms 0.05ms
    ------------------------------------------------------

    例えば、一昔前の 14.4kbps電話音声回線用モデムでは、1500バイト長パケットの先頭から末尾までを転送するのに 833.3ms(約1秒弱) かかるのに対して、ISDN-1B(64kbps)回線なら 187.5ms(約0.2秒)、8Mbps-ADSLの下りなら 1.5ms(0.0015秒) で済みます。Webブラウズ時には、少なくとも1パケットを受信し終るまで「画面変化」は起きないため、帯域の狭いアクセス手段の場合、利用者にとって「このマ」は長く感じられます。そこで(最高スループットは少し犠牲にして)パケットサイズを約 1/3 の 576バイトに設定すると、約 1/3の時間でパケットを受け取ることができます。これは(アクセス部の遅延のみに関して言えば)データ帯域が約 3倍になったのと同じ効果があるわけです。

    しかしデータ帯域が約 1Mbpsを超えると、上の1パケットの転送時間は、人間の「体感」として無視できるくらい小さな値になります。ところが、実際にインターネットを使っている時の遅延は、アクセス回線部だけではなく、相手ホストとの間の ネットワーク経路全体から発生していて、これは依然として体感できる程度の時間長を持っています。この
    経路全体の遅延にも、(上と同様の理由で) パケットサイズとの比例的関係が存在します。以下はその1例です。

       pingで測ったデータ受信時の典型的応答遅延時間(MTU別)
    ----------------------------------------------------
    使用回線:下り 2Mbps、上り 128kbps (@NetHome)
    相手ホスト:210.152.236.112(www.yahoo.co.jp)

    MTU 1500 1000 576
    --- ------ ------ -----
    RTT 154ms 104ms 76ms
    ----------------------------------------------------
    1) MTUは下りのパケットサイズ。上りは常に 40バイト。
    2) RTTを推定するための pingデータサイズは (MTU+40)/2 - 28。
    3) RTT(往復時間)は 10回平均値。

    つまり自ホストが何かのデータ要求を行い、相手ホストが応答としてそのデータの最初のパケットを送り、自ホストがそれを受信し終るまでの時間を、pingによる類似パケットを使って推定したものです(かなりテキトーな推定方式^^;)。要求から応答データを受け取るまでの往復時間(RTT)は、MTUが 1500の時には 0.154秒、MTUが 576の時には約半減して 0.076秒になっていることがわかります。

このように MTUは、2種類の「速さ」について相矛盾する性質を持っています。例えばクルマや飛行機に、人や荷物を「たくさん積み込め」という注文と、「速く届けろ」という注文とが矛盾するのと同様です。したがって、どんな「積載バランス」が最も良いかは、利用者のアクセス環境/用途/好みによって千差万別の多様性を持っています。(ちなみに筆者は、大型ファイルの転送を行うのが多いことと、ノンビリした性格のためか^^;、昔から一貫してスループット最高つまり「最大積載型」の MTUが好きです)

しかしとにかく、誰もが様々な環境下で使えそうな「 MTU選択の汎用手順」を、以下に考えてみました(今のところアルファ版つまり試作版といった感じですが^^;)。

  1. まずスループット最高の MTUで Webブラウズして、その「体感」をしっかりと覚えておく(言うは易し行うは…^^;)。  
  2. MTUを 576 近辺に下げて、Webブラウズしてみる。
    ・「特に違いはない」と感じたら、1 の MTUに戻して終了。
    ・「レスポンスの良さ」をはっきりと感じたら、その違いに「標準ケースで 4.4% の最高スループット低下」という代償を払うだけの価値があるかどうか、よく考えてみる。 (ただし最高スループットの代償は、アクセス環境によって異なるため、条件のよいサイトで実測した方がよい)
      ・「価値がある」と思えば終了。
      ・「チト惜しい」と感じたら 3 に進む。 
  3. MTUを 1000 近辺に上げて、Webブラウズしてみる。
    ・「これでもイイかな」と感じたら終了。代償は標準ケースで 1.4%。
    ・「これでは鈍すぎ」と感じたら 4 に進む。 
  4. MTUを 790 近辺に下げて終了。代償は標準ケースで 2.9%。

576 や 790 近辺の MTU を選んだ「レスポンス重視型」の人は、使用 PCも(CPU、メモリ、描画力など)できるだけ高いスペックのものを使用すべきでしょう(LANカードやルータなども同様)。また同時にアクセス・サービスは、(Yahoo!BBや usenなどのように)ギガビット・イーサを中継回線に使った「レスポンスの良いところ=遅延の少ないところ=超高速網環境」を選ぶのが、重要なポイントになります。


oso@st.rim.or.jp

戻る