Gói TCP được truyền lại 7 lần khi sysctl tcp_retries1 được đặt thành 3 - tại sao?


9

Ubuntu 12.04

Tôi đang cố gắng để hiểu rõ hơn bao nhiêu lần TCP sẽ cố gắng truyền lại một gói khi nó không nhận được xác nhận đích đã nhận được. Sau khi đọc trang man tcp , có vẻ như điều này được kiểm soát bởi 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.

Hệ thống của tôi được đặt thành giá trị mặc định là 3:

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

Muốn kiểm tra điều này, tôi đã kết nối từ hệ thống A (172.16.249.138) với hệ thống B (172.16.249.137) qua ssh và bắt đầu một vòng lặp in đơn giản trên bàn điều khiển. Sau đó tôi ngắt kết nối B đột ngột khỏi mạng trong khi giao tiếp này đang diễn ra.

Trong một thiết bị đầu cuối khác, tôi đang chạy 'tcpdump host 172.16.249.137' trên hệ thống A. Dưới đây là các dòng có liên quan từ đầu ra (số dòng được thêm cho rõ ràng).

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

Nếu tôi diễn giải chính xác điều này (và tôi có thể không), gói của dòng 3 không bao giờ được hệ thống B. thừa nhận. Sau đó thử lại để gửi gói này 7 lần (dòng 5-11) mỗi lần tăng bộ đếm thời gian truyền lại của nó (tăng gấp đôi mỗi lần thời gian).

Tại sao gói tin được truyền lại 7 lần thay vì 3?

Lưu ý: Tôi đã thực hiện kiểm tra chính thức này sau khi nhận thấy một vài tệp pcap trong đó việc truyền lại xảy ra 6-7 lần so với các kết nối HTTP để số lần truyền lại dường như không cụ thể đối với SSH.


Bạn đã đọc giải thích về các thiết lập? Đây không phải là số lần thử lại. Đó là số lần thử lại trước khi thay đổi chiến lược.
David Schwartz

Như đã đề cập ở trên, vâng, tôi đọc các thiết lập. Trong trường hợp này, sẽ không có lộ trình để cập nhật vì cả hai đều trên cùng một mạng con. Tại sao 7 lần thử lại? Điều gì xác định tổng số lần thử lại xảy ra trong tổng số?
HodB

2
Giá trị của bạn cho sysctl net.ipv4.tcp_retries2 là gì? Biến net.ipv4.tcp_retries2 là biến thực sự kiểm soát số lần thử lại sẽ được thử. Biến net.ipv4.tcp_retries1 chỉ kiểm soát số lần thử lại trước khi hệ thống báo hiệu mức thấp hơn để thử xác minh rằng mạng có sẵn.
vào

Câu trả lời:


5

Tôi tin rằng bạn đã tạo ra một ổ cắm mồ côi bằng cách hủy kết nối trên máy chủ .137. Vì vậy, tham số kernel đang sử dụng sẽ là tcp_orphan_retries - có mặc định linux chung là 7.

Bạn có thể nhận được một mô tả về cả điều kiện bạn đã tạo và kết quả tại đây: http://www.linuxinsight.com/proc_sys_net_ipv4_tcp_orphan_retries.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.