สับสนกับการจัดลำดับแพ็กเก็ตใหม่

Aug 15 2020

ฉันกำลังอ่านหนังสือเรียนที่กล่าวเกี่ยวกับโปรโตคอล TCP "Selective Repeat":

เราสันนิษฐานว่าไม่สามารถจัดเรียงแพ็คเก็ตใหม่ภายในช่องทางระหว่างผู้ส่งและผู้รับ โดยทั่วไปเป็นข้อสันนิษฐานที่สมเหตุสมผลเมื่อผู้ส่งและผู้รับเชื่อมต่อกันด้วยสายไฟเส้นเดียว อย่างไรก็ตามเมื่อ“ ช่องสัญญาณ” ที่เชื่อมต่อทั้งสองเป็นเครือข่ายอาจเกิดการเรียงลำดับแพ็กเก็ตใหม่ได้ แนวทางที่ใช้ในทางปฏิบัติคือเพื่อให้แน่ใจว่าจะไม่มีการใช้หมายเลขลำดับซ้ำจนกว่าผู้ส่งจะ“ แน่ใจ” ว่าแพ็กเก็ตที่ส่งก่อนหน้านี้ที่มีหมายเลขลำดับ x ไม่อยู่ในเครือข่าย สิ่งนี้ทำได้โดยสมมติว่าแพ็กเก็ตไม่สามารถ "อยู่" ในเครือข่ายได้นานกว่าระยะเวลาสูงสุดที่กำหนดไว้

ฉันสับสนและด้านล่างนี้เป็นคำถามสองข้อของฉัน

Q1- อะไรคือสิ่งที่ "ช่องสามารถคิดได้ว่าเป็นบัฟเฟอร์แพ็กเก็ตเป็นหลักและปล่อยแพ็กเก็ตเหล่านี้ออกมาตามธรรมชาติเมื่อใดก็ได้ในอนาคต" หมายความว่า? ทำไมเราต้องบัฟเฟอร์แพ็คเก็ตเก่า? ไม่ดีกว่าเหรอที่คนรับก็เฉย

Q2- สมมติว่าขนาดหน้าต่างคือ 2 และหมายเลขลำดับที่ใช้ได้คือ 0,1,2,3 อันดับแรกผู้ส่งจะส่งแพ็กเก็ต 0, แพ็กเก็ต 1 ในขณะที่แพ็กเก็ต 0 ถูกขีดฆ่าและใช้เวลานานมากดังนั้นการหมดเวลาจึงเกิดขึ้นผู้ส่งต้องส่งแพ็กเก็ต 0 อีกครั้ง แต่คราวนี้แพ็กเก็ต 0 (ใหม่) มาถึงตรงเวลา จากนั้นผู้ส่งจะส่งแพ็กเก็ต 2 แพ็กเก็ต 3 ทั้งหมดที่ผู้รับได้รับ จากนั้นผู้ส่งกำลังจะส่งแพ็กเก็ต 0 (ใหม่) และแพ็กเก็ต 1 (ใหม่) แต่แพ็กเก็ต 0 เก่ามาถึงผู้รับแล้วดังนั้นผู้รับจึงไม่สามารถทราบได้ว่าแพ็กเก็ตนี้เป็นแพ็กเก็ตเก่าหรือแพ็กเก็ตใหม่ ดังนั้นการ "สมมติว่าแพ็กเก็ตไม่สามารถ" อยู่ "ในเครือข่ายได้นานกว่าระยะเวลาสูงสุดที่กำหนดไว้บางส่วนจะสามารถแก้ไขปัญหานี้ได้อย่างไร หมายความว่าส่วนหัวของแพ็กเก็ตมีเวลาที่ส่งหรือไม่

คำตอบ

2 Zac67 Aug 16 2020 at 07:31

อะไรคือสิ่งที่ "ช่องสามารถคิดได้ว่าเป็นบัฟเฟอร์แพ็กเก็ตเป็นหลักและปล่อยแพ็กเก็ตเหล่านี้ออกมาตามธรรมชาติเมื่อใดก็ได้ในอนาคต" หมายความว่า? ทำไมเราต้องบัฟเฟอร์แพ็คเก็ตเก่า? ไม่ดีกว่าที่ผู้รับจะเพิกเฉย?

นั่นคือลักษณะของการจัดคิวและการบัฟเฟอร์ซึ่งเป็นส่วนสำคัญของการสลับแพ็กเก็ต - แพ็กเก็ตที่ได้รับจะถูกจัดคิว / บัฟเฟอร์เมื่อเข้าและลบออกจากคิวเมื่อส่งต่อแล้ว การบัฟเฟอร์เป็นสิ่งที่จำเป็นไม่เช่นนั้นลิงก์ขาออกจะต้องเป็นอิสระเสมอเมื่อใดก็ตามที่ได้รับแพ็กเก็ตซึ่งเป็นไปไม่ได้สำหรับเครือข่ายที่เปลี่ยนแพ็กเก็ตเฉพาะสำหรับเครือข่ายที่สลับวงจรเท่านั้น

สมมติว่าขนาดหน้าต่างคือ 2 และหมายเลขลำดับที่พร้อมใช้งานคือ 0,1,2,3

หน้าต่างไม่นับแพ็คเก็ต / ดาต้าแกรม แต่ไบต์ นอกจากนี้หมายเลขลำดับจะทำซ้ำเมื่อฟิลด์ 32 บิตล้นซึ่งเกิดขึ้นหลังจากข้อมูล 4 GiB เท่านั้น อย่างไรก็ตามขีด จำกัด ดังกล่าวหมายความว่าต้องมีข้อมูล "ในเที่ยวบิน" ไม่เกิน 4 กิบเพื่อหลีกเลี่ยงความคลุมเครือ เนื่องจากหน้าต่างที่ใหญ่ที่สุดที่เป็นไปได้คือ (ใกล้กับ) 1 GiB จึงไม่เป็นปัญหา

โปรดทราบว่าด้วย ACK แบบสะสมที่เรียบง่ายผู้รับจะไม่สามารถเลือกกลุ่ม ACK ในภายหลังได้เมื่อส่วนก่อนหน้ายังขาดหายไป ACK หมายความว่าได้รับข้อมูลก่อนหน้านี้ทั้งหมดแล้ว

ตัวอย่างเช่นด้วยขนาดเซ็กเมนต์ 1,000 และขนาดหน้าต่าง 10,000 ผู้ส่งจะส่งดาตาแกรม D00-D09 (ลำดับ 0-9,999) ได้รับ D00 และ D02-D09 แต่ D01 สูญหาย เครื่องรับยังคง ACKs 1,000 (ลำดับข้อมูลที่คาดไว้ถัดไป) ซึ่งทริกเกอร์ให้ผู้ส่งย้าย D0 ออกจากหน้าต่างเลื่อนไปที่ 1,000-10,999 และส่ง D10

ในขณะเดียวกันผู้รับได้ตัดสินใจว่ามีปัญหาดังนั้น ACKs 1,000 อีกครั้งเพื่อส่งสัญญาณเช่นนั้น ผู้ส่งได้รับ ACK สองครั้งและส่ง D01 อีกครั้ง (โหมดไม่เต็มใจ) หรือข้อมูลทั้งหมดโดยเริ่มจาก D01 (โหมดก้าวร้าว) ผู้รับมี D10 แล้ว (10,000-10,999) ดังนั้นจึงมี ACK 11,000 ซึ่งจะย้ายหน้าต่างของผู้ส่งไปที่ 11,000-20,999 (และยกเลิกการส่งข้อมูลซ้ำที่ยังคงค้างอยู่สำหรับโหมดก้าวร้าว)

(ฉันค่อนข้างทำให้กระบวนการง่ายขึ้นในความเป็นจริงมีการทับซ้อนกันมากขึ้นและความล่าช้าระหว่างการส่งและรับแน่นอน)

แก้ไข: ดังที่เจฟฟ์ได้ชี้ให้เห็นอย่างถูกต้อง (ขอบคุณ!) การสนับสนุนสำหรับการตอบรับที่เลือก (SACK) นั้นเกือบจะได้รับในวันนี้ เมื่อใช้ตัวเลือกดังกล่าวเครื่องรับยังสามารถ SACK 2,000-9,999 (จาก D02-D09) ได้ทันทีดังนั้นผู้ส่งจะไม่เริ่มส่งซ้ำ นอกจากนี้ยังสามารถเริ่มส่งข้อมูล 11,000-20,999 ก่อนหน้านี้