TCP แพ็กเก็ตถูกส่งใหม่ 7 ครั้งเมื่อ sysctl tcp_retries1 ถูกตั้งค่าเป็น 3 - เพราะเหตุใด


9

Ubuntu 12.04

ฉันพยายามทำความเข้าใจให้ดีขึ้นว่ากี่ครั้งที่ TCP จะพยายามส่งแพ็กเก็ตใหม่เมื่อไม่ได้รับการยืนยันปลายทางที่ได้รับ หลังจากอ่านหน้าคน tcpดูเหมือนว่านี่ถูกควบคุมโดย sysctl tcp_retries1:

tcp_retries1 (integer; default: 3)
           The number of times TCP will attempt to retransmit a  packet  on
           an  established connection normally, without the extra effort of
           getting the network layers involved.  Once we exceed this number
           of retransmits, we first have the network layer update the route
           if possible before each new retransmit.  The default is the  RFC
           specified minimum of 3.

ระบบของฉันถูกตั้งค่าเป็น 3:

# cat /proc/sys/net/ipv4/tcp_retries1 
3

ต้องการทดสอบสิ่งนี้ฉันเชื่อมต่อจากระบบ A (172.16.249.138) ไปยังระบบ B (172.16.249.137) ผ่าน ssh และเริ่มการวนรอบการพิมพ์แบบง่ายบนคอนโซล ฉันก็ตัดการเชื่อมต่อ B ทันทีจากเครือข่ายในขณะที่การสื่อสารนี้เกิดขึ้น

ในเทอร์มินัลอื่นฉันใช้ 'tcpdump host 172.16.249.137' ในระบบ A ด้านล่างนี้คือบรรทัดที่เกี่ยวข้องจากเอาต์พุต (เพิ่มหมายเลขบรรทัดเพื่อความชัดเจน)

00: ...
01: 13:29:46.994715 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [.], ack 5989441, win 80, options [nop,nop,TS val 1957286 ecr 4294962520], length 0
02: 13:29:46.995084 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [.], ack 5989441, win 186, options [nop,nop,TS val 1957286 ecr 4294962520], length 0    
03: 13:29:47.040360 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 186, options [nop,nop,TS val 1957298 ecr 4294962520], length 48
04: 13:29:47.086552 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [.], ack 5989441, win 376, options [nop,nop,TS val 1957309 ecr 4294962520], length 0
05: 13:29:47.680608 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1957458 ecr 4294962520], length 48
06: 13:29:48.963721 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1957779 ecr 4294962520], length 48
07: 13:29:51.528564 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1958420 ecr 4294962520], length 48
08: 13:29:56.664384 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1959704 ecr 4294962520], length 48
09: 13:30:06.936480 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1962272 ecr 4294962520], length 48
10: 13:30:27.480381 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1967408 ecr 4294962520], length 48
11: 13:31:08.504033 IP 172.16.249.138.50489 > 172.16.249.137.ssh: Flags [P.], seq 29136:29184, ack 5989441, win 376, options [nop,nop,TS val 1977664 ecr 4294962520], length 48
12: 13:31:13.512437 ARP, Request who-has 172.16.249.137 tell 172.16.249.138, length 28
13: 13:31:14.512336 ARP, Request who-has 172.16.249.137 tell 172.16.249.138, length 28
14: 13:31:15.512241 ARP, Request who-has 172.16.249.137 tell 172.16.249.138, length 28

หากฉันตีความอย่างถูกต้อง (และฉันอาจไม่ใช่) ระบบจะไม่รับแพ็กเก็ตของบรรทัดที่ 3 โดย A B จากนั้นลองส่งแพ็กเก็ตนี้ 7 ครั้ง (บรรทัดที่ 5-11) ในแต่ละครั้งที่เพิ่มตัวจับเวลาการส่งใหม่ เวลา).

ทำไมแพ็คเก็ตจึงถูกส่งใหม่ 7 ครั้งแทนที่จะเป็น 3

หมายเหตุ: ฉันทำการทดสอบอย่างเป็นทางการนี้หลังจากพบไฟล์ pcap สองสามตัวที่มีการส่งสัญญาณใหม่เกิดขึ้น 6-7 ครั้งผ่านการเชื่อมต่อ HTTP ดังนั้นจำนวนการส่งสัญญาณใหม่นั้นดูเหมือนจะไม่เฉพาะเจาะจงกับ SSH


คุณอ่านคำอธิบายของการตั้งค่าหรือไม่? ไม่ใช่จำนวนครั้งในการลองใหม่ จำนวนครั้งในการลองก่อนที่จะเปลี่ยนกลยุทธ์
David Schwartz

ตามที่กล่าวไว้ข้างต้นใช่ฉันอ่านการตั้งค่า ในกรณีนี้จะไม่มีเส้นทางในการอัปเดตเนื่องจากอยู่ในเครือข่ายย่อยเดียวกัน ทำไมต้องลอง 7 ครั้ง อะไรเป็นตัวกำหนดจำนวนการลองใหม่ทั้งหมดที่เกิดขึ้น
HodB

2
ค่าของคุณสำหรับ sysctl net.ipv4.tcp_retries2 คืออะไร net.ipv4.tcp_retries2 เป็นตัวแปรที่ควบคุมจำนวนการลองใช้ที่จะพยายาม ตัวแปร net.ipv4.tcp_retries1 เพียงควบคุมจำนวนการลองก่อนที่ระบบจะส่งสัญญาณในระดับที่ต่ำกว่าเพื่อลองตรวจสอบว่าระบบเครือข่ายพร้อมใช้งาน
hrunting

คำตอบ:


5

ฉันเชื่อว่าคุณสร้างซ็อกเก็ตเด็กกำพร้าด้วยการฆ่าการเชื่อมต่อบนเซิร์ฟเวอร์. 137 ดังนั้นพารามิเตอร์เคอร์เนลที่ใช้งานจะเป็น tcp_orphan_retries - ซึ่งมีค่าเริ่มต้นทั่วไปของลินุกซ์ที่ 7

คุณสามารถรับรายละเอียดของเงื่อนไขที่คุณสร้างและผลลัพธ์ที่นี่: http://www.linuxinsight.com/proc_sys_net_ipv4_tcp_orphan_retries.html

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