This site covers Cisco and Palo Alto as part of *** Shadowgarden.org ***

Cisco MTU,MSS調整とフラグメンテーション制御の関係について解説

目次

動作確認環境

  • Cisco C891FJ-K9
    • IOS 15.9(3)M10

MTU、MSS に関する説明の多くが分かりにくい

Cisco 機器構築案件において PPPoE、IPsec VPN、GRE などを構成する場合、Cisco 機器のインターフェース設定にて MTU や MSS の設定値を調整することがあります。MTU や MSS に関する説明をしているサイトは多くありますが、本質的に分かりやすい説明は少ないように感じます。

ここでは MTU、MSS とフラグメンテーションとは何か、ネットワーク機器において MTU、MSS を設定すると通信にどう影響するのかについて改めて整理します。

MTU、MSS とは

MTU とは、ネットワーク機器や端末が転送できる最大伝送ユニット(Maximum Transmit Unit)です。一般的には、IP ヘッダーを含む IP パケットサイズです。MTU は (L3) インターフェース毎に設定されます。Cisco ルータ・スイッチや一般的な PC では MTU のデフォルト値は 1,500 バイトになっています。

MSS とは、TCP における概念であり、TCP の最大セグメントサイズ (最大ペイロード(データ)サイズ) のことです。MSS は MTU から IP ヘッダ(20バイト)と TCP ヘッダ(20バイト) を除いたサイズ(1460バイト)といえます。

画像:MTUとMSS

イーサネット(L2)ヘッダ(14バイト)とFCS(4バイト)を考慮すると合計 1518 バイトになります。dot1q vlanタグを使用する場合は更に 4 バイト追加されて 1522 バイトになります。

MTU チェックとフラグメンテーション

Cisco 機器においては MTU チェックは入力・出力インターフェースの双方で行われます。

入力インターフェースで MTU を超えるパケットを受信した場合、そのパケットは破棄されます。

出力インターフェースにて MTU を超えるパケットを出力する場合、そのパケットは分割されて送信されます
この動作をフラグメンテーションと呼びます。

フラグメンテーションされたパケットを受信する端末では、分割されたパケットを元通りのパケットに戻す処理である再編成(リアセンブル) が行われます。

フラグメンテーションが発生すると、ネットワーク機器や端末で余計なリソースを使用する必要があったり、通信遅延が発生したりするなどのデメリットがあるため、フラグメンテーションの発生は避けるべきであるとされています。

機種によって動作仕様が異なる可能性があるため、正確には該当機種の公式ドキュメントを確認してください。

MSS はデータを送受信する端末で使用する値

ネットワーク機器で MSS (に関する) 設定をすることができるため、MSS はネットワーク機器の動作に影響する値と思われるかもしれませんが、MSS はデータ送受信を行う端末ペアで使用される値です。端末間において TCP 通信を行う際の最初のスリーウェイハンドシェイクの段階で MSS の値がネゴシエートされ、以後取り決められた MSS でデータが送受信されます。

端末間での MSS ネゴシエートの流れは以下です。

STEP
【SYN】端末A からの MSS の送信、端末B の MSS 決定

端末A はスリーウェイハンドシェイクの SYN パケットにおける TCP Option にて MSS を送信します。端末B は受信した MSS の値と自身の (インターフェースの MTU – 40) の値を比較し、値がより小さい方を自身の MSS として採用します。

以下は SYN パケットの中身です。TCP Option として MSS が存在することを確認できます。

STEP
【SYN, ACK】端末B からの MSS の送信、端末A の MSS 決定

端末B はスリーウェイハンドシェイクの SYN, ACK パケットにおける TCP Option にて MSS を送信します。端末A は受信した MSS の値と自身の (インターフェースの MTU – 40) の値を比較し、値がより小さい方を自身の MSS として採用します。

以下は SYN, ACK パケットの中身です。TCP Option として MSS が存在することを確認できます。

STEP
取り決められた MSS でのデータ通信を実施

端末間で MSS が決定されたら、その MSS に基づいて端末間でデータ通信が行われます。

フラグメンテーションが発生する場合と防止策

上で端末間で MSS がネゴシエートされてデータ通信が行われると説明しました。これはそれぞれの端末にてフラグメンテーションが発生しないことを目的とした動作仕様です。しかし、通信経路となるネットワークの MTU は考慮されていないため、ネットワーク内の MTU が小さい場合ネットワーク内にてフラグメンテーションが発生する可能性があります

画像:ネットワーク内でフラグメンテーション

ネットワーク内の MTU が (端末の MSS + 40) より小さい場合、ネットワーク内にてフラグメンテーションが発生します。

「+ 40」は IP ヘッダ (20 バイト)、TCP ヘッダ (20 バイト) 分です。

ネットワーク内でのフラグメンテーションを防止するために、Cisco 機器の場合はインターフェースにて MSS の設定(ip tcp adjust-mss) を行います。

「ip tcp adjust-mss」設定の動作仕様とは

上でも記載しましたが、MSS は端末からの送信されるデータサイズを決定するパラメータです。Cisco 機器における MSS の設定である「ip tcp adjust-mss」がどのように端末の MSS に影響するのかを説明します。

端末間ではスリーウェイハンドシェイクにおける SYN パケット及び SYN, ACK パケットの TCP Option で MSS の値を相手に伝えていました。Cisco 機器の (L3) インターフェースにて「ip tcp adjust-mss」を設定すると、このインターフェースを通る SYN パケット、及び SYN, ACK パケットの TCP Option の MSS の値が「ip tcp adjust-mss」で設定した値に書き換えられます。

以下図は経路上のルータで「ip tcp adjust-mss 1000」を設定した場合の動作を示しています。

画像:ルータでのMSS書き換え

以下は端末A から送信された SYN パケットの内容です。TCP Option の MSS が 1460 になっています。

一方以下は端末B で受信した SYN パケットの内容です。TCP Option の MSS が経路上のルータで書き換えられ 1000 に変わっていることを確認できます。

同様に端末B から送信される SYN, ACK パケットについても MSS の値が書き換えられます。

以下は端末B から送信された SYN, ACK パケットの内容です。TCP Option の MSS が 1460 になっています。

一方以下は端末A で受信した SYN パケットの内容です。TCP Option の MSS が経路上のルータで書き換えられ 1000 に変わっていることを確認できます。

以上のように、経路上のインターフェースにて「ip tcp adjust-mss」を設定することにより該当インターフェースの送受信パケットについて TCP Option の MSS の値が書き換えられます

ip tcp adjust-mss」設定によってデータ通信を行う端末の MSS 設定を変更できるということになります。

ネットワークエンジニア同士の会話でも「ip tcp adjust-mss」設定のことを単に「MSS 設定」と表現することが多いですが、正確には「SYN パケット内の MSS の値を書き換える設定」といえます。不正確な表現が新人エンジニアを混乱させているのではとも思えます。

「ip tcp adjust-mss」の値を (MTU – 40) と設定する

データ通信を行う端末にて使用する MSS が (ネットワーク機器に設定されている MTU 値 – 40) の値になっていればネットワーク機器におけるフラグメンテーションを防止することができます。

このため Cisco 機器においてフラグメンテーションを防止するために「ip tcp adjust-mss」が値を (その Cisco 機器で設定されている MTU – 40) として設定します。

「- 40」は IP ヘッダ (20 バイト)、TCP ヘッダ (20 バイト) 分です。

MTU 設定値のパターン別計算方法

MSS は MTU が決まれば決まります。一方、MTU はネットワークで使用している機能に応じて適切に計算して求める必要があります。

以下ではパターン別の計算方法を記載します。

この内容は後日追記します。

IPsec に関する MTU 計算

ここでは IPsec を実装するルータにおける WAN 回線に接続するインターフェースの最適 MTU 値を計算する手順を示します。

前提となるデータサイズ

項目小項目サイズ備考
イーサネット標準MTU1500 バイト
TCPヘッダ20 バイト
IPヘッダIPv4ヘッダ20 バイト
IPv4ヘッダ (トンネルモードにて追加分)20 バイト
ESPヘッダSecurity Parameters Index (SPI)4 バイト
Sequence4 バイト
初期化ベクトル
(Initialization Vector)
(IV)
DES/3DES8 バイト使用する暗号アルゴリズム
によりサイズが異なる
AES16 バイト
ESPトレーラPadding0-255 バイト
Pad length1 バイト
Next Header1 バイト
整合性チェック値
(認証データ)
(Integrity Check Value)
(ICV)
MD5/SHA112 バイト使用するハッシュアルゴリズム
によりサイズが異なる
SHA25616 バイト
SHA38424 バイト
SHA51232 バイト

Padding の仕様

Padding は暗号化対象範囲のデータサイズが初期化ベクトルサイズの倍数になるよう追加されるダミーデータです。Padding のサイズは TCP ペイロードサイズによって変わりますが、TCP ペイロードサイズが取り得る値の最大となるとき Padding のサイズは 0 となります。よって MTU 算出の計算を行う際は Padding は 0 であることを前提として計算することになります。

トンネルモードにおける MTU 計算

トンネルモードにおけるパケット構造は以下画像の通りです。

画像:IPsecトンネルモードのパケット構造

トンネルモードの場合の最適 MTU の算出手順は以下の通りです。

以下手順内では例として、以下前提での計算例を示します。
・WAN回線MTU → イーサネット標準の1500バイト
・暗号アルゴリズム → AES
・ハッシュアルゴリズム → MD5/SHA1

STEP
暗号化対象データの最大サイズを計算する

使用する WAN 回線の MTU サイズから非暗号化対象データのサイズを減じることで、暗号化対象データの最大サイズを算出します。

計算式
  • <WAN回線MTU>
     – <IPヘッダ(トンネルモード)> ※20バイト
     – <ESPヘッダ> ※8バイト
     – <初期化ベクトル> ※使用する暗号アルゴリズムによる
     – <整合性チェック値> ※使用するハッシュアルゴリズムによる

WAN 回線 MTU は、WAN 回線を使わずローカルネットワーク内での通信のみであればイーサネット標準 MTU の 1500 バイト、NTT のフレッツ光回線であれば 1454 バイト、などが該当します。使用する WAN 回線の仕様書などで MTU を確認した上で計算してください。

計算例
  • 1500 – 20 – 8 – 16 – 12 = 1444
STEP
<STEP1の結果の値>を超えない最大の初期化ベクトルサイズの倍数を計算する

<STEP1の結果の値><初期化ベクトルサイズ>で割り切れない場合、Padding の仕様により WAN 回線の MTU を超えたデータサイズに調整されてしまう可能性があります。これを防止しつつ最大となるような MTU サイズを算出するために<STEP1の結果の値>を超えない<最大の初期化ベクトルサイズの倍数>を計算します。

計算式
  • <STEP1の結果> ÷ <初期化ベクトル>
  • <①の結果の商> × <初期化ベクトル>
計算例
  • 1444 ÷ 16 = 90 余り4
  • 90 × 16 = 1440
STEP
<STEP2の結果の値>からESPトレーラのサイズを減じる

この計算を行うことで最終結果である MTU が算出されます。

計算式
  • <STEP2の結果> – <ESPトレーラ(2バイト)>
    • このとき Padding は0バイトであると考えるため ESPトレーラは2バイトとして計算する
計算例
  • 1440 – 2 = 1438 → これが MTU

トランスポートモードにおける MTU 計算

トランスポートモードにおけるパケット構造は以下画像の通りです。

画像:IPsecトンネルモードのパケット構造

トランスポートモードの場合の最適 MTU の算出手順は以下の通りです。

以下手順内では例として、以下前提での計算例を示します。
・WAN回線MTU → イーサネット標準の1500バイト
・暗号アルゴリズム → AES
・ハッシュアルゴリズム → MD5/SHA1

STEP
暗号化対象データの最大サイズを計算する

使用する WAN 回線の MTU サイズから非暗号化対象データのサイズを減じることで、暗号化対象データの最大サイズを算出します。

計算式
  • <WAN回線MTU>
     – <IPヘッダ> ※20バイト
     – <ESPヘッダ> ※8バイト
     – <初期化ベクトル> ※使用する暗号アルゴリズムによる
     – <整合性チェック値> ※使用するハッシュアルゴリズムによる

WAN 回線 MTU は、WAN 回線を使わずローカルネットワーク内での通信のみであればイーサネット標準 MTU の 1500 バイト、NTT のフレッツ光回線であれば 1454 バイト、などが該当します。使用する WAN 回線の仕様書などで MTU を確認した上で計算してください。

計算例
  • 1500 – 20 – 8 – 16 – 12 = 1444
STEP
<STEP1の結果の値>を超えない最大の初期化ベクトルサイズの倍数を計算する

<STEP1の結果の値><初期化ベクトルサイズ>で割り切れない場合、Padding の仕様により WAN 回線の MTU を超えたデータサイズに調整されてしまう可能性があります。これを防止しつつ最大となるような MTU サイズを算出するために<STEP1の結果の値>を超えない<最大の初期化ベクトルサイズの倍数>を計算します。

計算式
  • <STEP1の結果> ÷ <初期化ベクトル>
  • <①の結果の商> × <初期化ベクトル>
計算例
  • 1444 ÷ 16 = 90 余り4
  • 90 × 16 = 1440
STEP
<STEP2の結果の値>からESPトレーラのサイズを減じてIPヘッダ分を加える

この計算を行うことで最終結果である MTU が算出されます。なおトランスポートモードでは<STEP2の結果>にIPヘッダ分のサイズは含まれていないため、IPヘッダ分のサイズを加算する必要があります。

計算式
  • <STEP2の結果> – <ESPトレーラ(2バイト)> + <IPヘッダ(20バイト)>
    • このとき Padding は0バイトであると考えるため ESPトレーラは2バイトとして計算する
計算例
  • 1440 – 2 + 20 = 1458 → これが MTU

参考資料


Cisco (IOS一般) 関連記事一覧

Cisco Catalyst 9000 シリーズスイッチ関連記事一覧

Cisco Catalyst 1300 スイッチ関連記事一覧


Amazon で買えるおすすめアイテム

以下は Amazon アフィリエイトリンクです。ネットワーク作業向けにそこそこおすすめなアイテムです。

ブログ始めるなら 【アフィリエイトリンク】

note メンバーシップへの参加もお待ちしています!

note(ノート)
Shadowgarden.org -影の構築者集団-|Shadowgarden.org -影の構築者集団- 陰の構築者集団「Shadowgarden.org」の活動拠点。 ネットワーク・インフラ業界に陰から影響を与えるため活動している。 当組織への問合せは「https://shadowgarden.org/inq...
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次