Cisco IOS-XE ネットワークエンジニアになって数十年ずっと勘違いしていたip tcp adjust-mssコマンドについて

今回は、IOS(-XE)のコマンドである、「ip tcp adjust mss」コマンドについてまとめておきます。

日本では2000年頃ADSLによるPPPoEを使ったブロードバンド・インターネット回線が一気に普及しました。

日本にけるPPPoEのMTUサイズは少し特殊で、フレッツ回線の仕組みとしてバックボーンでL2TPを利用しているためMTUサイズが1454Byteとなることは以前の記事でもまとめています。

candm-network.hatenadiary.jp

Cisco Routerにおける日本のPPPoEのサンプル設定は当時から多く存在し、それを使って多くのCisco RouterでPPPoEが利用されていると思います。

サービス開始当時のPPPoEサンプル設定は今は検索することはできませんが、CiscoのHPの中から検索してみると、今でも幾つか見ることができます。

www.cisco.com

このサンプル設定の中から本記事の目的である「ip tcp adjust-mss」コマンドについて抜粋してみます。

interface FastEthernet1
  ip tcp adjust-mss 1414
!
interface Dialer1
  ip mtu 1454

!

この設定は、PPPoEとして設定されるDialerインターフェースはMTU1454Byteとして、LAN側のインターフェースとしてはPPPoEのMTU値から40Byteを引いた1414Byteが設定されているものになります。

数十年の勘違い

2000年当時まだままだネットワークエンジニアの駆け出し状態であったため、この設定は一種のおまじないとして捉えていて、なぜip tcp adjust-mssコマンドはLAN側物理インターフェースに設定されているのか?を疑うことは全くありませんでした。

何となく頭の中でDialerインターフェースではMTU値を1454としてあるので、MSS値は自動で1414Byteにしてくれていて、LAN側クライアント向け(Routerから見てLAN側インターフェースのEgress)に対してMSSの書き換えをしてくれているんだろう?と勝手に思っていました。

数十年の月日が流れ改めてこのコマンドって一体何なんだ?と思い、実機を使って検証してみることにしてみました。

この試験はMSSにフォーカスしたものとなっており、MTU値におけるNetworkの挙動に関しては触れませんのでご了承ください。

TCP 3way handshake

まずは、TCPの超基本から。
TCPのセッションを開始するにあたり、3way handshakeによってコネクションを確立を行います。
TCPヘッダの中にMSS値を入れてクライアント、サーバそれぞれが、送信可能なTCPデータサイズを送ることを目的としています。

一般的なMTU1500Byteにおける3way handshakeのフローを簡単にまとめておきます。

パケットキャプチャで確認してみると、実際にMSSが1460Byteとして3way handshakeが行われていることが確認できます。
(スクショでは文字が小さいので拡大して確認してください)

ip mtu 1460コマンドのみでの3way handshake

ClientとServerの間にRouterを設置し、Server側インターフェースに「ip mtu 1460」コマンドを設定してみます。

クライアント側、サーバー側それぞれでパケットキャプチャを取得し、TCP 3way handshakeを確認してみます。

クライアント側

サーバー側

Routerを挟んでどちらのサイドでもMSSは1460Byteとなっており、Routerでの「ip mtu 1460」だけではMSS値の変更は行われないことが確認できました。

ip tcp adjust-mss 1420を追加設定

次に「ip tcp adjust-mss 1420」を追加設定して確認を行います。
今回は「ip mtu 1460」を設定したインターフェースと同じインターフェースに設定を行いました。

改めてパケットキャプチャを行います。

まずはクライアント側。
サーバーからのSYN/ACKのMSSが1420Byteになっていることが確認できます。

次にサーバ側
こちらでは、クライアントからのSYNのMSSが1420Byteになっています。
そして、サーバからのSYN/ACKは1460Byteのままになっているのも確認できます。

少し分かりにくいのでフローにまとめてます。

この検証により「ip tcp adjust-mss」コマンドは設定したインターフェースのingress、egressともに機能することが確認できました。

個人的に思うこと

実際に検証してみると結果は大したことないのですが、そもそも何故サンプルコンフィグにてip tcp adjust-mssコマンドはLAN側物理インターフェースに設定されているのでしょうか?

サンプル設定はあくまでもPPPoEを終端するRouterの物となりますので、LAN側物理インターフェースとPPPoE側Dialerインターフェースのみで構成されているためだったのだと思います。

ip tcp adjust-mssコマンドはingress、egress共に機能するのであればMTUを調整するInterface(ここではDialerインターフェース)で設定した方が分かりやすいのではないかとは思います。

またLAN側に複数インターフェースが存在し、それらでRoutingするような構成の場合にはMTU値の調整とは関係の無いセッションにおいてもMSS値は変更になってしまうのも少し気になります。

2025年現在新規でPPPoEの設定をすることは多くは無いとは思いますが、IPoE設定に関してもTunnelインターフェースとしてMTU1460Byteで設定することになると思いますので、同じTunnelインターフェースにip tcp adjust-mss 1420を設定するのが良いかと思っています。