การตอบรับโดย TCP ไม่รับประกันว่าข้อมูลจะถูกส่ง


11

ใน RFC 793 มีส่วนหนึ่งเกี่ยวกับการตอบรับของส่วน TCP:

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

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

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

แต่ตอนนี้ RFC นี้ทำให้ฉันคิดว่า - ฉันควรตรวจสอบอะไรอีก (โดยไม่ต้องตั้งค่า Wireshark) หากมีการเชื่อมต่อ TCP แล้ว แต่ผู้ใช้ยังคงประสบปัญหาการเชื่อมต่ออยู่


5
สิ่งที่ประโยคนี้หมายถึงเป็นเพียงความหมายตามตัวอักษรภาษาอังกฤษของประโยค: ความจริงที่ว่าไดรเวอร์เครือข่ายได้รับข้อมูล (และยอมรับการรับ) ไม่รับประกันว่าผู้ใช้ปลายทางได้รับข้อมูล อาจมีข้อผิดพลาดในเว็บเซิร์ฟเวอร์ตัวอย่างเช่น สำหรับคำถามปิดของคุณ: วิธีเดียวที่จะทราบว่าผู้ใช้ปลายทางได้รับข้อมูลหรือไม่คือโทรหาพวกเขาและถามพวกเขา
Jörg W Mittag

คำตอบ:


24

RFC ส่วนนี้เกี่ยวกับการส่งผ่านความรับผิดชอบไปยังระบบปฏิบัติการหรืออะไรก็ตามที่เป็นขั้นตอนต่อไปของกระบวนการ มันเกี่ยวข้องกับการแยกชั้น

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

ฉันคิดเสมอเกี่ยวกับวิธีนี้:

  • ระบบปฏิบัติการอาจล้มเหลวระหว่างการส่ง ACK และข้อมูลที่มาถึงกระบวนการไคลเอนต์ ("ไคลเอนต์" ที่นี่หมายถึงไคลเอนต์ของระบบปฏิบัติการไม่ใช่ "ไคลเอนต์เครือข่าย")
  • กระบวนการไคลเอนต์อาจเป็นบั๊กหรือผิดพลาดหรือช้ากว่าที่คาดไว้มากในการจัดการกับข้อมูลที่เข้ามาหรืออ่านได้ในสถานการณ์ที่ไม่ชัดเจน
  • หากไคลเอนต์กำลังส่งข้อมูลเป็นต้นไปอาจเป็นไฟล์ดิสก์ไฟล์อาจยังไม่ได้เขียนหรือล้างข้อมูล
  • ถ้าไคลเอนต์กำลังส่งข้อมูลเป็นต้นไปโดย TCP, TCP ด้านไกลอาจไม่ได้ส่งข้อมูลรับ ACK หรือกระบวนการไกลใช้ข้อมูลสำเร็จ

ทั้งหมดที่กล่าวมาก็คือนี่เป็นการตอบรับเลเยอร์ 3 ("ฉันได้ยินไบต์ของคุณ") ไม่ใช่การตอบรับเลเยอร์ที่สูงขึ้น ลองพิจารณาตัวอย่างเช่นความแตกต่างระหว่าง TCP ACK, SMTP 250 OKหลังจากเกตเวย์จดหมายของ hop ถัดไปยอมรับข้อความ, ข้อความการรับข้อความ (เช่นต่อRFC 3798 ), พิกเซลการติดตามที่เปิดข้อความ, บันทึกขอบคุณจาก PA และตอบว่า "ใช่ฉันจะทำ"

อีกตัวอย่างที่ชัดเจนคือเครื่องพิมพ์:

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

ฉันขอแนะนำว่าหากผู้ใช้เห็นและส่ง ACKs แต่ยังคงประสบปัญหาการเชื่อมต่อเป็นลำดับความสำคัญมีความแออัดปัญหา OS หรือแอปพลิเคชันมากกว่าสิ่งที่เกี่ยวข้องกับเครือข่ายอย่างเคร่งครัด

หากต้องการวินิจฉัยฉันขอแนะนำให้ค้นหาการส่งสัญญาณซ้ำมากกว่า ACK โดยเฉพาะ


รายการหัวข้อย่อยอื่น: แม้ว่ากระบวนการไคลเอนต์จะทำงานได้ดี แต่อาจยังไม่ได้อ่านข้อมูล
Barmar

1
กระบวนการไคลเอนต์ (ถ้ารู้สึกขี้เกียจหรือผิดปกติ) อาจไม่เคยเรียกrecv()ใช้ซ็อกเก็ตซึ่งในกรณีนี้ข้อมูลที่ได้รับจะยังคงอยู่ในซ็อกเก็ต TCP ซ็อกเก็ตรับบัฟเฟอร์อย่างไม่มีกำหนด
Jeremy Friesner

ขอขอบคุณทั้งคู่อัปเดตเพื่อแนะนำกระบวนการไคลเอนต์อาจช้า buggy ไม่แน่นอน
jonathanjo

คุณไม่สามารถพึ่งพา ACK เพื่อให้แน่ใจว่าแอปพลิเคชันประมวลผลอินพุตของคุณคุณต้องใช้เลเยอร์แอปพลิเคชัน ACK หรือตรวจสอบ เมื่อต้องการใส่สิ่งนี้ในบริบทอื่น สำหรับเครือข่ายการควบคุมทางอุตสาหกรรมที่ใช้ TSN กับ IP Stack บนฝั่งไคลเอ็นต์ TCP ACK ไม่เพียงพอที่จะรับประกันว่าตัวแปรกระบวนการถูก latched นั่นคือคุณไม่สามารถพึ่งพา TCP ACK เพื่อทำให้ระบบอยู่ในสถานะที่ปลอดภัยหรือสามารถให้บริการได้คุณต้องได้รับการยอมรับจากบริการแอปพลิเคชันเลเยอร์ที่ปลอดภัยในการติดมือของคุณในเครื่อง
crasic

10

จากมุมมอง RFC "ผู้ใช้ปลายทาง" เป็นแอปพลิเคชัน ไม่มีการรับประกันว่าแอปพลิเคชันได้รับข้อมูลเพียงว่ากระบวนการ TCP ได้รับมา

จากมุมมองของ NOC เครือข่ายทำงานและข้อมูลมาถึงโฮสต์ปลายทาง สมมุติว่านั่นคือทั้งหมดที่คุณใส่ใจ


0

คุณสามารถดูได้ด้วยวิธีนี้

คุณคือ M.Smith และคุณต้องการส่งจดหมายถึง M.Toto (บุคคลเป็นเลเยอร์แอปพลิเคชัน)

ในการส่งจดหมายคุณไปที่ที่ทำการไปรษณีย์ท้องถิ่น A ซึ่งจะส่งจดหมายไปยังที่ทำการไปรษณีย์ท้องถิ่น M.Toto B (ที่ทำการไปรษณีย์คือเลเยอร์ TCP)

ทุกอย่างสามารถทำงานได้ดีระหว่างคุณที่ทำการไปรษณีย์ A และที่ทำการไปรษณีย์ B - B จะส่ง ACK ไปยังที่ทำการไปรษณีย์ A แต่ไม่มีอะไรรับประกันว่าจดหมายจะมาถึง M.Toto อาจมีอะไรเกิดขึ้นระหว่างที่ทำการไปรษณีย์ B และ M.Toto

นั่นเป็นสิ่งที่ RFC พูด

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.