Câu trả lời:
Thời gian khứ hồi không thực sự được lưu trữ ở bất cứ đâu. Máy chủ gửi ghi nhớ thời gian gửi mỗi tin nhắn Yêu cầu Echo của ICMP, sử dụng các trường nhận dạng và chuỗi 16 bit của ICMP. Khi nhận được Trả lời Echo ICMP, nó ghi lại thời gian hiện tại, tìm thời gian nó gửi gói Yêu cầu phù hợp được xác định bởi phản hồi, tính toán sự khác biệt và báo cáo nó.
Thông thường ping sử dụng trường nhận dạng của ICMP để phân biệt nhiều ping đồng thời và trường chuỗi để phân biệt các gói riêng lẻ.
Việc quyết định nơi lưu trữ thời gian gửi cho một gói nhất định tùy thuộc vào việc thực hiện: thay vì lưu trữ nó trên máy chủ trong bảng, nó thường gửi nó trong yêu cầu gửi đi và sử dụng bản sao trong phản hồi để tính thời gian. (Cảm ơn các nhà bình luận đã chỉ ra điều này.) Nó được gửi theo bất kỳ cách nào thuận tiện cho việc triển khai và tất nhiên phải tin vào đầu xa, và bất kỳ thiết bị can thiệp nào, để sao chép dữ liệu chính xác. Một số hệ thống được biết là biểu thị thời gian bằng 16 byte với độ phân giải là micro giây, một số là 8 byte với độ phân giải là mili giây.
Định dạng bên trong data
phần của gói IP là tin nhắn Yêu cầu / Trả lời Echo của ICMP, được sao chép ở đây từ RFC 792 "Định dạng tin nhắn điều khiển Internet" (tr14).
Type
là 8 cho Yêu cầu, 0 cho Trả lời; Code
là 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 ...
+-+-+-+-+-
Tái bút Để rõ ràng, trường nhận dạng của tiêu đề IP thường được đặt thành một giá trị tùy ý, khác nhau cho mỗi gói gửi đi, được sử dụng để lắp lại bất kỳ phân mảnh nào và không có cùng giá trị như bất kỳ thứ gì trong thân ICMP.
Ngoài ra, mặc dù có một cơ chế được xác định để đặt dấu thời gian vào tiêu đề IP dưới dạng tùy chọn, đây không phải là cơ chế thông thường cho ping vì rất nhiều bộ định tuyến được định cấu hình không vượt qua một số tùy chọn IP nhất định. Xem Đặc điểm kỹ thuật RFC 781 của Tùy chọn Dấu thời gian Giao thức Internet.
Cuối cùng, mặc dù mọi thứ ở đây được viết từ góc độ IPv4, theo câu hỏi ban đầu; nhưng ping trong IPv6 cực kỳ giống nhau, xem ICMPv6 RFC 4443 .
ping
trên Linux lưu trữ dấu thời gian trong Data
phần của tải trọng ICMP. Điều đó dẫn đến một số thông báo lỗi khá thú vị khi tiếng vang trả lời đi ngang qua một trao đổi internet bị hỏng một chút ở vị trí đó trong mỗi gói.
Ít nhất là với ping
tiện ích phổ biến trên Linux, thời gian gói tin được gửi được lưu trữ trong phần dữ liệu của gói yêu cầu echo, tức là sau các tiêu đề IP và ICMP. Phần dữ liệu được giữ nguyên khi người nhận trả lời bằng phản hồi tiếng vang, vì vậy người gửi có thể tính thời gian khứ hồi.
Điều này được mô tả trong trang man cho ping
tiện ích (trong "CHI TIẾT GÓI ICMP"):
Nếu không gian dữ liệu có kích thước tối thiểu bằng
struct timeval
ping sử dụng các byte đầu của không gian này để bao gồm dấu thời gian mà nó sử dụng trong tính toán thời gian khứ hồi. Nếu không gian dữ liệu ngắn hơn, không có thời gian khứ hồi được đưa ra.
Trên máy của tôi sizeof(struct timeval)
là 16, vì vậy, đặt kích thước dữ liệu gói thành 15 sẽ không ping
hiển thị thời gian khứ hồi:
$ 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
Tất nhiên, lưu trữ dấu thời gian gửi trong tiện ích, như câu trả lời của @ jonathanjo mô tả, cũng sẽ là một triển khai có thể. Ngay cả tiện ích Linux cũng cần một số sổ sách nội bộ, vì nó phát hiện các gói trùng lặp.