การเชื่อมต่อยังคงถูกตั้งค่าสถานะเป็น ESTABLISHED แม้ว่าโฮสต์จะไม่ได้เชื่อมต่อ


5

ฉันทำงานกับการแจกจ่าย Linux ที่ฝังอยู่และฉันต้องการตรวจสอบการเชื่อมต่อขาเข้าและขาออก (หากยังคงมีการใช้งานอื่น ๆ ) และฉันประสบปัญหาเพราะฉันสังเกตเห็นว่าแม้ว่าโฮสต์ระยะไกลจะปิดการเชื่อมต่อ การเชื่อมต่อเป็นESTABLISHEDผ่าน netstat

ฉันมีระบบฝังตัว Linux สองรุ่น: รุ่นหนึ่งใช้เคอร์เนล 2.6.34 รุ่นเก่าและใช้งานได้ดีในขณะที่รุ่นที่ล้มเหลวใช้เคอร์เนล 3.18.18

กำลังมองหาข้อมูลเพิ่มเติมฉันสงสัยว่าฉันต้องตั้งค่า / เปลี่ยนการหมดเวลา TCPดังนั้นฉันจึงกำหนดค่าผ่าน syctl.conf แต่ไม่เปลี่ยนแปลงอะไรเลย ระบบที่ใช้เคอร์เนล 2.6.34 ไม่มีการตั้งค่า TCP หมดเวลาจึงทำให้ฉันคิดว่า TCP ไม่ใช่รากของปัญหาของฉัน

คุณมีความคิดเกี่ยวกับสิ่งที่อาจเป็นเหตุผลของความเป็นจริงว่าการเชื่อมต่อยังคงเป็นที่ก่อตั้งขึ้น ?


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

ฉันพยายามตรวจสอบการเชื่อมต่อของแอปพลิเคชันอื่น ถ้าฉันกำลังเขียนรหัสฉันจะได้ระบุไว้ ฉันมีโฮสต์ระยะไกล (ไคลเอนต์ Windows) ซึ่งเชื่อมต่อกับระบบ Linux ของฉัน (เซิร์ฟเวอร์) และเมื่อลูกค้าเชื่อมต่อแล้วจะเริ่มดึงข้อมูลจากเซิร์ฟเวอร์ผ่านโปรโตคอล TCP หากลูกค้ายกเลิกการเชื่อมต่อการเชื่อมต่อบนเซิร์ฟเวอร์จะไม่หายไป มันยังคงเป็นที่ยอมรับ ซอฟต์แวร์เดียวกันนี้ใช้กับระบบ Linux เก่า (ตามที่ระบุในคำถาม) และใช้งานได้ดี
simo-zz

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

1
การหมดเวลาใช้งานได้ก็ต่อเมื่อฝ่ายที่เชื่อมต่อพยายามส่งข้อมูล มิฉะนั้นจะไม่มีการหมดเวลา การเชื่อมต่อ TCP สามารถคงอยู่ได้นานหลายวันโดยไม่ต้องส่งแพ็กเก็ตเดียวหากไม่มีฝ่ายใดพยายามส่งข้อมูลใด ๆ โดยทั่วไปวิธีเดียวที่จะตรวจจับอุปกรณ์ที่ถูกตัดการเชื่อมต่อคือพยายามส่งข้อมูลไปยังอุปกรณ์นั้น หากคุณไม่เคยส่งข้อมูลใด ๆ คุณก็ไม่มั่นใจว่าจะสามารถตรวจจับได้ เรากำลังพูดถึงโพรโทคอลแอปพลิเคชันใด (ด้านบนของ TCP)
David Schwartz

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

คำตอบ:


2

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

netstatเอาท์พุทเป็นล่ามของรัฐในปัจจุบันของTCPการเชื่อมต่อ หากลูกค้าต้องการที่จะตัดการเชื่อมต่อ / ปิดซ็อกเก็ตที่ได้รับการเปิดและจัดตั้งขึ้นก่อนหน้านี้พวกเขาควรแจ้งเรื่องนี้กับระบบระยะไกล นี่เป็นการส่งFIN requestโหนดไปที่โหนดอื่น (ข้อมูลเพิ่มเติมที่นี่ ) ในกรณีนี้เซิร์ฟเวอร์

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

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

tcpdump host X.X.X.X and port Y

ตกลง. แต่ฉันตั้งค่าพารามิเตอร์tcp_keepalive_timeหลายครั้งดังนั้นควรมีอย่างอื่น
simo-zz

คุณทำงานsysctl -pหลังจากแก้ไขไฟล์หรือไม่
nKn

ใช่ฉันยังดำเนินการคำสั่งนี้ มันคือทั้งหมดที่ฉันได้กำหนดค่า
simo-zz

จากนั้นไคลเอ็นต์ไม่ได้ถูกปิดหรือด้วยเหตุผลบางอย่างที่ยังคงมีแพ็กเก็ตที่ได้รับทางฝั่งเซิร์ฟเวอร์ โปรดทราบว่าACKจะไม่ถือว่าเป็นแพ็กเก็ต "ที่ไม่ได้ใช้งาน" ในกรณีนี้ โปรดทราบว่าการแก้ไขใด ๆ ที่ทำกับไฟล์จะไม่มีผลกับESTABLISHEDซ็อกเก็ตก่อนหน้านี้ดังนั้นจึงมีผลกับเบราว์เซอร์ที่เพิ่งสร้างใหม่
nKn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.