ความลับสำคัญของการเชื่อมต่อ TCP ของ Network Packet Broker: ไขความลึกลับของความจำเป็นของ Triple Handshake

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

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

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

 จับมือสามทางของ TCP

มาดูแพ็กเก็ต TCP ที่ถูกส่งในแต่ละการเชื่อมต่อโดยละเอียดยิ่งขึ้น

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

 แพ็คเก็ต SYN

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

แพ็คเก็ต SYN+ACK

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

แพ็กเก็ต ACK

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

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

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

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

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

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

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

เมื่อไคลเอนต์ส่งแพ็คเก็ตการสร้างการเชื่อมต่อ SYN หลายรายการติดต่อกัน ในสถานการณ์เช่นเครือข่ายคับคั่ง อาจเกิดสิ่งต่อไปนี้:

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

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

1- หากเป็นการเชื่อมต่อตามประวัติ (หมายเลขลำดับหมดอายุหรือหมดเวลา) แพ็กเก็ตที่ส่งโดยการจับมือครั้งที่สามจะเป็นแพ็กเก็ต RST เพื่อยกเลิกการเชื่อมต่อตามประวัติ
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 ไปยังไคลเอนต์ เพื่อระบุว่าคำขอเชื่อมต่อได้รับการยอมรับ และส่งหมายเลขลำดับเริ่มต้นของตัวเอง ในที่สุด ไคลเอนต์จะตอบกลับด้วยแฟล็ก ACK ไปยังเซิร์ฟเวอร์เพื่อระบุว่าการเชื่อมต่อได้รับการสร้างขึ้นสำเร็จ ดังนั้น ทั้งสองฝ่ายจะอยู่ในสถานะ ESTABLISHED และสามารถเริ่มส่งข้อมูลถึงกันได้

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


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