Linux(CentOS)のpingコマンドは0バイトを送信できますか? Windowsでは、試行された-l
パラメータコマンドを使用して
定義できます。
ping localhost -s 0
PING localhost (127.0.0.1) 0(28) bytes of data.
8 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64
8 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64
^C
--- localhost ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
man ping
-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.
編集1:誰かが必要な場合に備えてWindows ping出力を追加しました。
ping 127.0.0.1 -l 0
Pinging 127.0.0.1 with 0 bytes of data:
Reply from 127.0.0.1: bytes=0 time<1ms TTL=128
Reply from 127.0.0.1: bytes=0 time<1ms TTL=128
Reply from 127.0.0.1: bytes=0 time<1ms TTL=128
Ping statistics for 127.0.0.1:
Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
ping 127.0.0.1
Pinging 127.0.0.1 with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Ping statistics for 127.0.0.1:
Packets: Sent = 3, Received = 3, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 0ms, Maximum = 0ms, Average = 0ms
答え1
Linux、Windows、またはPingを送信できると主張する他のプラットフォームでは、Pingは0バイトにすることはできません。パケットには少なくとも1つのIPヘッダーを含める必要があり、よく構成された非トリックプレーピングには8バイト長のICMPヘッダーも含まれます。
Windowsでは、受信したバイトの出力方法が異なる場合があります。 LinuxはパケットのICMP部分サイズを知らせます(ICMPヘッダーの8バイト+存在するすべてのICMPデータ)。 Windowsでは、ICMPペイロードデータバイト数を印刷して「0」とマークしても、8つのICMPヘッダバイトがまだ存在するようにすることができます。実際、ICMPバイトが0であることは、パケットが元のIPヘッダーであり、もはやICMP ping要求ではないことを意味します。要点は、Windowsがpingパケットの長さが0バイトであることを知らせても、それは本当ではないということです。
ICMPエコー要求またはエコー応答パケットの最小サイズは28バイトです。
- 20バイトのIPヘッダー、
- 4バイトICMPヘッダ、
- 4バイトエコーリクエスト/レスポンスヘッダデータ、
- ICMPペイロードデータ0バイト。
Linuxでpingするときの印刷:
8 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64
この8バイトは、4バイトのICMPヘッダーと4バイトのICMPエコー応答ヘッダーデータで、0バイトのICMPペイロードデータサイズを反映しています。
答え2
レイヤ2伝送媒体とは何ですか?イーサネット?イーサネットフレームがどのコンテンツを転送しても、64バイトより短くすることはできません。
したがって、ペイロードがゼロバイトのICMP pingを送信できますが、イーサネットカードは送信用にフレームを64バイトで埋めます。
@Caseyは、理論的最小値が28バイトであることを示します。ただし、イーサネットでは36バイトのパディングを追加して合計64バイトになります。欠落しているのはラントパケットですが、短すぎます。
なぜ64バイトですか?これはビット転送時間と衝突検出に関するまったく新しい問題であり、イーサネットはCSMA / CAではなくCSMA / CDドメインです。
答え3
ヘッダーサイズとペイロードサイズ(データ)を区別する必要があります。 ICMPパケットはオプションでデータを保持できます。ヘッダーのサイズは64ビット、つまり8バイトで一定です。ペイロードは異なる場合も存在しない場合もあります。これはゼロバイトを送信することを意味し、man
-pageで正確に説明されていますping
。
-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.
パケットサイズを0に設定すると、以下が出力されます。
ping -s 0 192.168.172.51
PING 192.168.172.51 (192.168.172.51) 0(28) bytes of data.
8 bytes from 192.168.172.51: icmp_seq=1 ttl=63
8 bytes from 192.168.172.51: icmp_seq=2 ttl=63
ご覧のとおり、ヘッダーとペイロードを含む8バイトが言及されています。任意のパケットサイズで追加のテストを実行すると、追加のヘッダーの一定サイズのため、8バイトが常に追加で送信されることを確認できます。
これもtcpdump
証明されています:
11:49:30.271160 IP 192.168.172.50 > 192.168.172.51: ICMP echo request, id 5472, seq 30, length 8
ヘッダー行の28個の追加バイト0(28)はIP + ICMPヘッダーから来ます。