อะไรเป็นสาเหตุให้ส่งแฟล็ก TCP / IP reset (RST)


123

ฉันกำลังพยายามหาคำตอบว่าทำไมการเชื่อมต่อ TCP / IP ของแอปของฉันจึงมีอาการสะอึกทุกๆ 10 นาที (แน่นอนภายใน 1-2 วินาที) ฉันใช้งาน Wireshark และพบว่าหลังจากไม่มีการใช้งาน 10 นาทีปลายอีกด้านหนึ่งกำลังส่งแพ็กเก็ตพร้อมชุดค่าสถานะรีเซ็ต (RST) การค้นหาของ Google บอกฉันว่า "ค่าสถานะ RESET หมายความว่าผู้รับเริ่มสับสนและต้องการยกเลิกการเชื่อมต่อ" แต่นั่นเป็นเพียงรายละเอียดเล็กน้อยที่ฉันต้องการ อะไรคือสาเหตุนี้ และเป็นไปได้ไหมที่เราเตอร์บางตัวในระหว่างทางจะรับผิดชอบหรือสิ่งนี้จะมาจากจุดสิ้นสุดอื่นเสมอ?

แก้ไข:มีเราเตอร์ (โดยเฉพาะ Linksys WRT-54G) นั่งอยู่ระหว่างคอมพิวเตอร์ของฉันและปลายทางอื่น ๆ - มีสิ่งใดที่ฉันควรค้นหาในการตั้งค่าเราเตอร์หรือไม่


13
นี่คืออีกเรื่อง: Comcast
Tom Ritter

1
โชคดีที่ฉันไม่ได้พึ่งพา Comcast เนื่องจากสิ่งนี้เกิดขึ้นใน LAN ฉันหวังว่าฉันจะสามารถเปลี่ยนคำตำหนิที่ทำได้ง่าย ๆ ;)
ลูกา

คุณเคยคิดออกหรือไม่? ฉันไม่สามารถแสดงความคิดเห็นได้เนื่องจากมีคะแนนไม่เพียงพอ แต่ฉันมีปัญหาเดียวกันกับที่คุณพบและฉันกำลังหาทางแก้ไข

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

"Comcast" ที่คุณพูด? : D ตรวจสอบ repo ที่เกี่ยวข้องนี้: github.com/tylertreat/comcast
joonas.fi

คำตอบ:


89

'เราเตอร์' สามารถทำอะไรก็ได้โดยเฉพาะ NAT ซึ่งอาจเกี่ยวข้องกับการรบกวนการรับส่งข้อมูล ...

เหตุผลหนึ่งที่อุปกรณ์จะส่ง RST เพื่อตอบสนองต่อการรับแพ็คเก็ตสำหรับซ็อกเก็ตที่ปิดอยู่

เป็นการยากที่จะให้คำตอบที่ชัดเจน แต่โดยทั่วไปเนื่องจากการบิดเบือนที่เป็นไปได้ทั้งหมดได้รับการเยี่ยมชมบน TCP ตั้งแต่เริ่มต้นและผู้คนทุกประเภทอาจแทรก RST เพื่อพยายามปิดกั้นการรับส่งข้อมูล (ตัวอย่างเช่น 'ไฟร์วอลล์ระดับประเทศ' บางตัวจะทำงานในลักษณะนี้)


6
เราเตอร์มีการหมดเวลา 10 นาทีสำหรับการเชื่อมต่อ TCP หรือเราเตอร์เปิดใช้งาน "เกตเวย์สมาร์ทแพ็คเก็ตตรวจจับ"
David Schwartz

2
ค่อนข้างรวยที่จะแนะนำว่าเราเตอร์อาจถูกกำจัดข้อผิดพลาด
Marquis of Lorne

23

เรียกใช้ packet sniffer (เช่น Wireshark) บนเครื่องเพียร์เพื่อดูว่าเป็นเพียร์ที่ส่ง RST หรือคนที่อยู่ตรงกลาง


14

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


7

ไฟร์วอลล์บางตัวทำเช่นนั้นหากไม่มีการเชื่อมต่อเป็นเวลา x จำนวนนาที ISP บางรายตั้งค่าเราเตอร์ให้ทำเช่นนั้นด้วยเหตุผลหลายประการเช่นกัน

ในวันนี้และอายุคุณจะต้องจัดการ (สร้างใหม่ตามความจำเป็น) อย่างสง่างาม


2
การเชื่อมต่อถูกสร้างขึ้นใหม่ได้ดีปัญหาคือช่วงเวลาสั้น ๆ ของการตัดการเชื่อมต่อทำให้เกิดการแจ้งเตือนโดยไม่จำเป็น
ลุค

1
ฉันมีปัญหากับอุปกรณ์ Cisco PIX / ASA โดยเฉพาะ พวกเขามีระยะหมดเวลาสั้นโดยเฉพาะเป็นค่าเริ่มต้น อุปกรณ์ที่ถูกกว่ามักจะ "ดีกว่า" ในเรื่องนี้ (เนื่องจากไม่หมดเวลาเร็วจริง) ...
Brian Knoblauch

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

7

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


6
ทั้งสองฝ่ายส่งและรับ FIN แบบปิดปกติ ไม่มีอะไรผิดปกติกับสถานการณ์นี้ดังนั้นจึงไม่มีเหตุผลที่ฝ่ายใดฝ่ายหนึ่งจะทำการรีเซ็ต ประโยคแรกไม่เข้าท่าด้วยซ้ำ
Marquis of Lorne

2
[RST, ACK] ยังสามารถส่งโดยฝ่ายที่รับ SYN บนพอร์ตที่ไม่ได้รับฟัง ในกรณีที่ฉันวิ่งข้าม RST / ACK มาประมาณ 60 วินาทีหลังจาก SYN แรก FWIW
Les

@MarquisofLorne ประโยคแรกอาจถือว่าไม่ถูกต้อง แต่วลี "in a wrong state" ในประโยคที่สองทำให้ถูกต้อง
Victor Yarema

7

หากมีเราเตอร์ที่ทำ NAT โดยเฉพาะเราเตอร์ระดับล่างที่มีทรัพยากรน้อยเครื่องจะกำหนดอายุเซสชัน TCP ที่เก่าที่สุดก่อน ในการทำเช่นนี้จะตั้งRSTค่าสถานะในแพ็กเก็ตที่บอกสถานีรับอย่างมีประสิทธิภาพให้ปิดการเชื่อมต่อ (อย่างไม่สมศักดิ์ศรี) สิ่งนี้ทำเพื่อประหยัดทรัพยากร


3

สิ่งหนึ่งที่ควรระวังคือไฟร์วอลล์ Linux netfilter จำนวนมากถูกกำหนดค่าไม่ถูกต้อง

หากคุณมีสิ่งที่ต้องการ:

-A FORWARD -m state --state RELATED, ESTABLISHED -j ACCEPT

-A ไปข้างหน้า -p tcp -j ปฏิเสธ - ปฏิเสธด้วย tcp-reset

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

การเรียงลำดับใหม่มีแนวโน้มโดยเฉพาะอย่างยิ่งกับเครือข่ายไร้สาย

สิ่งนี้ควรเป็น:

-A FORWARD -m state --state RELATED, ESTABLISHED -j ACCEPT

-A FORWARD -m state --state ไม่ถูกต้อง -j DROP

-A ไปข้างหน้า -p tcp -j ปฏิเสธ - ปฏิเสธด้วย tcp-reset

โดยทั่วไปทุกเวลาที่คุณมี:

... -m รัฐ - รัฐที่เกี่ยวข้องก่อตั้ง -j ยอมรับ

ทันทีควรตามด้วย:

... -m state --state ไม่ถูกต้อง -j DROP

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


0

เนื่องจากมีกระบวนการอื่นในเครือข่ายที่ส่ง RST ไปยังการเชื่อมต่อ TCP ของคุณ

โดยปกติ RST จะถูกส่งในกรณีต่อไปนี้

  • กระบวนการปิดซ็อกเก็ตเมื่อเปิดใช้งานซ็อกเก็ตโดยใช้ตัวเลือก SO_LINGER
  • ระบบปฏิบัติการกำลังทำการล้างทรัพยากรเมื่อกระบวนการของคุณออกโดยไม่ต้องปิดซ็อกเก็ต

ในกรณีของคุณดูเหมือนว่ากระบวนการกำลังเชื่อมต่อการเชื่อมต่อของคุณ (พอร์ต IP +) และส่ง RST ต่อไปหลังจากสร้างการเชื่อมต่อ

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