初版 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を見て、適切に送信パケット・サイズを選んでいるのと同等になります。 こうして、LANカード経由(=イーサネット経由)で使用できる最大長 1500バイトのパケット( rfc894 )や、ダイヤルアップIP接続(=PPP接続)の既定長 1500バイトのパケット(rfc1661)などが、主な経路で断片化なしに効率的に通るようになった時、ブロードバンド化の波の中から出現したのが PPPoE(イーサネット上のPPP) と呼ばれるアクセス方式です。この PPPoE方式が、大半のインターネット利用者の意識からは消えていた「隘路問題」を、再浮上させることになりました。 PPPoE方式では、LANカード経由(=イーサネット経由)で送ることができる最大長1500バイトの中に、さらに「PPP」で包んだパケットを入れるために、PPP(+PPPoEヘッダ)の厚みを引いた長さのパケット(典型的には「NTT-フレッツ」などの 1454バイト)しか通すことができなくなります。つまり、PPPoE方式で転送される部分だけ、(ほんの少し)道が狭くなるわけです。 自ホスト------アクセスサーバ===一般のインターネット===相手ホスト しかしながら、当然、専用の接続ツールが必要な自ホストの MTU変更をやってくれるので、それでも一般利用者には何も問題はなかったのです。しかし同時にその頃、パワーユーザは(複数のホストを同時に使うために) UNIX機を利用した NATルータを導入し始めていて、当時の NATルータにはまだ TCP-MSS自動調整機能が導入されていないものが多かったため、終端ホスト側の MTU値を、既定の 1500 から 1454 などに変更する必要が生じました(断片化したパケットを NATルータが再組立できない場合や PMTU-Dブラックホールのケースで問題が発生するため)。 自ホスト===NATルータ------アクセスサーバ===一般のインターネット===相手ホスト このあたりから「MTU調整が必要」というウワサが、一般ユーザに流れ始めたように思います。 さらに、広帯域アクセス環境では TCP受信窓(RWIN)の不足がスループットの低下を招くため、適切な値に変更する必要のある話や、遅延の大きな電話音声回線用モデムや ISDNで、かなり以前からレスポンス改善を目的に行われていた「MTU調整」の話(実際には都市伝説的部分もかなりある^^;)などがミックスして、いまや「MTU」というやや専門的な用語が、一般ユーザの目に飛び込んで来ては不安にさせる、そんな混乱した事態になってしまったというわけですね(^^;。 |
|
Q1 MTUってよくわからないんですが、調整する必要あります? (MTU調整やMTU指定の必要性) |
| 次のようなことが起きている場合には、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。下記参照) と出れば一応「合格」です[*]。 [*] プロクシなど、一般に自ホストの TCP/IP接続を 代行するホストが介在していると、以下の方法では「自ホストの環境」ではなく「代行ホストの環境」が表示されてしまうため、この確認が必要になります。一部の CATVや組織の LAN経由などで、代行ホストを通さないとインターネットにアクセスできない環境の場合、自ホスト環境の実際値を調べる一般的で簡単な方法は、残念ながら(いまのところ)存在しないと思います。 次に、 ここ(SpeedGuide.net) をクリックすると、自環境の TCP/IP特性がわかります。 別窓に表示された表の、上から二段目に MTU = xxxx (xxxxはある数) という欄がありますね? それが今インターネットにアクセスしている環境での「自ホスト MTU」の実際値です。
ちなみに、その表の中でもっと大事なのは、上から四段目にある Default Receive Window (RWIN) = xxxxx (xxxxxはある数) という RWIN の値です。
|
| Q3 MS-Windowsで MTUや各種 TCP設定を既定値に戻すには? |
[すでに Dr.TCP以外のツールで設定した場合や、レジストリを直接変更するファイル(拡張子
.reg ファイルなど)をインストールしてしまっている場合には、できるだけそのツールや解除用 .inf ファイルなどで既定状態に戻した後、以下の確認を行って下さい]
ただし、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
の方法で調べても反映されない場合には、幾つかの可能性が考えられます。
|
|
Q5 pingで調べたら MTU=1472。なぜに? (PMTUとその調べ間違い) |
| PMTU=1472 は勘違いの典型値ですね(^^;。正しく調べれば、おそらく
PMTU=1500 だと思います。
自ホストMTU←→中継点MTU← … →中継点MTU←→相手ホストMTU 勘違いする原因は幾つかあります。
もしも本当に(複数の主要な相手ホストについて調べた) PMTUが、本来よりも小さな値だった場合には、アクセス・プロバイダ(または自ネットの管理者など)に早急な改善を申し入れ、改善されるまでの 一時的な回避策として自ホストの MTUをその(相手ホスト別)PMTUの最小値に設定して使う必要があるでしょう。 しかし商用アクセス・プロバイダであれば、Q1 のような利用者の症状を放置しておく可能性は極めて低いため、たいていはプロバイダ技術者が異常に気付くまでの「一時的な障害」か、上のような利用者の「勘違い」のはずです。 |
|
Q6 某ツールでMTUを自動調整モードにしています。固定の方がいいですか? (PMTU発見機能に関するよくある誤解) |
| 「某ツール」というのが何かわからないので、「自動調整」とか「固定」の意味もわからないです(^^;。
もしかして「"Path MTU Discovery"または"パス最大転送ユニットの発見アルゴリズム"を有効にすると 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(接続要求)パケット (2) TCP-SYN/ACK(接続応答)パケット @Niftyのサーバ群は、やや古い SUN社のワークステーションを使っているため、SACK機能がサポートされていない。そのため少し規模の大きなパケットロスが発生すると、スループットが著しく低下する。
(2002年3月以降 memberホストは新システムに移行し、この問題は解消された) (3) TCP-ACK(確認応答)パケット - 単に(2)を受信したという印 <以上の(1)(2)で確定した内容> 上のパケット(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つの種類があります。
MTU=1500 & 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を小さくした時の最高スループット低下幅をも
上の表よりかなり小さく保ってくれる超優れものです。 また、両側ホストとも TCPタイムスタンプ・オプションがオンになっていると(上の表の TS-ON列)、大きな MTU でも約 1% の最高スループット低下が生じます。しかし、RWIN(TCP受信窓)を大きく取る必要のある広帯域アクセス の場合には、タイムスタンプ機能が「転送の安定化と効率化」をもたらすため、普段はネットワーク・トラフィック変動に隠れて気付かない約 1% の最高スループット低下は「安い代償」と考えられています。 ──◆── ・・・と初版では書いていたところ、「おすぎ」 さんから非常に鋭いご指摘を受けました。それは、標準的な ADSL のように「ATM」がアクセス回線部に使われている場合、固定長である ATMセル(48バイト・データ)の整数倍にならないパケット長(PPPその他の追加部分を含む)では、詰め物による効率悪化が発生し、上の表のように単調な最高スループット変化に、さらに 48バイト周期のノコギリ状の波が(下方向に)加わるという点です。
その場合には、障害の発生しない最大の MTU値 (普通1500、PPPoE方式はフレッツの 1454 など 1492以下の特定値)とは限らず、それより 47 小さい MTU値までの間のどこかに、スループット最大の MTU が存在することになります。 とりわけ NTT-フレッツADSLの MTU=1454 は、上の図のように、この効率の悪いパケット長(波の最も下近辺)らしく、僅かに
MTUを小さくするだけで 3% 弱のスループット改善(波の頂点)が得られるようです。興味のある方は、以下のリンクを参照して下さい。(しかし、この周期を実験によって発見したTURBOさんは、凄い方ですね^^;)
回線のデータ帯域と1パケットの転送に要する時間(MTU別) 例えば、一昔前の 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倍になったのと同じ効果があるわけです。 pingで測ったデータ受信時の典型的応答遅延時間(MTU別) つまり自ホストが何かのデータ要求を行い、相手ホストが応答としてそのデータの最初のパケットを送り、自ホストがそれを受信し終るまでの時間を、pingによる類似パケットを使って推定したものです(かなりテキトーな推定方式^^;)。要求から応答データを受け取るまでの往復時間(RTT)は、MTUが 1500の時には 0.154秒、MTUが 576の時には約半減して 0.076秒になっていることがわかります。 このように MTUは、2種類の「速さ」について相矛盾する性質を持っています。例えばクルマや飛行機に、人や荷物を「たくさん積み込め」という注文と、「速く届けろ」という注文とが矛盾するのと同様です。したがって、どんな「積載バランス」が最も良いかは、利用者のアクセス環境/用途/好みによって千差万別の多様性を持っています。(ちなみに筆者は、大型ファイルの転送を行うのが多いことと、ノンビリした性格のためか^^;、昔から一貫してスループット最高つまり「最大積載型」の MTUが好きです) しかしとにかく、誰もが様々な環境下で使えそうな「 MTU選択の汎用手順」を、以下に考えてみました(今のところアルファ版つまり試作版といった感じですが^^;)。
576 や 790 近辺の MTU を選んだ「レスポンス重視型」の人は、使用 PCも(CPU、メモリ、描画力など)できるだけ高いスペックのものを使用すべきでしょう(LANカードやルータなども同様)。また同時にアクセス・サービスは、(Yahoo!BBや usenなどのように)ギガビット・イーサを中継回線に使った「レスポンスの良いところ=遅延の少ないところ=超高速網環境」を選ぶのが、重要なポイントになります。 |