핑이 0바이트를 보냄

핑이 0바이트를 보냄

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 또는 핑을 보낼 수 있다고 주장하는 기타 플랫폼에서는 핑이 0바이트일 수 없습니다. 패킷에는 적어도 하나의 IP 헤더가 포함되어야 하며, 잘 구성된 비 트릭 플레이 핑에는 8바이트 길이의 ICMP 헤더도 포함됩니다.

Windows에서는 수신된 바이트를 출력하는 방식이 다를 수 있습니다. Linux는 패킷의 ICMP 부분 크기를 알려줍니다(ICMP 헤더의 8바이트 + 존재하는 모든 ICMP 데이터). Windows에서는 ICMP 페이로드 데이터 바이트 수를 인쇄하여 "0"이라고 표시하더라도 8개의 ICMP 헤더 바이트가 여전히 존재하도록 할 수 있습니다. 실제로 ICMP 바이트가 0이라는 것은 패킷이 원래 IP 헤더이고 더 이상 ICMP 핑 요청이 아니라는 것을 의미합니다. 요점은 Windows에서 ping 패킷의 길이가 0바이트라고 알려주더라도 사실이 아니라는 것입니다.

ICMP 에코 요청 또는 에코 응답 패킷의 최소 크기는 28바이트입니다.

  • 20바이트 IP 헤더,
  • 4바이트 ICMP 헤더,
  • 4바이트 에코 요청/응답 헤더 데이터,
  • ICMP 페이로드 데이터 0바이트.

Linux에서 핑할 때 인쇄:

8 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64

이 8바이트는 4바이트 ICMP 헤더 및 4바이트 ICMP 에코 응답 헤더 데이터로, 0바이트 ICMP 페이로드 데이터 크기를 반영합니다.

답변2

레이어 2 전송 매체는 무엇입니까? 이더넷? 이더넷 프레임이 어떤 내용을 전달하든 관계없이 64바이트보다 짧을 수 없습니다.

따라서 페이로드가 0바이트인 ICMP ping을 보낼 수 있더라도 이더넷 카드는 전송을 위해 프레임을 64바이트로 채웁니다.

@Casey는 이론적 최소값이 28바이트임을 나타냅니다. 그러나 이더넷에서는 36바이트의 패딩을 추가하여 총 64바이트가 됩니다. 누락된 것은 Runt 패킷인데 너무 짧습니다.

왜 64바이트인가? 이는 비트 전송 시간 및 충돌 감지와 관련된 완전히 새로운 문제이며 이더넷은 CSMA/CA가 아닌 CSMA/CD 도메인입니다.

답변3

헤더 크기와 페이로드 크기(데이터)를 구별해야 합니다. ICMP 패킷은 선택적으로 데이터를 보유할 수 있습니다. 헤더의 크기는 64비트, 즉 8바이트로 일정합니다. 페이로드는 다를 수도 있고 존재하지 않을 수도 있습니다. 이는 0바이트를 보내는 것을 의미하며 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 헤더에서 나옵니다.

관련 정보