เป็นไปได้หรือไม่ที่การเชื่อมต่อ TCP จะยังคงเปิดอยู่เมื่อลูกค้ายกเลิกการเชื่อมต่อ


12

เรามีแอปพลิเคชั่นเซิร์ฟเวอร์ที่กำลังประสบปัญหาการเชื่อมต่อ TCP ที่ประมาณ 4000 การเชื่อมต่อ สิ่งนี้จะเกิดขึ้นทุก 3 หรือ 4 สัปดาห์ (โดยประมาณ) ผู้ขายซึ่งได้สร้างแอปพลิเคชันเซิร์ฟเวอร์นี้จะบอกเราหลังจากตรวจสอบเอาต์พุตของ netstat -b ว่าการเชื่อมต่อบางส่วนยังคงเปิดอยู่แม้ว่าลูกค้าจะหลุด

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

TLDR;

เซิร์ฟเวอร์สามารถรายงานการเชื่อมต่อที่สร้างไว้กับคอมพิวเตอร์ที่ปิดอยู่ได้หรือไม่?

คำตอบ:


13

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

มันเป็นความน่าเกลียดสยอง "การแก้ปัญหา" แต่คุณสามารถเปิดใช้งานkeepalives TCP มีเพิ่มเติมในบทความนี้


คุณอาจหมายถึงเลเยอร์และชั้นเซสชันที่อยู่ด้านบนของเลเยอร์การขนส่งซึ่งเป็นที่ที่ TCP ตั้งอยู่
Rilindo

1
@Rindindo: ในทางปฏิบัติและในกรณีนี้คุณมีแอปพลิเคชันที่โทรไปยังสแต็ก TCP โปรโตคอลด้านบนของ TCP (HTTP, POP หรืออะไรก็ตาม) มักจะระบุวิธีการทำเช่นนี้เพราะนักออกแบบของโปรโตคอลเหล่านั้นรู้ว่า TCP ไม่สามารถทำได้
David Schwartz

อ๊ะความผิดของฉัน ชั้นที่ 7 ของมันนั้น
Rilindo

ฉันจะไม่เปิดใช้งาน keepalives ณ จุดนี้ แต่มันมีประโยชน์ที่จะรู้ว่ามีตัวเลือกอยู่ ดูเหมือนว่าบทความนั้นจะแนะนำว่ามีการหมดเวลา 2 ชั่วโมงแล้ว .. AFAIK การเชื่อมต่อจะถูกเปิดไว้เป็นวัน / สัปดาห์
Josh Smeaton

โอกาสส่วนใหญ่จะไม่ได้เปิดใช้งาน keepalives โค้ดบางส่วนต้องเปิดใช้งาน ดูเหมือนว่าแอปพลิเคชันจะเสียธรรมดาหากไม่ได้เปิดใช้งาน keepalives และไม่มีกลไกการหมดเวลา / เก็บเกี่ยว เรากำลังพูดถึงโปรโตคอลอะไร (HTTP? SMTP? FTP?)
David Schwartz

8

ใช่มันเป็นไปได้ ตามที่เดวิดและพอลกล่าวไว้ในคำตอบของพวกเขาไม่มีกลไกใน TCP (นอกเหนือจาก TCP Keep-alives ซึ่งเป็นทางเลือก) เพื่อตรวจจับการเชื่อมต่อแบบเปิดครึ่ง ขึ้นอยู่กับผู้ขายแอปพลิเคชันเพื่อพิจารณาสถานะของการเชื่อมต่อและดำเนินการตามความเหมาะสม

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

คุณจะต้องเริ่มแก้ไขปัญหานี้จากเลเยอร์ 1 (ฟิสิคัล) ของโมเดล OSI จนถึงเลเยอร์ 7 (แอปพลิเคชัน) เพื่อหาสาเหตุของปัญหาที่เกิดขึ้น คำแนะนำของฉันคือการติดตั้งและเรียกใช้โปรแกรมจับแพ็คเก็ตบนไคลเอนต์ที่ได้รับผลกระทบจนกว่าปัญหาจะเกิดขึ้นจากนั้นวิเคราะห์การจับภาพเพื่อลองและกำหนดสิ่งที่ทำให้ไคลเอ็นต์ไม่ปิดการเชื่อมต่อ


3
หรือให้ผู้ขายใช้เวลาที่เหมาะสม :)
Shane Madden

5

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


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

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

@ joeqwerty: จริง แต่เซิร์ฟเวอร์สามารถตัดสินใจได้ว่ามันไม่ต้องการที่จะให้การเชื่อมต่อเปิดไปเรื่อย ๆ และสามารถใช้กลไกการหมดเวลา / ปิด นั่นคือสิ่งที่ David Schwartz มีความหมายในคำตอบของเขาโดย "เป็นความรับผิดชอบของรหัสแอปพลิเคชัน" ดังนั้นเซิร์ฟเวอร์สามารถสร้างความแตกต่างระหว่างการเชื่อมต่อแบบครึ่งเปิดและการเชื่อมต่อที่ไม่ได้ใช้งานหากต้องการ อย่างไรก็ตามสำหรับ TCP ไม่มีความแตกต่างระหว่างการเชื่อมต่อแบบเปิดครึ่งและการเชื่อมต่อที่ไม่ได้ใช้งาน
sleske

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