Windows と Linux の MTU 確認コマンド
一般的な OS や NW 機器ではインタフェースの MTU は 1500 になっています。(ジャンボフレームは広く認知されているものの、実装としては一般的ではない。)
Windows の場合は netsh interface ipv4 show interface で確認できます。
C:\Users\test> netsh interface ipv4 show interface Idx Met MTU 状態 名前 --- ---------- ---------- ------------ --------------------------- 18 50 1500 connected Wi-Fi 8 5 1500 disconnected イーサネット 3 25 1500 disconnected ローカル エリア接続* 1 C:\Users\test>
Linux の場合は以下のように ip a で確認できます。
[root@localhost ~]# ip a show scope link 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 08:00:27:93:ea:cf brd ff:ff:ff:ff:ff:ff inet6 fe80::2bf6:afa9:47d2:cab8/64 scope link noprefixroute valid_lft forever preferred_lft forever [root@localhost ~]#
MTU以上のLengthのパケットが観測される原因
Windows や CentOS 等 Linux 系では MTU が 1500 であるにも関わらず、wireshark , tcpdump でパケットキャプチャを取得したときに 1500 以上の Length のパケットが観測されることがあります。
これは Windows においては「LSO 機能」、Linux においては「TSO/GSO 機能」がデフォルトで ON になっているためです。
LSO (Large Send Offload: 一括送信オフロード) , TSO (TCP Segmentation Offload) は、データ送信時において、Kernel (OS) に代わって NIC が TCP セグメンテーションを行う機能です。これにより Kernel はまとまった単位で NIC とパケットをやり取りできるため、Kernel の負荷を抑えることができます。
GSO (Generic Segmentation Offload) は、NIC が TCP セグメンテーションできない場合に、代わりに処理を行うソフトウェアです。TSO は NIC がハードウェアレベルで TSO 機能に対応している必要がありますが、対応していない NIC の場合は GSO が有効になります。
tcpdump や Wireshark は NIC ドライバと Kernel (OS) との間で動作するため、送信時は Kernel から NIC へ引き渡す (まとまった単位の) パケット、受信時は NIC がハードウェアレベルで処理をした後の (まとまった単位の) パケットがキャプチャされるのです。
Windows の LSO の設定確認と設定変更
Windows において LSO が有効かどうかの確認、および設定変更は NIC のプロパティから実施します。
まずはプロパティの「構成」をクリックします。
「詳細設定」タブから「Large Send Offload (IPv4)」や「一括送信オフロードv2 (IPv4)」等を選択します。右側の「値(V)」で「Enabled (有効)/Disabled (無効)」を設定変更できます。
Linux の TSO/GSO の設定確認と設定変更
TSO/GSO が有効かどうかは ethtool -k enp0s3 で確認できます。(スモール k)
[root@localhost ~]# ethtool -k enp0s3 | grep segmentation-offload
tcp-segmentation-offload: on
generic-segmentation-offload: on
[root@localhost ~]#
TSO/GSO の設定変更は ethtool -K enp0s3 で実行できます。(ラージ K)
[root@localhost ~]# ethtool -K enp0s3 tso off gso off [root@localhost ~]# ethtool -k enp0s3 | grep segmentation-offload tcp-segmentation-offload: off generic-segmentation-offload: off [root@localhost ~]#
ただし、上記は一時的な設定変更となり、再起動を行うと元に戻ってしまいます。永続的に設定する場合は以下のようにします。
[root@localhost ~]# echo 'ACTION=="add", SUBSYSTEM=="net", KERNEL=="enp0s3", RUN+="/sbin/ethtool -K enp0s3 tso off"' > /etc/udev/rules.d/50-eth-tso.rules
コメント