Trường hợp thời gian khứ hồi khứ hồi của Ping được lưu trữ trong tiêu đề IP?


9

Nếu chúng tôi sử dụng ICMP ping, chúng tôi biết TTL và round-trip timeđược lưu trữ trong tiêu đề IP. Trong bản đồ tiêu đề IP bên dưới, chúng tôi biết vị trí của TTL, nhưng thời gian khứ hồi ở đâu?

Nhập mô tả hình ảnh ở đây

Nó được lưu trữ trong Options?

Câu trả lời:


23

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 dataphầ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).

Typelà 8 cho Yêu cầu, 0 cho Trả lời; Codelà 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 .


3
AIUI, trường "nhận dạng" được sử dụng để xác định các gói để phân chia lại đoạn. Yêu cầu Echo được khớp với phản hồi echo của các trường id và seq trong tiêu đề ICMP.
Peter Green

Cảm ơn bạn đã chỉ ra: Tôi đã làm rõ ICMP không phải IP id (và seq, như bạn nói).
jonathanjo

Tôi khá chắc chắn rằng có ít nhất một triển khai pingtrên Linux lưu trữ dấu thời gian trong Dataphầ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.
kasperd

Tất nhiên bạn đúng, và tôi đã cập nhật câu trả lời để nói điều này; mặc dù tự nhiên đó là thời gian gửi tuyệt đối theo đồng hồ của người gửi được lưu trữ chứ không phải RTT.
jonathanjo

3

Ít nhất là với pingtiệ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 pingtiệ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 timevalping 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 pinghiể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.


1
Cảm giác như đó là một lỗi chương trình mà họ không thể hiển thị RTT khi bạn đặt kích thước dữ liệu nhỏ hơn 16. Nhưng điểm tốt.
canadadry

@canadadry, Chà, việc đặt dấu thời gian vào chính gói đó là điều hiển nhiên: tình huống duy nhất cần có là khi gói trả lời xuất hiện, vì vậy không có cách nào lưu trữ cục bộ. Tất nhiên, chương trình dường như bắt nguồn từ bản gốc BSD của thập niên 80, do đó, nó cũng có thể có liên quan đến thời đại. Dù sao, tôi không chắc chắn chính xác tại sao mọi người muốn sử dụng các gói cực nhỏ như vậy. Lưu ý rằng ngay cả kích thước khung Ethernet tối thiểu cũng đủ lớn để phù hợp với các tiêu đề Ethernet, IP và ICMP và dấu thời gian 16 byte. (Mặc dù còn lại 2 byte, vì vậy không còn nhiều chỗ cho bất kỳ tiện ích mở rộng nào nữa.)
ilkkachu

@ilkkachu cảm ơn vì đã nhắc tôi nơi thời gian thường được lưu trữ; Tôi cập nhật câu trả lời của tôi. Re gói nhỏ: nhiều vấn đề mạng được phân biệt trên kích thước gói.
jonathanjo

@ikkachu Tôi đã xem qua các gói ping của Cisco: chúng cũng có thời gian, là số lượng 64 mili giây.
jonathanjo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.