「超メモはスゴイメモではなくただのメモです」のかっぱです。

tl;dr

ping と MTU とかそういう言葉に触れる機会があってナンノコッチャって感じになったので、改めてインターネットの情報をかいつまんで整理してみる。

memo

参考

有難うございます

以下、ほぼこちらの記事の抜粋。有難うございます。

MTU(Maximum Transmission Unit) とは

  • ネットワークで送信可能なパケットの最大サイズを MTU という
  • IP プロトコルでは 1 つのIPパケットでは最大 64 Kbytes(ヘッダを含む)までしか送信できない(IPv4 の場合)
  • IP パケットのサイズが MTU サイズを超えるとパケットの分割処理が行われる(IP フラグメンテーション)
  • 分割されたそれぞれのパケット(フラグメント)は、最終的な受信先で合成されて元の IP パケットに復元される
  • IP フラグメンテーション機能があるのでアプリケーションは MTU を意識することなく異なるデータを送信することが出来る

ping とは

  • IP プロトコル上に実装されている
  • ICMP Echo でデータ送信を行い、ICMP Echo Reply でレスポンスを返す単純な機能

MTU の値

  • IP ヘッダのサイズはデフォルトでは 20bytes
  • ICMP のヘッダは 8bytes
  • イーサネット(MTU=1500bytes)では、最大で 1472bytes のデータサイズまでならフラグメント化せずに送信することができる

実習(ping で MTU の値を調べる

環境

今回は以下のような環境で試してみる。

[Ubuntu 14.04](192.168.xx.13)  [CentOS 6.7](192.168.xx.100)

それぞれのネットワーク・インターフェースの状態を確認。

# Ubuntu 14.04
$ ifconfig eth1
eth1      Link encap:Ethernet  HWaddr 08:00:27:6c:4f:88
          inet addr:192.168.xx.13  Bcast:192.168.xx.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe6c:4f88/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:91854984 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2432991 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:138965024294 (138.9 GB)  TX bytes:396196876 (396.1 MB)

# CentOS 6.7
$ ifconfig eth1
eth1      Link encap:Ethernet  HWaddr 08:00:27:4B:67:68
          inet addr:192.168.xx.100  Bcast:192.168.xx.255  Mask:255.255.255.0
          inet6 addr: fe80::a00:27ff:fe4b:6768/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2442319 errors:0 dropped:0 overruns:0 frame:0
          TX packets:91830481 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:397764476 (379.3 MiB)  TX bytes:138970979234 (129.4 GiB)

どちらも一応 MTU は 1500 となっている。

man ping

Linux であれば ping の -M-s オプションを利用して MTU の値を調べることが出来るとのこと。

$ man ping

(snip)

       -s packetsize
              Specifies the number of data bytes to be sent.  The default is 56, which translates into 64 ICMP data bytes when combined with the 8 bytes of ICMP header data.

       -M pmtudisc_opt
              Select  Path MTU Discovery strategy.  pmtudisc_option may be either do (prohibit fragmentation, even local one), want (do PMTU discovery, fragment locally when packet size is
              large), or dont (do not set DF flag).

(snip)

-s でパケットサイズを指定して、-M do でフラグメンテーションを抑制する。

やってみる

  • パケットサイズ 1500 でやってみる
$ ping -M do -s 1500 -c 3 192.168.xx.100
PING 192.168.xx.100 (192.168.xx.100) 1500(1528) bytes of data.
ping: local error: Message too long, mtu=1500
ping: local error: Message too long, mtu=1500
ping: local error: Message too long, mtu=1500

--- 192.168.33.100 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 1999ms

ヘッダサイズ(28 バイト)分があるので ping はエラーとなる。

  • パケットサイズ適正値(1500 – 28 = 1472)
$ ping -M do -s 1472 -c 3 192.168.xx.100
PING 192.168.xx.100 (192.168.xx.100) 1472(1500) bytes of data.
1480 bytes from 192.168.xx.100: icmp_seq=1 ttl=64 time=0.250 ms
1480 bytes from 192.168.xx.100: icmp_seq=2 ttl=64 time=0.314 ms
1480 bytes from 192.168.xx.100: icmp_seq=3 ttl=64 time=0.312 ms

--- 192.168.xx.100 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.250/0.292/0.314/0.029 ms

おお。

  • 1 バイトのおまけも許さない(1473)
$ ping -M do -s 1473 -c 3 192.168.xx.100
PING 192.168.xx.100 (192.168.xx.100) 1473(1501) bytes of data.
ping: local error: Message too long, mtu=1500
ping: local error: Message too long, mtu=1500
ping: local error: Message too long, mtu=1500

--- 192.168.xx.100 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 1999ms

ケチ、おまけしてーと言いたいが…

複数のネットワーク機器が間に入っている場合には…

調べよう。

ということで

全く基礎が出来てないおっさんのメモでした。引き続き、精進します…

以上。

元記事はこちら

(超メモ)ping とか MTU とかよく解ってなかったのでメモ