"เวลาไปกลับ" ของ Ping อยู่ที่ไหนในส่วนหัวของ IP


9

ถ้าเราใช้ ICMP pingเรารู้ว่า TTL และround-trip timeถูกเก็บไว้ในส่วนหัวของ IP ในแผนที่ส่วนหัวด้านล่างเรารู้ตำแหน่งของ TTL แต่เวลาไปกลับอยู่ที่ไหน

ป้อนคำอธิบายภาพที่นี่

มันถูกเก็บไว้ในOptions?

คำตอบ:


23

เวลาไปกลับไม่ได้ถูกจัดเก็บจริง โฮสต์ที่ส่งจะจดจำเวลาที่ส่ง 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


3
AIUI จะใช้ฟิลด์ "การระบุ" เพื่อระบุแพ็คเก็ตสำหรับการประกอบชิ้นส่วนใหม่ คำร้องขอ Echo ถูกจับคู่เพื่อตอบกลับ echo โดยฟิลด์ id และ seq ในส่วนหัว ICMP
ปีเตอร์กรีน

ขอบคุณที่ชี้ให้เห็น: ฉันชี้แจงว่าเป็น ICMP ไม่ใช่ IP id (และ seq ตามที่คุณพูด)
jonathanjo

ฉันค่อนข้างมั่นใจว่ามีอย่างน้อยหนึ่งการใช้งานpingบน Linux ซึ่งเก็บการประทับเวลาในDataส่วนของ ICMP payload สิ่งนี้นำไปสู่ข้อความแสดงข้อผิดพลาดที่น่าสนใจเมื่อ echo ตอบผ่านการแลกเปลี่ยนอินเทอร์เน็ตซึ่งทำให้เกิดความเสียหายเล็กน้อยในตำแหน่งนั้นในทุก ๆ แพ็คเก็ต
kasperd

คุณพูดถูกและฉันก็อัพเดตคำตอบเพื่อพูดสิ่งนี้ แม้ว่าโดยธรรมชาติแล้วมันเป็นเวลาที่แน่นอนในการส่งตามนาฬิกาของผู้ส่งที่เก็บไว้ไม่ใช่ RTT
jonathanjo

3

อย่างน้อยด้วยpingยูทิลิตี้ทั่วไปบน Linux เวลาที่แพ็กเก็ตถูกส่งไปจะถูกเก็บไว้ในส่วนข้อมูลของแพ็กเก็ตคำขอ echo นั่นคือหลังส่วนหัวของ IP และ ICMP ส่วนของข้อมูลจะยังคงเหมือนเดิมเมื่อผู้รับตอบกลับด้วยการตอบกลับแบบ echo ดังนั้นผู้ส่งสามารถคำนวณเวลาไปกลับ

สิ่งนี้อธิบายไว้ในman page สำหรับpingยูทิลิตี (ใต้ "ICMP PACKET DETAILS"):

หากพื้นที่ข้อมูลมีขนาดอย่างน้อยstruct timevalping จะใช้ไบต์เริ่มต้นของพื้นที่นี้เพื่อรวมเวลาประทับที่ใช้ในการคำนวณเวลาของการเดินทางไปกลับ หากพื้นที่ข้อมูลสั้นลงจะไม่มีการกำหนดเวลาไปกลับ

บนเครื่องของฉัน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 ก็ต้องการการทำบัญชีภายในเนื่องจากตรวจจับแพ็คเก็ตที่ซ้ำกัน


1
รู้สึกเหมือนเป็นข้อบกพร่องของโปรแกรมที่พวกเขาไม่สามารถแสดง RTT เมื่อคุณตั้งค่าขนาดข้อมูลให้น้อยกว่า 16 แต่คะแนนที่ดี
canadadry

@canadadry เอาล่ะการประทับเวลาในแพ็กเก็ตนั้นชัดเจน: สถานการณ์เดียวที่จำเป็นคือเมื่อแพ็กเก็ตตอบกลับมาดังนั้นจึงไม่มีประโยชน์ในการเก็บไว้ในเครื่อง แน่นอนว่าโปรแกรมดูเหมือนจะมาจากต้นฉบับ '80s BSD ดังนั้นอาจมีบางสิ่งที่เกี่ยวข้องกับเวลาเช่นกัน อย่างไรก็ตามฉันไม่แน่ใจว่าทำไมทุกคนต้องการใช้แพ็คเก็ตขนาดเล็กพิเศษเช่นนี้ โปรดทราบว่าแม้ขนาดเฟรม Ethernet ต่ำสุดนั้นก็ใหญ่พอที่จะรองรับส่วนหัว Ethernet, IP และ ICMP และการประทับเวลา 16 ไบต์ (แม้ว่าจะมี 2 ไบต์เหลือห้องพักเพื่อให้ไม่มากสำหรับการขยายเพิ่มเติมใด ๆ .)
ilkkachu

@ilkkachu ขอบคุณที่เตือนฉันเวลาที่เก็บไว้บ่อยๆ ฉันปรับปรุงคำตอบของฉัน แพ็คเก็ตเล็ก ๆ : ปัญหาเครือข่ายมากมายแตกต่างกันตามขนาดแพ็คเก็ต
jonathanjo

@ikkachu ฉันดูที่ ping แพ็กเก็ตของ Cisco: พวกเขายังมีเวลาเป็น 64 บิตนับเป็นมิลลิวินาที
jonathanjo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.