「超メモはスゴイメモではなくただのメモです」のかっぱです。
tl;dr
ping と MTU とかそういう言葉に触れる機会があってナンノコッチャって感じになったので、改めてインターネットの情報をかいつまんで整理してみる。
memo
参考
- Tech TIPS:pingでMTUサイズを調査する - @IT
- 管理者必見! ネットワーク・コマンド集 - pingコマンドで通信経路の最大MTUサイズを調べる:ITpro
- 検閲Tech: Linux上のpingコマンドで経路上のMTUを調べる
- MTU / MSS / RWINとは
有難うございます
以下、ほぼこちらの記事の抜粋。有難うございます。
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
ケチ、おまけしてーと言いたいが...
複数のネットワーク機器が間に入っている場合には...
調べよう。
ということで
全く基礎が出来てないおっさんのメモでした。引き続き、精進します...
以上。