ความลึกลับที่สำคัญของการเชื่อมต่อโบรกเกอร์ของแพ็คเก็ตเครือข่าย: demystified ความจำเป็นในการจับมือกันสามครั้ง

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

บทความนี้จะหารือเกี่ยวกับหลักการกระบวนการและความสำคัญของการจับมือสามทางในรายละเอียด ทีละขั้นตอนเราจะอธิบายว่าทำไมต้องใช้การจับมือกันสามทางวิธีการสร้างความมั่นใจในความมั่นคงและความน่าเชื่อถือในการเชื่อมต่อและความสำคัญของการถ่ายโอนข้อมูล ด้วยความเข้าใจที่ลึกซึ้งยิ่งขึ้นเกี่ยวกับการจับมือกันสามทางเราจะได้รับความเข้าใจที่ดีขึ้นเกี่ยวกับกลไกพื้นฐานของการสื่อสารเครือข่ายและมุมมองที่ชัดเจนยิ่งขึ้นเกี่ยวกับความน่าเชื่อถือของการเชื่อมต่อ TCP

กระบวนการจับมือกันสามทาง TCP และการเปลี่ยนสถานะของรัฐ
TCP เป็นโปรโตคอลการขนส่งที่มุ่งเน้นการเชื่อมต่อซึ่งต้องมีการสร้างการเชื่อมต่อก่อนการส่งข้อมูล กระบวนการจัดตั้งการเชื่อมต่อนี้ทำโดยการจับมือกันสามทาง

 การจับมือกันสามทาง TCP

ลองมาดูแพ็คเก็ต TCP ที่ส่งในการเชื่อมต่อแต่ละครั้ง

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

 Syn Packet

เมื่อไคลเอนต์เริ่มต้นการเชื่อมต่อจะสร้างหมายเลขลำดับเริ่มต้นแบบสุ่ม (client_isn) และวางไว้ในฟิลด์ "ลำดับลำดับ" ของส่วนหัว TCP ในเวลาเดียวกันไคลเอนต์ตั้งค่าตำแหน่ง SYN FLAG เป็น 1 เพื่อระบุว่าแพ็กเก็ตขาออกเป็นแพ็กเก็ต SYN ไคลเอนต์ระบุว่าต้องการสร้างการเชื่อมต่อกับเซิร์ฟเวอร์โดยส่งแพ็คเก็ต SYN แรกไปยังเซิร์ฟเวอร์ แพ็คเก็ตนี้ไม่มีข้อมูลเลเยอร์แอปพลิเคชัน (นั่นคือส่งข้อมูล) ณ จุดนี้สถานะของลูกค้าจะถูกทำเครื่องหมายว่าเป็นซิน

แพ็คเก็ต SYN+ACK

เมื่อเซิร์ฟเวอร์ได้รับแพ็คเก็ต SYN จากไคลเอนต์มันจะเริ่มต้นการเริ่มต้นหมายเลขซีเรียลของตัวเอง (Server_ISN) จากนั้นจะใส่หมายเลขนั้นไว้ในฟิลด์ "หมายเลขซีเรียล" ของส่วนหัว TCP ถัดไปเซิร์ฟเวอร์จะป้อน client_isn + 1 ในฟิลด์ "การตอบรับหมายเลข" และตั้งค่าทั้ง SYN และ ACK บิตเป็น 1 ในที่สุดเซิร์ฟเวอร์จะส่งแพ็คเก็ตไปยังไคลเอนต์ซึ่งไม่มีข้อมูลแอปพลิเคชันชั้น (และไม่มีข้อมูลสำหรับเซิร์ฟเวอร์ที่จะส่ง) ในเวลานี้เซิร์ฟเวอร์อยู่ในสถานะ Syn-RCVD

แพ็คเก็ต ACK

เมื่อไคลเอนต์ได้รับแพ็คเก็ตจากเซิร์ฟเวอร์จะต้องทำการปรับให้เหมาะสมต่อไปนี้เพื่อตอบสนองต่อแพ็คเก็ตตอบกลับสุดท้าย: อันดับแรกไคลเอนต์จะตั้งค่าบิต ACK ของส่วนหัว TCP ของแพ็คเก็ตตอบกลับเป็น 1; ประการที่สองไคลเอนต์จะป้อนค่า Server_isn + 1 ในฟิลด์ "ยืนยันหมายเลขคำตอบ"; ในที่สุดไคลเอนต์จะส่งแพ็กเก็ตไปยังเซิร์ฟเวอร์ แพ็คเก็ตนี้สามารถนำข้อมูลจากไคลเอนต์ไปยังเซิร์ฟเวอร์ เมื่อเสร็จสิ้นการดำเนินงานเหล่านี้ลูกค้าจะเข้าสู่สถานะที่จัดตั้งขึ้น

เมื่อเซิร์ฟเวอร์ได้รับแพ็คเก็ตตอบกลับจากไคลเอนต์แล้วจะเปลี่ยนเป็นสถานะที่กำหนดไว้

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

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

การจับมือกันสามทางสามารถหลีกเลี่ยงการเริ่มต้นการเชื่อมต่อซ้ำ ๆ ในอดีตได้อย่างมีประสิทธิภาพ (เหตุผลหลัก)
การจับมือสามทางรับประกันว่าทั้งสองฝ่ายได้รับหมายเลขลำดับเริ่มต้นที่เชื่อถือได้
การจับมือกันสามทางหลีกเลี่ยงการสูญเสียทรัพยากร

เหตุผลที่ 1: หลีกเลี่ยงการเข้าร่วมที่ซ้ำกันทางประวัติศาสตร์
โดยสรุปเหตุผลหลักสำหรับการจับมือสามทางคือการหลีกเลี่ยงความสับสนที่เกิดจากการเริ่มต้นการเชื่อมต่อที่ซ้ำกันเก่า ในสภาพแวดล้อมเครือข่ายที่ซับซ้อนการส่งแพ็คเก็ตข้อมูลไม่ได้ถูกส่งไปยังโฮสต์ปลายทางเสมอไปตามเวลาที่กำหนดและแพ็คเก็ตข้อมูลเก่าอาจมาถึงโฮสต์ปลายทางก่อนเนื่องจากความแออัดของเครือข่ายและเหตุผลอื่น ๆ เพื่อหลีกเลี่ยงสิ่งนี้ TCP ใช้การจับมือสามทางเพื่อสร้างการเชื่อมต่อ

การจับมือกันสามทางหลีกเลี่ยงการเชื่อมต่อที่ซ้ำกันทางประวัติศาสตร์

เมื่อไคลเอน

1- แพ็คเก็ต SYN เก่ามาถึงเซิร์ฟเวอร์ก่อนแพ็คเก็ต SYN ล่าสุด
2- เซิร์ฟเวอร์จะตอบแพ็คเก็ต SYN + ACK ไปยังไคลเอนต์หลังจากได้รับแพ็คเก็ต SYN เก่า
3- เมื่อไคลเอนต์ได้รับแพ็คเก็ต SYN + ACK จะกำหนดว่าการเชื่อมต่อคือการเชื่อมต่อในอดีต (หมายเลขลำดับหมดอายุหรือหมดเวลา) ตามบริบทของตัวเองจากนั้นส่งแพ็คเก็ต RST ไปยังเซิร์ฟเวอร์เพื่อยกเลิกการเชื่อมต่อ

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

1- หากเป็นการเชื่อมต่อในอดีต (หมายเลขลำดับหมดอายุหรือหมดเวลา) แพ็คเก็ตที่ส่งโดยการจับมือที่สามเป็นแพ็คเก็ตแรกที่ยกเลิกการเชื่อมต่อในอดีต
2- หากไม่ใช่การเชื่อมต่อในอดีตแพ็คเก็ตที่ส่งเป็นครั้งที่สามคือแพ็คเก็ต ACK และทั้งสองฝ่ายสื่อสารประสบความสำเร็จในการสร้างการเชื่อมต่อ

ดังนั้นเหตุผลหลักที่ TCP ใช้การจับมือสามทางคือมันเริ่มต้นการเชื่อมต่อเพื่อป้องกันการเชื่อมต่อในอดีต

เหตุผลที่ 2: เพื่อซิงโครไนซ์หมายเลขลำดับเริ่มต้นของทั้งสองฝ่าย
ทั้งสองด้านของโปรโตคอล TCP จะต้องรักษาหมายเลขลำดับซึ่งเป็นปัจจัยสำคัญในการส่งสัญญาณที่เชื่อถือได้ หมายเลขลำดับมีบทบาทสำคัญในการเชื่อมต่อ TCP พวกเขาทำสิ่งต่อไปนี้:

ตัวรับสัญญาณสามารถกำจัดข้อมูลที่ซ้ำกันและตรวจสอบความถูกต้องของข้อมูล

ตัวรับสัญญาณสามารถรับแพ็กเก็ตตามลำดับของหมายเลขลำดับเพื่อให้แน่ใจว่ามีความสมบูรณ์ของข้อมูล

●หมายเลขลำดับสามารถระบุแพ็คเก็ตข้อมูลที่บุคคลอื่นได้รับทำให้สามารถส่งข้อมูลที่เชื่อถือได้

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

ซิงโครไนซ์หมายเลขซีเรียลเริ่มต้นของทั้งสองฝ่าย

แม้ว่าการจับมือกันสี่ทางยังเป็นไปได้ที่จะซิงโครไนซ์หมายเลขลำดับเริ่มต้นของทั้งสองฝ่ายอย่างน่าเชื่อถือ แต่ขั้นตอนที่สองและสามสามารถรวมกันเป็นขั้นตอนเดียวทำให้เกิดการจับมือกันสามทาง อย่างไรก็ตามการจับมือสองครั้งสามารถรับประกันได้ว่าหมายเลขลำดับเริ่มต้นของฝ่ายหนึ่งจะได้รับความสำเร็จจากอีกฝ่าย แต่ไม่มีการรับประกันว่าจำนวนลำดับเริ่มต้นของทั้งสองฝ่ายสามารถยืนยันได้ ดังนั้นการจับมือกันสามทางจึงเป็นทางเลือกที่ดีที่สุดในการใช้เพื่อให้แน่ใจว่ามีความเสถียรและความน่าเชื่อถือของการเชื่อมต่อ TCP

เหตุผลที่ 3: หลีกเลี่ยงการสูญเสียทรัพยากร
หากมีเพียง "สองมือ" เมื่อคำขอ SYN ของไคลเอ็นต์ถูกบล็อกในเครือข่ายลูกค้าจะไม่สามารถรับแพ็กเก็ต ACK ที่ส่งโดยเซิร์ฟเวอร์ดังนั้น SYN จะไม่พอใจ อย่างไรก็ตามเนื่องจากไม่มีการจับมือกันครั้งที่สามเซิร์ฟเวอร์จึงไม่สามารถระบุได้ว่าไคลเอนต์ได้รับการตอบรับ ACK เพื่อสร้างการเชื่อมต่อหรือไม่ ดังนั้นเซิร์ฟเวอร์สามารถสร้างการเชื่อมต่อเชิงรุกหลังจากได้รับคำขอ SYN แต่ละครั้งเท่านั้น สิ่งนี้นำไปสู่สิ่งต่อไปนี้:

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

การเก็บรักษาข้อความ: เนื่องจากขาดการจับมือครั้งที่สามเซิร์ฟเวอร์จึงไม่มีทางรู้ว่าไคลเอนต์ได้รับการตอบรับ ACK อย่างถูกต้องเพื่อสร้างการเชื่อมต่อหรือไม่ ดังนั้นหากข้อความติดอยู่ในเครือข่ายไคลเอนต์จะส่งคำขอ SYN ซ้ำแล้วซ้ำอีกทำให้เซิร์ฟเวอร์สร้างการเชื่อมต่อใหม่อย่างต่อเนื่อง สิ่งนี้จะเพิ่มความแออัดของเครือข่ายและความล่าช้าและส่งผลเสียต่อประสิทธิภาพของเครือข่ายโดยรวม

หลีกเลี่ยงการสูญเสียทรัพยากร

ดังนั้นเพื่อให้แน่ใจว่าเสถียรภาพและความน่าเชื่อถือของการเชื่อมต่อเครือข่าย TCP ใช้การจับมือสามทางเพื่อสร้างการเชื่อมต่อเพื่อหลีกเลี่ยงการเกิดปัญหาเหล่านี้

สรุป
ที่นายหน้าแพ็คเก็ตเครือข่ายการจัดตั้งการเชื่อมต่อ TCP ทำด้วยการจับมือกันสามทาง ในระหว่างการจับมือกันสามทางไคลเอนต์จะส่งแพ็คเก็ตพร้อมธง SYN ไปยังเซิร์ฟเวอร์ก่อนซึ่งระบุว่าต้องการสร้างการเชื่อมต่อ หลังจากได้รับคำขอจากไคลเอนต์เซิร์ฟเวอร์จะตอบแพ็กเก็ตที่มี SYN และ ACK Flag ไปยังไคลเอนต์ซึ่งระบุว่าคำขอการเชื่อมต่อได้รับการยอมรับและส่งหมายเลขลำดับเริ่มต้นของตัวเอง ในที่สุดไคลเอนต์จะตอบกลับด้วยธง ACK ไปยังเซิร์ฟเวอร์เพื่อระบุว่าการเชื่อมต่อได้รับการจัดตั้งขึ้นสำเร็จ ดังนั้นทั้งสองฝ่ายอยู่ในสถานะที่จัดตั้งขึ้นและสามารถเริ่มส่งข้อมูลซึ่งกันและกัน

โดยทั่วไปกระบวนการจับมือสามทางสำหรับการสร้างการเชื่อมต่อ TCP ได้รับการออกแบบมาเพื่อให้แน่ใจว่าการเชื่อมต่อเสถียรภาพและความน่าเชื่อถือหลีกเลี่ยงความสับสนและการสูญเสียทรัพยากรผ่านการเชื่อมต่อในอดีตและให้แน่ใจว่าทั้งสองฝ่ายสามารถรับและส่งข้อมูลได้


เวลาโพสต์: ม.ค. -08-2025