หมายเลขลำดับของส่วนหัวของแพ็กเก็ต TCP ห่อหุ้มหรือไม่


16

ฉันสงสัยว่าเนื่องจากหมายเลขลำดับในฟิลด์ส่วนหัว TCP ถูกเลือกแบบสุ่มระหว่างการจับมือกันและจะเพิ่มขึ้นทีละน้อยเมื่อแพ็กเก็ตมีการแลกเปลี่ยนกันจะเกิดอะไรขึ้นหลังจาก 2 ^ 32 - การส่ง initial_seq_no? หมายเลขลำดับล้อมรอบและกลายเป็น 0 หรือเป็นค่าเริ่มต้นที่นำกลับมาใช้ใหม่ (หรือเป็นการเชื่อมต่อใหม่ที่เริ่มต้นจากที่ก่อนหน้านี้หยุด)

คำตอบ:


19

มันล้อมรอบไปที่ 0 ตาม RFC 793 :

มันเป็นสิ่งสำคัญที่ต้องจำไว้ว่าพื้นที่หมายเลขลำดับที่แท้จริงนั้นมี จำกัด แม้ว่าจะมีขนาดใหญ่มาก ช่องว่างนี้มีช่วงตั้งแต่ 0 ถึง 2 ** 32 - 1 เนื่องจากพื้นที่มี จำกัด การคำนวณทางคณิตศาสตร์ทั้งหมดที่มีหมายเลขลำดับจะต้องดำเนินการโมดูโล 2 ** 32 เลขคณิตที่ไม่ได้ลงชื่อนี้จะรักษาความสัมพันธ์ของหมายเลขลำดับขณะที่พวกเขาวนจาก 2 ** 32 - 1 เป็น 0 อีกครั้ง มีรายละเอียดปลีกย่อยบางอย่างเกี่ยวกับคอมพิวเตอร์โมดูโลคณิตศาสตร์ดังนั้นควรใช้ความระมัดระวังอย่างยิ่งในการเขียนโปรแกรมการเปรียบเทียบค่าดังกล่าว สัญลักษณ์ "= <" หมายถึง "น้อยกว่าหรือเท่ากับ" (modulo 2 ** 32)


3
ทุกจำนวนน้อยกว่าหรือเท่ากับจำนวนอื่นโมดูโล 2 ** 32 ...
253751

2
@ user20574 นั่นเป็นสาเหตุที่ขนาดของหน้าต่าง TCP ไม่ได้รับอนุญาตให้ขยายใหญ่กว่า 1GB และการเปรียบเทียบหมายเลขลำดับต้องใช้วิธีที่สั้นที่สุด (เช่นความแตกต่างต้องอยู่ในช่วง -2 ^ 31 ถึง 2 ^ 31)
kasperd

17

หมายเลขลำดับล้อมรอบและกลายเป็น 0 หรือไม่?

ใช่. รายละเอียดทั้งหมดที่สามารถพบได้ใน TCP ข้อมูลจำเพาะRFC 793 - เกียร์ Control Protocol


หมายเลขลำดับ

มันเป็นสิ่งสำคัญที่ต้องจำไว้ว่าพื้นที่หมายเลขลำดับจริงนั้น จำกัด แม้ว่าจะมีขนาดใหญ่มาก พื้นที่นี้มีตั้งแต่ 0 ถึง 2 32 - 1

เนื่องจากพื้นที่มี จำกัด ทุกการซื้อขายทางคณิตศาสตร์ที่มีหมายเลขลำดับจะต้องดำเนินการแบบโมดูโล 2 32 เลขคณิตที่ไม่ได้ลงชื่อนี้จะรักษาความสัมพันธ์ของหมายเลขลำดับขณะที่มันวนจาก 2 32 - 1 เป็น 0 อีกครั้ง

มีรายละเอียดปลีกย่อยบางอย่างเกี่ยวกับคอมพิวเตอร์โมดูโลคณิตศาสตร์ดังนั้นควรใช้ความระมัดระวังอย่างยิ่งในการเขียนโปรแกรมการเปรียบเทียบค่าดังกล่าว สัญลักษณ์ "= <" หมายถึง "น้อยกว่าหรือเท่ากับ" (modulo 2 32 )

แหล่งRFC 793 - โปรโตคอลควบคุมการส่งสัญญาณ


1
ฉันไม่ได้ตั้งใจจะยิงผู้ส่งสาร แต่ "น้อยกว่าหรือเท่ากับ (modulo N)"? เห็นได้ชัดว่าผู้เขียน RFC พลาดใน "รายละเอียดปลีกย่อยของโมดูลคอมพิวเตอร์"
Ben Voigt

ในกรณีที่หน้าต่างสูงสุดจะน้อยกว่า 2 ^ 31 และถ้าxและyมีพิมพ์uint32_tมันเป็นทางปฏิบัติที่จะกำหนดหมายถึงx<=y (uint32_t)(y-x) < 0x80000000
supercat

@ BenVoigt หมอน่าจะรับสิ่งที่อธิบายไว้ใน RFC tools.ietf.org/html/rfc1982
Carsten S

@ Carsten ที่เป็นเลขคณิตที่เป็นประโยชน์ แต่ไม่ใช่ "เลขคณิตแบบโมดูโล N"
Ben Voigt

1
@ BenVoigt ใช่อะไร Btw ฉันทราบดีว่ากลุ่ม Z / (n) ไม่ได้รับคำสั่ง แต่ฉันก็สามารถตีความข้อความในบริบทได้
Carsten S

7

ใช่มันพันไปรอบ ๆ คุณสามารถอ่านได้บน WikipediaหรือRFC1323ซึ่งแสดงวิธีการป้องกันหมายเลขลำดับที่ล้อมรอบ

ให้ฉันพูด:

TCP timestamps ใช้ในอัลกอริทึมที่รู้จักกันในชื่อการป้องกันหมายเลขลำดับที่ถูกห่อหรือ PAWS (ดูรายละเอียด RFC 1323) PAWS จะใช้เมื่อหน้าต่างรับข้ามขอบเขตของขอบเขตการขึ้นบรรทัดใหม่ ในกรณีที่แพ็คเก็ตอาจถูกส่งซ้ำมันตอบคำถาม: "นี่คือหมายเลขลำดับใน 4 GB แรกหรือที่สอง?" และการประทับเวลาจะใช้ในการทำลายเน็คไท

และ:

PAWS ใช้ตัวเลือก TCP Timestamps เช่นเดียวกับกลไก RTTM ที่อธิบายไว้ก่อนหน้านี้และถือว่าทุกส่วน TCP ที่ได้รับ (รวมถึงข้อมูลและส่วน ACK) ได้รับการประทับเวลา SEG.TSval ที่มีค่าเป็นเสียงเดียวไม่ลดลงในเวลา แนวคิดพื้นฐานคือเซ็กเมนต์สามารถถูกละทิ้งเป็นสำเนาที่ซ้ำกันได้หากได้รับด้วยการประทับเวลา SEG.TS น้อยกว่าการประทับเวลาบางส่วนที่ได้รับเมื่อเร็ว ๆ นี้จากการเชื่อมต่อนี้

ทั้งในกลไก PAWS และ RTTM "timestamps" เป็นจำนวนเต็ม 32 บิตที่ไม่ได้ลงชื่อในพื้นที่ 32 บิตแบบแยกส่วน ดังนั้น "น้อยกว่า" ถูกกำหนดเช่นเดียวกับหมายเลขลำดับ TCP และใช้เทคนิคการใช้งานแบบเดียวกัน หาก s และ t เป็นค่าการประทับเวลา s <t ถ้า 0 <(t - s) <2 ** 31 คำนวณในรูปแบบเลขคณิตแบบ 32 บิตที่ไม่ได้ลงนาม

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