tcpdump/WiresharkでMTU(=1500)より大きいLengthのパケットがキャプチャされる原因 | SEの道標
Wireshark

tcpdump/WiresharkでMTU(=1500)より大きいLengthのパケットがキャプチャされる原因

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

コメント

タイトルとURLをコピーしました