Jika kita menggunakan ICMP ping
, kita tahu TTL dan round-trip time
disimpan di header IP. Dalam peta header IP di bawah ini kita tahu lokasi TTL, tetapi di mana waktu pulang-pergi ?
Apakah ini disimpan Options
?
Jika kita menggunakan ICMP ping
, kita tahu TTL dan round-trip time
disimpan di header IP. Dalam peta header IP di bawah ini kita tahu lokasi TTL, tetapi di mana waktu pulang-pergi ?
Apakah ini disimpan Options
?
Jawaban:
Waktu pulang pergi sebenarnya tidak disimpan di mana pun. Host pengirim mengingat waktu pengiriman setiap pesan Permintaan Echo ICMP, menggunakan bidang pengidentifikasi dan urutan 16-bit ICMP. Ketika mendapat ICMP Echo Balas, ia mencatat waktu saat ini, menemukan waktu itu mengirim paket Permintaan yang cocok diidentifikasi oleh balasan, menghitung perbedaannya, dan melaporkannya.
Biasanya ping menggunakan bidang identifikasi ICMP untuk membedakan banyak ping simultan, dan bidang urutan untuk membedakan paket individu.
Terserah implementasi untuk memutuskan di mana menyimpan waktu keluar untuk paket yang diberikan: alih-alih menyimpannya di host dalam sebuah tabel, itu biasanya mengirimkannya dalam permintaan keluar dan menggunakan salinan dalam balasan untuk menghitung waktu. (Terima kasih komentator untuk menunjukkan ini.) Ini dikirim dengan cara apa pun yang nyaman untuk implementasi, dan tentu saja harus percaya ujung yang jauh, dan peralatan apa pun, untuk menyalin data dengan benar. Beberapa sistem diketahui mewakili waktu dalam 16 byte dengan resolusi mikrodetik, beberapa sebagai 8 byte dengan resolusi milidetik.
Format di dalam data
bagian paket IP adalah pesan Permintaan / Balas Echo ICMP, disalin di sini dari RFC 792 "Format Pesan Kontrol Internet" (hal 14).
Type
adalah 8 untuk Permintaan, 0 untuk Balas; Code
adalah 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 ...
+-+-+-+-+-
PS. Untuk lebih jelasnya, bidang identifikasi header IP biasanya diatur ke nilai arbitrer, berbeda untuk setiap paket keluar, digunakan untuk reassembly setiap fragmentasi, dan tidak memiliki nilai yang sama dengan apa pun di tubuh ICMP.
Juga, meskipun ada mekanisme yang ditentukan untuk menempatkan cap waktu ke header IP sebagai opsi, ini bukan mekanisme normal untuk ping karena sangat banyak router yang dikonfigurasikan untuk tidak melewati opsi IP tertentu. Lihat RFC 781 Spesifikasi Opsi Stempel Waktu Protokol Internet.
Akhirnya, meskipun semua yang ada di sini ditulis dari sudut pandang IPv4, sesuai dengan pertanyaan aslinya; tapi ping di IPv6 sangat mirip, lihat ICMPv6 RFC 4443 .
ping
di Linux yang menyimpan timestamp di Data
bagian payload ICMP. Itu mengarah ke beberapa pesan kesalahan yang cukup menarik ketika balasan gema melintasi pertukaran internet yang sedikit merusak lokasi itu di setiap paket.
Setidaknya dengan ping
utilitas umum di Linux, waktu ketika paket itu dikirim disimpan di bagian data dari paket permintaan gema, yaitu setelah header IP dan ICMP. Bagian data tetap utuh ketika penerima membalas dengan gema balasan, sehingga pengirim dapat menghitung waktu pulang pergi.
Ini dijelaskan di halaman manual untuk ping
utilitas (di bawah "Detail Paket ICMP"):
Jika ruang data setidaknya ukuran
struct timeval
ping menggunakan byte awal ruang ini untuk menyertakan cap waktu yang digunakan dalam perhitungan waktu perjalanan pulang pergi. Jika ruang data lebih pendek, tidak ada waktu pulang pergi yang diberikan.
Di komputer saya sizeof(struct timeval)
16, jadi mengatur ukuran data paket ke 15 mencegah ping
dari menunjukkan waktu pulang-pergi:
$ 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
Tentu saja, menyimpan stempel waktu kirim dalam utilitas, seperti yang dijelaskan oleh @ jonathanjo, juga akan menjadi implementasi yang mungkin. Bahkan utilitas Linux memerlukan pembukuan internal, karena mendeteksi paket duplikat.