ถ้าเราใช้ ICMP ping
เรารู้ว่า TTL และround-trip time
ถูกเก็บไว้ในส่วนหัวของ IP ในแผนที่ส่วนหัวด้านล่างเรารู้ตำแหน่งของ TTL แต่เวลาไปกลับอยู่ที่ไหน
มันถูกเก็บไว้ในOptions
?
ถ้าเราใช้ ICMP ping
เรารู้ว่า TTL และround-trip time
ถูกเก็บไว้ในส่วนหัวของ IP ในแผนที่ส่วนหัวด้านล่างเรารู้ตำแหน่งของ TTL แต่เวลาไปกลับอยู่ที่ไหน
มันถูกเก็บไว้ในOptions
?
คำตอบ:
เวลาไปกลับไม่ได้ถูกจัดเก็บจริง โฮสต์ที่ส่งจะจดจำเวลาที่ส่ง ICMP Echo Request แต่ละข้อความโดยใช้ตัวระบุและลำดับของฟิลด์ 16 บิตของ ICMP เมื่อได้รับการตอบกลับ ICMP Echo มันจะบันทึกเวลาปัจจุบันค้นหาเวลาที่ส่งแพ็กเก็ตคำขอที่ตรงกันที่ระบุโดยการตอบกลับคำนวณความแตกต่างและรายงาน
โดยทั่วไปการ ping ใช้ฟิลด์การระบุของ ICMP เพื่อแยก ping หลายรายการพร้อมกันและเขตลำดับเพื่อแยกความแตกต่างของแต่ละแพ็กเก็ต
มันขึ้นอยู่กับการนำไปใช้ในการตัดสินใจว่าจะเก็บเวลาขาออกสำหรับแพ็กเก็ตที่กำหนด: แทนที่จะเก็บไว้บนโฮสต์ในตารางโดยทั่วไปจะส่งในคำขอขาออกและใช้สำเนาในการตอบกลับเพื่อคำนวณเวลา (ขอขอบคุณผู้แสดงความคิดเห็นที่ชี้เรื่องนี้) สิ่งนี้ถูกส่งไปในทุก ๆ ทางที่สะดวกสำหรับการนำไปปฏิบัติและแน่นอนว่าต้องเชื่อมั่นในสุดยอดและอุปกรณ์ที่แทรกแซงเพื่อคัดลอกข้อมูลอย่างถูกต้อง ระบบบางระบบเป็นที่รู้จักกันเพื่อแสดงเวลาใน 16 ไบต์ด้วยความละเอียดของ microseconds บางส่วนเป็น 8 ไบต์ด้วยความละเอียดของมิลลิวินาที
รูปแบบภายในdata
ส่วนของแพ็คเก็ต IP คือข้อความคำขอ / ตอบ ICMP Echo คัดลอกมาที่นี่จากRFC 792 "รูปแบบข้อความควบคุมอินเทอร์เน็ต" (หน้า 14)
Type
คือ 8 สำหรับคำขอ 0 สำหรับการตอบกลับ; Code
คือ 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 เพื่อให้ชัดเจนฟิลด์รหัสประจำตัวของส่วนหัว IP จะถูกตั้งค่าตามอำเภอใจซึ่งแตกต่างกันสำหรับแต่ละแพ็คเก็ตขาออกใช้สำหรับประกอบชิ้นส่วนใด ๆ อีกครั้งและไม่มีค่าเดียวกับสิ่งใด ๆ ในร่างกาย ICMP
นอกจากนี้แม้ว่าจะมีกลไกที่กำหนดไว้สำหรับการประทับเวลาลงในส่วนหัวของ IP เป็นตัวเลือก แต่นี่ไม่ใช่กลไกปกติสำหรับการ ping เนื่องจากเราเตอร์จำนวนมากถูกกำหนดค่าไม่ให้ผ่านตัวเลือก IP บางตัว ดูRFC 781ข้อมูลจำเพาะของตัวเลือกการประทับเวลาอินเทอร์เน็ตโปรโตคอล
ในที่สุดแม้ว่าทุกอย่างที่นี่เขียนจากมุมมอง IPv4 ตามคำถามเดิม แต่ปิงใน IPv6 จะคล้ายกันมากดู ICMPv6 RFC 4443
ping
บน Linux ซึ่งเก็บการประทับเวลาในData
ส่วนของ ICMP payload สิ่งนี้นำไปสู่ข้อความแสดงข้อผิดพลาดที่น่าสนใจเมื่อ echo ตอบผ่านการแลกเปลี่ยนอินเทอร์เน็ตซึ่งทำให้เกิดความเสียหายเล็กน้อยในตำแหน่งนั้นในทุก ๆ แพ็คเก็ต
อย่างน้อยด้วยping
ยูทิลิตี้ทั่วไปบน Linux เวลาที่แพ็กเก็ตถูกส่งไปจะถูกเก็บไว้ในส่วนข้อมูลของแพ็กเก็ตคำขอ echo นั่นคือหลังส่วนหัวของ IP และ ICMP ส่วนของข้อมูลจะยังคงเหมือนเดิมเมื่อผู้รับตอบกลับด้วยการตอบกลับแบบ echo ดังนั้นผู้ส่งสามารถคำนวณเวลาไปกลับ
สิ่งนี้อธิบายไว้ในman page สำหรับping
ยูทิลิตี (ใต้ "ICMP PACKET DETAILS"):
หากพื้นที่ข้อมูลมีขนาดอย่างน้อย
struct timeval
ping จะใช้ไบต์เริ่มต้นของพื้นที่นี้เพื่อรวมเวลาประทับที่ใช้ในการคำนวณเวลาของการเดินทางไปกลับ หากพื้นที่ข้อมูลสั้นลงจะไม่มีการกำหนดเวลาไปกลับ
บนเครื่องของฉันsizeof(struct timeval)
คือ 16 ดังนั้นการตั้งค่าขนาดข้อมูลแพ็คเก็ตเป็น 15 ป้องกันไม่ให้ping
แสดงเวลาไปกลับ:
$ 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
แน่นอนการจัดเก็บการประทับเวลาการส่งภายในยูทิลิตี้ตามที่คำตอบของ @ jonathanjo อธิบายจะเป็นการนำไปปฏิบัติได้เช่นกัน แม้แต่ยูทิลิตี้ Linux ก็ต้องการการทำบัญชีภายในเนื่องจากตรวจจับแพ็คเก็ตที่ซ้ำกัน