TCP จับมือ 3 ทาง (SYN, SYN-ACK, ACK)

⚡ สรุปอย่างชาญฉลาด

การจับมือสามทางของ TCP (TCP 3-Way Handshake) คือขั้นตอนการตั้งค่าการเชื่อมต่อที่ทุกเซสชัน TCP เริ่มต้นด้วย ไคลเอนต์และเซิร์ฟเวอร์จะแลกเปลี่ยนแพ็กเก็ต SYN, SYN-ACK และ ACK เพื่อซิงโครไนซ์หมายเลขลำดับและยืนยันว่าทั้งสองฝ่ายพร้อมก่อนที่จะส่งข้อมูลแอปพลิเคชันแม้แต่ไบต์เดียว

  • 📨 ทำความเข้าใจประเภทข้อความทั้งสี่ประเภท: SYN เป็นการเริ่มต้นการเชื่อมต่อ, ACK เป็นการยืนยัน, SYN-ACK เป็นการรวมทั้งสองอย่างเข้าด้วยกัน และ FIN เป็นการยุติการเชื่อมต่อ TCP
  • 🔁 ทำตามสามขั้นตอนต่อไปนี้: ไคลเอนต์ SYN → เซิร์ฟเวอร์ SYN-ACK → ไคลเอนต์ ACK; การเชื่อมต่อจะเกิดขึ้นได้ก็ต่อเมื่อได้รับแพ็กเก็ตที่สามแล้วเท่านั้น
  • 🔢 หมายเลขลำดับมีความสำคัญ: แต่ละฝ่ายจะเลือกหมายเลขลำดับเริ่มต้น อีกฝ่ายจะตอบรับโดยการเพิ่มหมายเลขขึ้นหนึ่ง ซึ่งจะทำให้ลำดับของกระแสไบต์ยังคงเป็นระเบียบ
  • 🚪 แผนการรื้อถอน: หลังจากถ่ายโอนข้อมูลเสร็จสิ้น TCP จะปิดการเชื่อมต่อด้วยคู่ FIN/ACK เพื่อปล่อยซ็อกเก็ตที่ปลายทั้งสองด้าน
  • 🤖 ใช้ AI ในการวิเคราะห์แพ็กเก็ต: ผู้ช่วย AI อธิบาย Wireshark จับภาพ ทำเครื่องหมาย ACK ที่หายไป และเน้น SYN floods หรือการเชื่อมต่อแบบครึ่งเปิด

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

TCP Three-Way Handshake คืออะไร?

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

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

ประเภทข้อความ TCP

ธงควบคุมทั้งสี่จะปรากฏขึ้นซ้ำๆ ในระหว่างการเชื่อมต่อและการยกเลิกการเชื่อมต่อ

ระบุความประสงค์หรือข้อมูลเพิ่มเติม Descriptไอออน
SYN เริ่มต้นการเชื่อมต่อและซิงโครไนซ์หมายเลขลำดับระหว่างอุปกรณ์ต่างๆ
ACK ยืนยันกับอีกฝ่ายว่าได้รับส่วนข้อมูลก่อนหน้าแล้ว
ซิน-อัค ข้อความรวม — ข้อความ SYN จากอุปกรณ์ในพื้นที่บวกกับข้อความ ACK ที่ส่งมาจากอุปกรณ์ปลายทางก่อนหน้านี้
ครีบ ใช้เพื่อยุติการเชื่อมต่ออย่างนุ่มนวล

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

การรับส่งข้อมูล TCP เริ่มต้นด้วยการจับมือสามขั้นตอนเสมอ โดยไคลเอ็นต์จะเป็นฝ่ายเริ่มต้นการสนทนาด้วยการร้องขอเซสชันจากเซิร์ฟเวอร์

แผนภาพการจับมือสามทางของ TCP

แผนภาพการจับมือสามทาง

  • ขั้นตอนที่ 1 — SYN: ไคลเอนต์ส่งเซ็กเมนต์ที่มีแฟล็ก SYN ตั้งค่าไว้ ซึ่งเป็นการบอกเซิร์ฟเวอร์ว่า “ฉันต้องการเริ่มการสื่อสาร” และเสนอหมายเลขลำดับเริ่มต้น
  • ขั้นตอนที่ 2 — การตอบรับ (SYN-ACK): เซิร์ฟเวอร์จะตอบกลับด้วยเซ็กเมนต์ที่มีการตั้งค่าแฟล็ก SYN และ ACK ไว้ทั้งคู่ ACK เป็นการยืนยันการรับ SYN จากไคลเอ็นต์ และ SYN เป็นการเสนอหมายเลขลำดับเริ่มต้นของเซิร์ฟเวอร์เอง
  • ขั้นตอนที่ 3 — ยืนยัน: ไคลเอนต์ตอบรับ SYN-ACK จากเซิร์ฟเวอร์ด้วย ACK สุดท้าย การเชื่อมต่อจึงถูกสร้างขึ้นแล้ว และทั้งสองฝ่ายสามารถเริ่มต้นได้ transmitข้อมูลแอปพลิเคชัน ting

ตัวอย่างในโลกแห่งความเป็นจริง

ตัวอย่างการใช้งานจริงของการจับมือสามทางแบบ TCP

ต่อไปนี้เป็นตัวอย่างการใช้งานพร้อมหมายเลขลำดับที่ชัดเจน

  • โฮสต์ X เริ่มการเชื่อมต่อโดยการส่งแพ็กเก็ต TCP SYN ไปยังเซิร์ฟเวอร์ แพ็กเก็ตนี้บรรจุหมายเลขลำดับเริ่มต้นแบบสุ่ม — ตัวอย่างเช่น 4321 — ซึ่งเป็นจุดเริ่มต้นของกระแสข้อมูลไบต์ที่โฮสต์ X จะส่ง
  • เซิร์ฟเวอร์ได้รับ SYN และตอบกลับด้วย SYN-ACK หมายเลข ACK คือหมายเลขลำดับของโฮสต์ X เพิ่มขึ้นทีละ 1 (4322และ SYN จะเสนอหมายเลขลำดับเริ่มต้นของเซิร์ฟเวอร์เอง
  • โฮสต์ X ตอบกลับด้วย ACK สุดท้าย ซึ่งหมายเลข ACK คือหมายเลขลำดับของเซิร์ฟเวอร์ที่เพิ่มขึ้นทีละ 1

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

เหตุใด TCP จึงต้องการการจับมือสามขั้นตอน

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

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

ปัญหาทั่วไปที่เกิดขึ้นกับการเชื่อมต่อ TCP (TCP Handshake)

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

  • การโจมตีแบบ SYN flood: ไคลเอนต์ที่เป็นอันตรายส่ง SYN นับพันรายการโดยไม่ตอบกลับ SYN-ACK ทำให้ตารางการเชื่อมต่อของเซิร์ฟเวอร์เต็ม SYN cookies คือวิธีการป้องกันมาตรฐาน
  • การเชื่อมต่อแบบกึ่งเปิด: เมื่อการยืนยัน (ACK) ครั้งที่สามหายไป การเชื่อมต่อจะยังคงอยู่ในสถานะเปิดครึ่งหนึ่ง และในที่สุดก็จะถูกตัดการเชื่อมต่อเนื่องจากการหมดเวลา
  • ไฟร์วอลล์หรือ NAT อาจทำให้เที่ยวบินถูกบล็อกกลางคัน: อุปกรณ์มิดเดิลบ็อกซ์ที่มีสถานะ หากสูญเสียสถานะไป อาจทำให้แพ็กเก็ต SYN-ACK หายไป และทำให้ไคลเอนต์ต้องลองส่งใหม่อีกครั้ง
  • การรีเซ็ต RST: หากเซิร์ฟเวอร์ไม่ได้เปิดใช้งานพอร์ตที่ร้องขอ เซิร์ฟเวอร์จะตอบกลับด้วย SYN พร้อมกับ RST ซึ่งจะปิดการเชื่อมต่อทันที

คำถามที่พบบ่อย

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

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

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

TCP ปิดการเชื่อมต่อด้วยการจับมือสี่ขั้นตอน (four-way handshake) โดยการแลกเปลี่ยน FIN และ ACK แต่ละทิศทางจะปิดการเชื่อมต่ออย่างอิสระ ซึ่งช่วยให้ฝ่ายหนึ่งสามารถส่งข้อมูลได้จนเสร็จสิ้น แม้ว่าอีกฝ่ายจะปิดการเชื่อมต่อในส่วนของตนแล้วก็ตาม

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

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

ผู้ช่วย AI จะทำการระบุข้อมูลที่จับได้จากแพ็กเก็ต และจำแนกประเภทข้อมูลtransmits และ RSTs และตรวจจับ SYN floods พวกมันแปล Wireshark แปลงข้อมูลเป็นภาษาอังกฤษที่เข้าใจง่าย และแนะนำขั้นตอนการวินิจฉัยถัดไปสำหรับปัญหาการเชื่อมต่อ

ใช่แล้ว ผู้ช่วยเขียนโค้ด AI จะแปลงคำขอภาษาอังกฤษธรรมดาให้เป็น... Python Scapy หรือสคริปต์ netcat ที่เรียกใช้งานและตรวจสอบการเชื่อมต่อสามทาง จากนั้นอธิบายแต่ละบรรทัดเพื่อให้วิศวกรสามารถตรวจสอบก่อนเรียกใช้งานได้

สรุปโพสต์นี้ด้วย: