답변:
왕복 시간은 실제로 어디에도 저장되지 않습니다. 보내는 호스트는 ICMP의 16 비트 식별자 및 시퀀스 필드를 사용하여 각 ICMP 에코 요청 메시지를 보내는 시간을 기억합니다. ICMP 에코 응답을 받으면 현재 시간을 기록하고 응답으로 식별 된 일치하는 요청 패킷을 보낸 시간을 찾아 차이를 계산하여보고합니다.
일반적으로 핑은 ICMP의 식별 필드를 사용하여 여러 동시 핑을 구별하고 시퀀스 필드는 개별 패킷을 구별합니다.
주어진 패킷에 대해 나가는 시간을 저장할 위치를 결정하는 것은 구현에 달려 있습니다. 호스트의 패킷을 테이블에 저장하는 대신, 나가는 요청에이를 보내고 회신에 사본을 사용하여 시간을 계산합니다. (이 점을 지적 해주신 의견 제시 자에게 감사합니다.) 구현에 편리한 어떤 방식 으로든 전송되며 물론 데이터를 올바르게 복사하려면 파 엔드와 모든 중재 장비를 신뢰해야합니다. 일부 시스템은 마이크로 초 분해능으로 16 바이트, 밀리 초 분해능으로 8 바이트로 시간을 나타내는 것으로 알려져 있습니다.
data
IP 패킷 부분 내부의 형식 은 ICMP Echo Request / Reply 메시지이며 RFC 792 "Internet Control Message Format"(p14) 에서 복사했습니다 .
Type
요청은 8, 답장은 0입니다. Code
0입니다.
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을 참조하십시오 .
ping
타임 스탬프를 저장하는 Linux 에서 적어도 하나의 구현이 있다고 확신 Data
합니다. 에코 응답이 인터넷 교환을 통과하여 모든 패킷에서 해당 위치의 비트가 손상되었을 때 매우 흥미로운 오류 메시지가 나타납니다.
적어도 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 유틸리티조차도 중복 패킷을 감지하므로 내부 부기 기능이 필요합니다.