ฉันศึกษาวิชาเอกการสื่อสารครั้งแรก หลังจากสำเร็จการศึกษาเพื่อนร่วมชั้นของฉันก็แยกทางกันเพื่อไล่ตามความฝันและเดินทางระหว่างสถานที่ก่อสร้างทุกขนาด ฮ่าฮ่าแค่ล้อเล่นมีคนที่น่าทึ่งบางคนที่เข้าสู่สถาบันวิจัยบางแห่งใช่มั้ย พ่อของเขาไม่ใช่ผู้กำกับดังนั้นเขาจึงไม่ควรมืดมนเกินไป ฉันจำได้ว่ามีหลักสูตรระดับสูงมากที่เรียกว่าเครือข่ายคอมพิวเตอร์ (อาจเป็นชื่อนี้) มีแนวคิดเกี่ยวกับการจับมือกันและตอนนี้ตรวจสอบแล้ว
มาดูแผนผังก่อน:
TCP นั้นมุ่งเน้นการเชื่อมต่อ ไม่ว่าทิศทางใดที่บุคคลอื่นส่งข้อมูลจะต้องมีการเชื่อมต่อระหว่างทั้งสองฝ่าย ในโปรโตคอล TCP/IP โปรโตคอล TCP ให้บริการการเชื่อมต่อที่เชื่อถือได้และการเชื่อมต่อจะเริ่มต้นผ่านการจับมือกันสามครั้ง จุดประสงค์ของการจับมือสามทางคือการซิงโครไนซ์หมายเลขซีเรียลและหมายเลขยืนยันของทั้งสองฝ่ายและแลกเปลี่ยนข้อมูลขนาดหน้าต่าง TCP
1. การจับมือครั้งแรก: สร้างการเชื่อมต่อ ไคลเอนต์ส่งเซ็กเมนต์ข้อความคำขอเชื่อมต่อตั้งค่าตำแหน่ง SYN เป็น 1 และหมายเลขลำดับคือ x; จากนั้นไคลเอนต์จะเข้าสู่สถานะ Syn_Send และรอให้เซิร์ฟเวอร์ยืนยัน
2. การจับมือครั้งที่สอง: เซิร์ฟเวอร์ได้รับส่วนข้อความ SYN เมื่อเซิร์ฟเวอร์ได้รับส่วนข้อความ SYN จากไคลเอนต์จะต้องยืนยันเซ็กเมนต์ข้อความ SYN และตั้งค่าหมายเลขการตอบรับเป็น x+1 (หมายเลขลำดับ+1); ในเวลาเดียวกันก็จำเป็นต้องส่งข้อมูลคำขอ SYN ตั้งค่าตำแหน่ง SYN เป็น 1 และหมายเลขลำดับเป็น y; เซิร์ฟเวอร์ใส่ข้อมูลทั้งหมดข้างต้นลงในเซ็กเมนต์แพ็คเก็ต (เช่นเซ็กเมนต์ข้อความ SYN+ACK) และส่งไปยังไคลเอนต์ด้วยกัน ในเวลานี้เซิร์ฟเวอร์จะเข้าสู่สถานะ Syn_recv;
3. การจับมือครั้งที่สาม: ไคลเอนต์ได้รับส่วนแพ็กเก็ต SYN+ACK ของเซิร์ฟเวอร์ จากนั้นตั้งค่าหมายเลขการตอบรับเป็น y+1 และส่งเซ็กเมนต์ข้อความ ACK ไปยังเซิร์ฟเวอร์ หลังจากส่งส่วนข้อความทั้งไคลเอนต์และเซิร์ฟเวอร์จะป้อนสถานะที่กำหนดและเสร็จสิ้นการจับมือกันสามครั้ง TCP
หลังจากเสร็จสิ้นการจับมือกันสามครั้งไคลเอนต์และเซิร์ฟเวอร์สามารถเริ่มส่งข้อมูล ข้างต้นคือการแนะนำโดยรวมเกี่ยวกับการจับมือกันสามครั้งของ TCP
แล้วคลื่นทั้งสี่นั้นล่ะ?
หลังจากไคลเอนต์และเซิร์ฟเวอร์สร้างการเชื่อมต่อ TCP ผ่านการจับมือสามครั้งเมื่อการส่งข้อมูลเสร็จสิ้นการเชื่อมต่อ TCP จะต้องตัดการเชื่อมต่อ จากนั้นก็มี "คลื่นสี่คลื่น" ลึกลับที่นี่สำหรับการขาดการเชื่อมต่อของ TCP
1. คลื่นลูกแรก: โฮสต์ 1 (สามารถใช้เป็นไคลเอนต์หรือเป็นเซิร์ฟเวอร์) ตั้งหมายเลขลำดับและหมายเลขการตอบรับและส่งส่วนข้อความ FIN ไปยังโฮสต์ 2; ในเวลานี้โฮสต์ 1 เข้าสู่สถานะ FIN_WAIT_1; ซึ่งหมายความว่าโฮสต์ 1 ไม่มีข้อมูลที่จะส่งไปยังโฮสต์ 2;
2. คลื่นลูกที่สอง: โฮสต์ 2 ได้รับส่วนข้อความ FIN ที่ส่งโดยโฮสต์ 1 และส่งคืนเซ็กเมนต์ข้อความ ACK ไปยังโฮสต์ 1 หมายเลขการตอบรับคือหมายเลขลำดับบวก 1; โฮสต์ 1 เข้าสู่สถานะ FIN_WAIT_2; โฮสต์ 2 บอกโฮสต์ 1 ว่าฉันไม่มีข้อมูลที่จะส่งดังนั้นฉันสามารถปิดการเชื่อมต่อ;
3. คลื่นลูกที่สาม: โฮสต์ 2 ส่งส่วนข้อความครีบไปยังโฮสต์ 1 ขอให้ปิดการเชื่อมต่อและในเวลาเดียวกันโฮสต์ 2 เข้าสู่สถานะปิด _wait;
4. คลื่นลูกที่สี่: โฮสต์ 1 ได้รับส่วนข้อความ FIN ที่ส่งโดยโฮสต์ 2 ส่งเซ็กเมนต์ข้อความ ACK ไปยังโฮสต์ 2 จากนั้นโฮสต์ 1 เข้าสู่สถานะ time_wait; หลังจากโฮสต์ 2 ได้รับส่วนข้อความ ACK ของโฮสต์ 1 มันจะปิดการเชื่อมต่อ; ในเวลานี้โฮสต์ 1 ยังไม่ได้รับการตอบกลับหลังจากรอ 2MSL มันพิสูจน์ได้ว่าฝั่งเซิร์ฟเวอร์ถูกปิดตามปกติดังนั้นจึงตกลงโฮสต์ 1 ยังสามารถปิดการเชื่อมต่อได้
เมื่อมาถึงจุดนี้คลื่นสี่คลื่นของ TCP เสร็จสมบูรณ์อย่างมีความสุข เมื่อคุณเห็นสิ่งนี้คุณจะมีคำถามมากมายในใจคุณไม่เข้าใจมากมายและรู้สึกยุ่ง ไม่เป็นไรขอสรุปต่อไป
ทำไมคุณต้องจับมือสามครั้ง?
การจับมือแบบสามทางที่เรียกว่าการสร้างการเชื่อมต่อ TCP ซึ่งหมายความว่าเมื่อสร้างการเชื่อมต่อ TCP ไคลเอนต์และเซิร์ฟเวอร์จำเป็นต้องส่งทั้งหมด 3 แพ็คเก็ตเพื่อยืนยันการจัดตั้งการเชื่อมต่อ ในการเขียนโปรแกรมซ็อกเก็ตกระบวนการนี้จะถูกเรียกใช้โดยการเชื่อมต่อไคลเอนต์
เนื่องจากเราได้สรุปการจับมือกันสามครั้งของ TCP ทำไมเราต้องทำสามครั้ง? ทำไมเราถึงคิดว่าเราสามารถทำให้เสร็จได้สองครั้ง? เหตุใด TCP จึงต้องทำการเชื่อมต่อสามครั้ง? นี่คือสิ่งที่ Xie Xiren พูดใน "เครือข่ายคอมพิวเตอร์":
เพื่อป้องกันไม่ให้เซ็กเมนต์การเชื่อมต่อการเชื่อมต่อที่ล้มเหลวถูกส่งไปยังเซิร์ฟเวอร์อย่างกะทันหันจะเกิดข้อผิดพลาด
ในหนังสือมีตัวอย่างดังนี้:
การสร้าง "เซ็กเมนต์คำขอการเชื่อมต่อที่ล้มเหลว" อยู่ในกรณีดังกล่าว: ส่วนคำขอการเชื่อมต่อครั้งแรกที่ส่งโดยลูกค้าจะไม่สูญหาย
แต่จะอยู่ในโหนดเครือข่ายบางอย่างเป็นเวลานานส่งผลให้เกิดความล่าช้าจนกว่าจะถึงเวลาที่กำหนดหลังจากการเชื่อมต่อถูกปล่อยออกมาก่อนถึงเซิร์ฟเวอร์ นี่คือเดิม
นานมาแล้วที่ล้มเหลวในเซ็กเมนต์ข้อความ อย่างไรก็ตามหลังจากเซิร์ฟเวอร์ได้รับส่วนข้อความคำขอการเชื่อมต่อที่ไม่ถูกต้องนี้ก็คิดว่ามันเป็นสิ่งใหม่ที่ส่งโดยไคลเอนต์อีกครั้ง
คำขอการเชื่อมต่อ ดังนั้นส่วนการรับทราบจึงถูกส่งไปยังลูกค้าและตกลงที่จะสร้างการเชื่อมต่อ สมมติว่า "การจับมือกันสามครั้ง" ไม่ได้ถูกนำมาใช้แล้วเซิร์ฟเวอร์เท่านั้น
ออกการยืนยันและการเชื่อมต่อใหม่ได้รับการจัดตั้งขึ้น เนื่องจากไคลเอนต์ยังไม่ได้ออกคำขอเพื่อสร้างการเชื่อมต่อการยืนยันของเซิร์ฟเวอร์จะไม่ถูกละเว้น
จะไม่มีการส่งข้อมูลไปยังเซิร์ฟเวอร์ แต่เซิร์ฟเวอร์คิดว่าการเชื่อมต่อการขนส่งใหม่ได้รับการจัดตั้งขึ้นและกำลังรอให้ลูกค้าส่งข้อมูล ดังนั้น,
ทรัพยากรของเซิร์ฟเวอร์จำนวนมากสูญเปล่า ปรากฏการณ์ข้างต้นสามารถป้องกันไม่ให้เกิดขึ้นโดยใช้ "การจับมือสามครั้ง" ตัวอย่างเช่นสถานการณ์ตอนนี้
ไคลเอนต์จะไม่ออกการรับทราบถึงการรับทราบของเซิร์ฟเวอร์ เนื่องจากเซิร์ฟเวอร์ไม่สามารถรับการยืนยันได้จึงรู้ว่าไคลเอนต์ไม่จำเป็นต้องมีการเชื่อมต่อ -
สิ่งนี้ชัดเจนมากซึ่งป้องกันไม่ให้เซิร์ฟเวอร์รอและสูญเสียทรัพยากร
ทำไมคุณต้องโบกมือสี่ครั้ง?
ทำไมคุณถึงโบกมือสี่ครั้ง?
wavehand สี่ทางที่เรียกว่าคือการยุติการเชื่อมต่อ TCP ซึ่งหมายความว่าเมื่อการเชื่อมต่อ TCP ถูกตัดการเชื่อมต่อไคลเอนต์และเซิร์ฟเวอร์จำเป็นต้องส่งทั้งหมด 4 แพ็คเก็ตเพื่อยืนยันการขาดการเชื่อมต่อการเชื่อมต่อ ในการเขียนโปรแกรมซ็อกเก็ตกระบวนการนี้จะถูกเรียกใช้โดยไคลเอนต์หรือเซิร์ฟเวอร์ที่ดำเนินการอย่างใกล้ชิด
โปรโตคอล TCP เป็นโปรโตคอลการสื่อสารที่เน้นการเชื่อมต่อที่เชื่อถือได้ TCP เป็นโหมดเพล็กซ์เต็มรูปแบบซึ่งหมายความว่าเมื่อโฮสต์ 1 ส่งส่วนครีบนั่นหมายความว่าโฮสต์ 1 ไม่มีข้อมูลที่จะส่ง โฮสต์ 1 บอกโฮสต์ 2 ว่ามีการส่งข้อมูลแล้ว อย่างไรก็ตามในเวลานี้โฮสต์ 1 ยังสามารถรับข้อมูลจากโฮสต์ 2; เมื่อโฮสต์ 2 ส่งคืนเซ็กเมนต์ ACK หมายความว่ามันรู้แล้วว่าโฮสต์ 1 ไม่มีข้อมูลที่จะส่ง แต่โฮสต์ 2 ยังสามารถส่งข้อมูลไปยังโฮสต์ 1; เมื่อโฮสต์ 2 ส่งส่วนครีบก็หมายความว่าโฮสต์ 2 ไม่มีข้อมูลที่จะส่งและมันจะบอกโฮสต์ 1 ว่าฉันไม่มีข้อมูลที่จะส่งและจากนั้นกันและกันจะขัดจังหวะการเชื่อมต่อ TCP นี้อย่างมีความสุข หากคุณต้องการเข้าใจหลักการของคลื่นสี่อย่างอย่างถูกต้องคุณต้องเข้าใจการเปลี่ยนแปลงในรัฐในช่วงสี่คลื่น
FIN_WAIT_1: รัฐนี้จำเป็นต้องอธิบายอย่างระมัดระวัง ในความเป็นจริงความหมายที่แท้จริงของรัฐ FIN_WAIT_1 และ FIN_WAIT_2 นั้นทั้งคู่ต้องรอข้อความครีบของอีกฝ่าย ความแตกต่างระหว่างสองรัฐนี้คือ: สถานะ FIN_WAIT_1 เป็นจริงเมื่อซ็อกเก็ตอยู่ในสถานะที่จัดตั้งขึ้นมันต้องการปิดการเชื่อมต่ออย่างแข็งขันและส่งข้อความ FIN ไปยังอีกฝ่าย ในเวลานี้ซ็อกเก็ตเข้าสู่สถานะ FIN_WAIT_1 เมื่อบุคคลอื่นตอบกลับข้อความ ACK มันจะเข้าสู่สถานะ FIN_WAIT_2 แน่นอนภายใต้สถานการณ์ปกติที่เกิดขึ้นจริงไม่ว่าจะอยู่ในอีกฝ่ายใดข้อความ ACK ควรตอบกลับข้อความ ACK ทันที ดังนั้นสถานะ FIN_WAIT_1 โดยทั่วไปจะมองเห็นได้ยากและสถานะ FIN_WAIT_2 มักจะเห็นได้ด้วย netStat (ปาร์ตี้ที่ใช้งานอยู่)
FIN_WAIT_2: สถานะนี้ได้รับการอธิบายอย่างละเอียดข้างต้น ในความเป็นจริงซ็อกเก็ตในสถานะ FIN_WAIT_2 หมายถึงการเชื่อมต่อแบบกึ่งนั่นคือฝ่ายหนึ่งต้องมีการเชื่อมต่ออย่างใกล้ชิด แต่ยังบอกอีกฝ่ายว่าฉันมีข้อมูลบางอย่างที่จะส่งให้คุณ (ข้อมูล ACK) ในขณะนั้นและปิดการเชื่อมต่อในภายหลัง (ปาร์ตี้ที่ใช้งานอยู่)
Close_wait: ความหมายของสถานะนี้จริง ๆ แล้วรอปิด จะเข้าใจได้อย่างไร? เมื่ออีกฝ่ายปิดซ็อกเก็ตและส่งข้อความครีบถึงตัวคุณเองระบบของคุณจะตอบกลับข้อความ ACK ไปยังอีกฝ่ายอย่างไม่ต้องสงสัยแล้วมันจะเข้าสู่สถานะ close_wait ถัดไปสิ่งที่คุณต้องพิจารณาจริงๆคือการตรวจสอบว่าคุณยังมีข้อมูลที่จะส่งไปยังอีกฝ่ายหรือไม่ ถ้าไม่เช่นนั้นคุณสามารถปิดซ็อกเก็ตและส่งข้อความครีบไปยังอีกฝ่ายนั่นคือปิดการเชื่อมต่อ ดังนั้นเมื่อคุณอยู่ในสถานะ close_wait สิ่งที่คุณต้องทำคือรอให้คุณปิดการเชื่อมต่อ (ด้านแฝง)
Last_ack: สถานะนี้ค่อนข้างเข้าใจง่าย มันปิดข้อความ ACK ของอีกฝ่ายหลังจากส่งข้อความ FIN หลังจากได้รับข้อความ ACK คุณสามารถป้อนสถานะที่มีอยู่ของปิด (ด้านแฝง)
TIME_WAIT: หมายความว่าได้รับข้อความครีบของอีกฝ่ายแล้วและส่งข้อความ ACK แล้ว เพียงแค่รอให้ 2MSL กลับสู่สถานะปิดที่มีอยู่ หากอยู่ในสถานะ Finwait1 เมื่อได้รับข้อความกับอีกฝ่ายที่มีทั้ง FIN Flag และ ACK Flag คุณสามารถป้อนสถานะ TIME_WAIT โดยตรงโดยไม่ต้องผ่านสถานะ FIN_WAIT_2 (ปาร์ตี้ที่ใช้งานอยู่)
ปิด: ระบุว่าการเชื่อมต่อถูกขัดจังหวะ
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับหลักการและการวิเคราะห์กระบวนการของการจับมือสามครั้งและการจับมือกันสี่ครั้งในโปรโตคอล TCP/IP ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความและหวังว่าจะได้รับความคิดเห็นที่มีค่าของคุณ