Ping의 "왕복 시간"은 IP 헤더에 어디에 저장되어 있습니까?


9

ICMP를 사용 ping하면 TTL을 알고 round-trip timeIP 헤더에 저장됩니다. 아래 IP 헤더 맵에서 우리는 TTL의 위치를 ​​알고 있지만 왕복 시간은 어디입니까?

여기에 이미지 설명을 입력하십시오

에 저장되어 Options있습니까?

답변:


23

왕복 시간은 실제로 어디에도 저장되지 않습니다. 보내는 호스트는 ICMP의 16 비트 식별자 및 시퀀스 필드를 사용하여 각 ICMP 에코 요청 메시지를 보내는 시간을 기억합니다. ICMP 에코 응답을 받으면 현재 시간을 기록하고 응답으로 식별 된 일치하는 요청 패킷을 보낸 시간을 찾아 차이를 계산하여보고합니다.

일반적으로 핑은 ICMP의 식별 필드를 사용하여 여러 동시 핑을 구별하고 시퀀스 필드는 개별 패킷을 구별합니다.

주어진 패킷에 대해 나가는 시간을 저장할 위치를 결정하는 것은 구현에 달려 있습니다. 호스트의 패킷을 테이블에 저장하는 대신, 나가는 요청에이를 보내고 회신에 사본을 사용하여 시간을 계산합니다. (이 점을 지적 해주신 의견 제시 자에게 감사합니다.) 구현에 편리한 어떤 방식 으로든 전송되며 물론 데이터를 올바르게 복사하려면 파 엔드와 모든 중재 장비를 신뢰해야합니다. 일부 시스템은 마이크로 초 분해능으로 16 바이트, 밀리 초 분해능으로 8 바이트로 시간을 나타내는 것으로 알려져 있습니다.

dataIP 패킷 부분 내부의 형식 은 ICMP Echo Request / Reply 메시지이며 RFC 792 "Internet Control Message Format"(p14) 에서 복사했습니다 .

Type요청은 8, 답장은 0입니다. Code0입니다.

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type      |     Code      |          Checksum             |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Identifier          |        Sequence Number        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Data ...
   +-+-+-+-+-

추신. 명확하게 말하면, IP 헤더의 식별 필드는 일반적으로 각 발신 패킷마다 다른 임의의 값으로 설정되며, 조각화를 재 조립하는 데 사용되며 ICMP 본문의 값과 동일한 값을 갖지 않습니다.

또한 타임 스탬프를 옵션으로 IP 헤더에 넣는 메커니즘이 정의되어 있지만 특정 IP 옵션을 전달하지 않도록 많은 라우터가 구성되어 있기 때문에 이는 핑의 일반적인 메커니즘이 아닙니다. 인터넷 프로토콜 타임 스탬프 옵션의 RFC 781 사양을 참조하십시오 .

마지막으로, 여기의 모든 내용은 원래 질문에 따라 IPv4 관점에서 작성되었지만; 그러나 IPv6의 핑은 매우 유사 합니다. ICMPv6 RFC 4443을 참조하십시오 .


3
AIUI "식별"필드는 단편 재 조립을위한 패킷을 식별하는 데 사용됩니다. 에코 요청은 ICMP 헤더의 id 및 seq 필드로 응답을 에코하도록 일치합니다.
피터 그린

지적 해 주셔서 감사합니다. IP ID가 아닌 ICMP임을 분명히했습니다 (당신이 말하는대로 seq).
jonathanjo

나는 ICMP 페이로드 섹션에 ping타임 스탬프를 저장하는 Linux 에서 적어도 하나의 구현이 있다고 확신 Data합니다. 에코 응답이 인터넷 교환을 통과하여 모든 패킷에서 해당 위치의 비트가 손상되었을 때 매우 흥미로운 오류 메시지가 나타납니다.
kasperd

물론 당신은 맞습니다. 나는 이것을 말하기 위해 대답을 업데이트했습니다. 물론 자연스럽게 RTT 자체가 아니라 저장된 발신자의 시계에 따라 전송 절대 시간입니다.
jonathanjo

3

적어도 ping리눅스 에서 일반적인 유틸리티를 사용하면 패킷이 전송 된 시간이 에코 요청 패킷의 데이터 부분, 즉 IP 및 ICMP 헤더 이후에 저장됩니다. 수신자가 에코 응답으로 응답 할 때 데이터 부분은 그대로 유지되므로 발신자가 왕복 시간을 계산할 수 있습니다.

유틸리티 에 대한 매뉴얼 페이지ping ( "ICMP PACKET DETAILS"아래)에 설명되어 있습니다.

데이터 공간이 최소한 struct timeval핑 크기 인 경우이 공간의 시작 바이트를 사용하여 왕복 시간 계산에 사용하는 시간 소인을 포함합니다. 데이터 공간이 더 짧으면 왕복 시간이 주어지지 않습니다.

내 컴퓨터 sizeof(struct timeval)에서 16이므로 패킷 데이터 크기를 15로 설정하면 ping왕복 시간이 표시되지 않습니다.

$ ping -s 15 8.8.8.8 
PING 8.8.8.8 (8.8.8.8) 15(43) bytes of data.
23 bytes from 8.8.8.8: icmp_seq=1 ttl=121

물론 @jonathanjo의 답변에서 설명한 것처럼 유틸리티 내에 전송 타임 스탬프를 저장하는 것도 가능합니다. Linux 유틸리티조차도 중복 패킷을 감지하므로 내부 부기 기능이 필요합니다.


1
데이터 크기를 16보다 작게 설정하면 RTT를 표시 할 수없는 프로그램 버그 인 것 같습니다. 그러나 좋은 점입니다.
캐나다 드라이

@canadadry, 글쎄, 타임 스탬프를 패킷 자체에 넣는 것은 명백하다. 필요한 유일한 상황은 응답 패킷이 올 때뿐이므로 로컬에 저장하는 데 쓸모가 없다. 물론이 프로그램은 '80 년대 BSD 원본에서 파생 된 것으로 보이므로 시간과 관련이있을 수도 있습니다. 어쨌든, 왜 누군가가 그렇게 작은 패킷을 사용하고 싶어하는지 정확히 모르겠습니다. 최소 이더넷 프레임 크기조차도 이더넷, IP 및 ICMP 헤더 및 16 바이트 타임 스탬프에 맞도록 충분히 큽니다. (2 바이트가 남았으므로 더 이상 확장 할 여지가 없습니다.)
ilkkachu

@ilkkachu 시간이 자주 저장되는 위치를 상기시켜 주셔서 감사합니다. 답변을 업데이트했습니다. 작은 패킷 : 많은 네트워크 문제가 패킷 크기에 따라 다릅니다.
jonathanjo

@ikkachu 필자는 Cisco의 핑 패킷을 살펴 보았습니다. 64 비트 밀리 초 단위의 시간도 있습니다.
jonathanjo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.