Ping'in "gidiş-dönüş süresi" IP üstbilgisinde nerede saklanır?


9

ICMP'ler kullanırsak ping, TTL'yi biliyoruz round-trip timeve IP başlığında saklanıyoruz. Aşağıdaki IP başlık haritasında TTL'nin yerini biliyoruz, ancak gidiş-dönüş süresi nerede ?

Resim açıklamasını buraya girin

İçinde depolanmış mı Options?

Yanıtlar:


23

Gidiş dönüş süresi aslında hiçbir yerde saklanmaz. Gönderen ana bilgisayar, ICMP'nin 16 bitlik tanımlayıcı ve sıra alanlarını kullanarak her ICMP Yankı İsteği iletisini gönderdiği zamanı hatırlar. ICMP Yankı Yanıtını aldığında, geçerli saati not eder, yanıt tarafından tanımlanan eşleşen İstek paketini gönderdiği zamanı bulur, farkı hesaplar ve raporlar.

Genellikle ping, aynı anda birden çok ping'i ayırmak için ICMP'nin tanımlama alanını ve ayrı ayrı paketleri ayırmak için sıra alanını kullanır.

Belirli bir paket için giden sürenin nerede saklanacağına karar vermek uygulamaya bağlıdır: bunu bir tabloda ana bilgisayarda depolamak yerine, genellikle giden istekte gönderir ve zamanı hesaplamak için yanıttaki kopyayı kullanır. (Bunu işaret ettikleri için yorumculara teşekkür ederiz.) Uygulama için uygun olan her şekilde gönderilir ve elbette verileri düzgün bir şekilde kopyalamak için uzak uca ve herhangi bir müdahale ekipmanına güvenmek zorundadır. Bazı sistemlerin mikrosaniye çözünürlüğünde 16 baytta, bazıları milisaniyede çözünürlüğünde 8 bayt olarak zamanı temsil ettiği bilinmektedir.

dataIP paketinin içindeki format , burada RFC 792 "İnternet Kontrol Mesaj Formatı" ndan (s14) kopyalanan ICMP Yankı Talebi / Cevap mesajıdır .

Typeİstek için 8, Yanıt için 0; Code0.

    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. Daha açık olmak gerekirse, IP başlığının tanımlama alanı normalde, herhangi bir parçalamanın yeniden birleştirilmesi için kullanılan her giden paket için farklı olan rastgele bir değere ayarlanır ve ICMP gövdesindeki herhangi bir değerle aynı değere sahip değildir.

Ayrıca, zaman damgasını IP başlığına bir seçenek olarak koymak için tanımlanmış bir mekanizma olmasına rağmen, ping için normal bir mekanizma değildir, çünkü çok sayıda yönlendirici belirli IP seçeneklerini geçmeyecek şekilde yapılandırılmıştır. Bkz. RFC 781 Internet Protokolü Zaman Damgası Seçeneğinin Belirtimi.

Son olarak, buradaki her şey orijinal soru başına bir IPv4 perspektifinden yazılmış olsa da; ancak IPv6'daki ping işlemi oldukça benzerdir, bkz. ICMPv6 RFC 4443 .


3
AIUI "tanımlama" alanı, parçaların yeniden birleştirilmesi için paketleri tanımlamak için kullanılır. Yankı istekleri, ICMP başlığındaki id ve seq alanlarının yankı yanıtlarıyla eşleştirilir.
Peter Green

İşaret ettiğiniz için teşekkürler: IPMP değil ICMP (ve dediğin gibi seq) olduğunu açıkladım.
jonathanjo

ICMP yükünün bölümünde pingzaman damgasını saklayan Linux üzerinde en az bir uygulama olduğundan eminim Data. Bu, yankı yanıtları, her pakette o konumda biraz bozulan bir internet alışverişinden geçtiğinde oldukça ilginç bir hata mesajına yol açar.
kasperd

Tabii ki haklısın, ve ben bunu cevaplamak için cevabı güncelledim; doğal olarak, RTT'nin kendisi değil, depolanan gönderenin saatine göre gönderme mutlak zamanı.
jonathanjo

3

En azından pingLinux'taki ortak yardımcı programda, paketin gönderildiği zaman yankı istek paketinin veri kısmında, yani IP ve ICMP başlıklarından sonra depolanır. Alıcı bir yankı cevabı ile cevap verdiğinde veri kısmı bozulmadan tutulur, böylece gönderen gidiş-dönüş süresini hesaplayabilir.

Bu yardımcı programın kılavuz sayfasındaping açıklanmıştır ("ICMP PAKET DETAYLARI" altında):

Veri alanı en az struct timevalping boyutundaysa , gidiş-dönüş sürelerinin hesaplanmasında kullandığı bir zaman damgasını dahil etmek için bu alanın başlangıç ​​baytlarını kullanır. Veri alanı daha kısaysa, gidiş-dönüş süreleri verilmez.

Makinemde sizeof(struct timeval)16, bu nedenle paket veri boyutunu 15 olarak ayarlamak pinggidiş-dönüş sürelerinin gösterilmesini önler :

$ 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

Elbette, @ jonathanjo'nun cevabının açıkladığı gibi, gönderme zaman damgasını yardımcı program içinde saklamak da olası bir uygulama olacaktır. Linux yardımcı programı bile yinelenen paketleri algıladığından dahili bir defter tutmaya ihtiyaç duyar.


1
Veri boyutunu 16'dan küçük olacak şekilde ayarladığınızda RTT'yi görüntüleyemedikleri bir program hatası gibi geliyor.
canadadry

@canadadry, Eh, zaman damgasını paketin içine koymak sadece açıktır: gereken tek durum cevap paketinin geldiği zamandır, bu yüzden yerel olarak depolamanın bir faydası yoktur. Tabii ki, program 80'lerin BSD orijinalinden türetilmiş gibi görünüyor, bu yüzden zamanlarla da ilgili bir şey olabilir. Her neyse, neden bu kadar küçük paketleri kullanmak isteyeceğinizden tam olarak emin değilim. Minimum Ethernet çerçeve boyutunun bile Ethernet, IP ve ICMP başlıklarına ve 16 baytlık bir zaman damgasına sığacak kadar büyük olduğunu unutmayın. (Gerçi 2 bayt kaldı, daha fazla uzatma için çok fazla yer yok.)
ilkkachu

@ilkkachu Bana zamanın sıkça nerede saklandığını hatırlattığın için teşekkürler; Cevabımı güncelledim. Küçük paketler: birçok ağ sorunu paket boyutunda farklılaşır.
jonathanjo

@ikkachu Cisco'nun ping paketlerine bir göz attım: 64 bit milisaniye olarak zamanları da var.
jonathanjo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.