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のパケットが観測される原因

CentOS8 等 Linux 系では MTU が 1500 であるにも関わらず、tcpdump でパケットキャプチャを取得したときに 1500 以上の Length のパケットが観測されることがあります。

これは Linux で TSO/GSO 機能がデフォルトで ON になっているためです。

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 がハードウェアレベルで処理をした後の (まとまった単位の) パケットがキャプチャされるのです。

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 ~]#

コメント

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