Di mana "round-trip time" Ping disimpan dalam header IP?

9

Jika kita menggunakan ICMP ping, kita tahu TTL dan round-trip timedisimpan di header IP. Dalam peta header IP di bawah ini kita tahu lokasi TTL, tetapi di mana waktu pulang-pergi ?

Masukkan deskripsi gambar di sini

Apakah ini disimpan Options?

pesawat terbang
sumber

Jawaban:

23

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 databagian paket IP adalah pesan Permintaan / Balas Echo ICMP, disalin di sini dari RFC 792 "Format Pesan Kontrol Internet" (hal 14).

Typeadalah 8 untuk Permintaan, 0 untuk Balas; Codeadalah 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 .

Jonathanjo
sumber
3
AIUI bidang "identifikasi" digunakan untuk mengidentifikasi paket-paket untuk dirangkai kembali. Permintaan gema dicocokkan dengan gema balasan oleh bidang id dan seq di header ICMP.
Peter Green
Terima kasih telah menunjukkan: Saya mengklarifikasi bahwa ICMP bukan IP id (dan seq, seperti yang Anda katakan).
jonathanjo
Saya cukup yakin ada setidaknya satu implementasi pingdi Linux yang menyimpan timestamp di Databagian 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.
kasperd
Anda tentu saja benar, dan saya memperbarui jawaban untuk mengatakan ini; meskipun secara alami itu adalah waktu pengiriman absolut menurut jam pengirim yang disimpan, bukan RTT itu sendiri.
jonathanjo
3

Setidaknya dengan pingutilitas 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 pingutilitas (di bawah "Detail Paket ICMP"):

Jika ruang data setidaknya ukuran struct timevalping 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 pingdari 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.

ilkkachu
sumber
1
Rasanya seperti ini adalah bug program yang mereka tidak dapat menampilkan RTT ketika Anda mengatur ukuran data menjadi kurang dari 16. Tapi poin yang bagus.
canadadry
@adadadry, Ya, menempatkan stempel waktu di dalam paket itu sendiri sudah jelas: satu-satunya situasi yang diperlukan adalah ketika paket balasan datang, jadi tidak ada gunanya menyimpannya secara lokal. Tentu saja, program ini tampaknya berasal dari BSD '80 -an, jadi mungkin ada hubungannya dengan perkembangan zaman. Lagi pula, saya tidak begitu yakin mengapa ada orang yang ingin menggunakan paket ekstra kecil seperti itu. Perhatikan bahwa ukuran frame Ethernet minimum cukup besar untuk disesuaikan dengan header Ethernet, IP, dan ICMP, dan cap waktu 16 byte. (Meskipun dengan 2 byte tersisa, jadi tidak banyak ruang untuk perpanjangan lebih lanjut.)
ilkkachu
@ilkkachu terima kasih telah mengingatkan saya di mana waktu sering disimpan; Saya memperbarui jawaban saya. Paket kecil: banyak masalah jaringan dibedakan berdasarkan ukuran paket.
jonathanjo
@ikkachu Saya melihat paket ping Cisco: mereka juga punya waktu, karena hitungan 64-bit milidetik.
jonathanjo