Linux에서 TCP RTO 값 변경


12

연결에 대한 TCP RTO (재전송 시간 제한) 값 을 변경하고 싶습니다. 일부 수행 한 내용은이 작업을 수행 할 수 있지만 변경 위치와 방법은 밝히지 않습니다.

/proc/sys/net/ipv4변수를 살펴 봤지만 RTO와 관련된 변수는 없습니다. 누군가이 값을 변경하는 방법을 말해 줄 수 있다면 감사하겠습니다.


이것은 나를 위해 작동하지 않습니다. rto 시간과 함께 'ms'를 포함하면 최소한 오류가 발생합니다! 나는 명령이 작동하도록했지만 ss -i는 그렇지 않다고 말합니다. 또한 2 개의 sysctl 변수는 존재하지 않습니다. 4.4 커널에서 실행 중
Mark Seger

나는 더 최근 배포판을 사용해 보았고 ip route replace대신 성공 했습니다. ip route구문이 약간 변경된 것 같습니다 . 그래도 성공적으로 수정을 할 수있었습니다. 참고로, 당신은 당신이 나를 핑하고 싶다면 질문이 아니라 대답에 대해 언급해야합니다-나는 기본적으로 우연히 이것을 보았습니다. 최근의 행운이있었습니다 :)
Adam C

답변:


30

RTO를 구체적으로 변경할 수없는 이유는 RTO가 정적 값이 아니기 때문입니다. 대신 (자연스럽게 초기 SYN 제외) 각 연결에 대한 RTT (Round Trip Time)를 기반으로합니다. 실제로, RTT의 스무딩 버전과 일부 상수가 혼합 된 RTT 분산을 기반으로합니다. 따라서 각 TCP 연결에 대해 동적으로 계산 된 값이므로 일반적으로 계산 및 RTO에 대해 자세히 설명하는 이 기사 를 적극 권장 합니다 .

RFC 6298 도 관련이 있습니다 (많은 것들 중에서) :

RTO가 계산 될 때마다 1 초 미만이면 RTO를 1 초로 반올림해야합니다.

커널은 항상 RTO를 1 초로 설정합니까? Linux를 사용하면 다음 ss -i명령 을 실행하여 열린 연결에 대한 현재 RTO 값을 표시 할 수 있습니다 .

State       Recv-Q Send-Q                                                  Local Address:Port     Peer Address:Port
ESTAB       0      0                                                           10.0.2.15:52861   216.58.219.46:http
     cubic rto:204 rtt:4/2 cwnd:10 send 29.2Mbps rcv_space:14600
ESTAB       0      0                                                           10.0.2.15:ssh          10.0.2.2:52586
     cubic rto:201 rtt:1.5/0.75 ato:40 cwnd:10 send 77.9Mbps rcv_space:14600
ESTAB       0      0                                                           10.0.2.15:52864   216.58.219.46:http
     cubic rto:204 rtt:4.5/4.5 cwnd:10 send 26.0Mbps rcv_space:14600

위의 내용은 SSH로 로그인 한 VM의 결과이며 google.com에 연결되어 있습니다. 보다시피 RTO는 실제로 200-ish (밀리 초)로 설정되어 있습니다. RFC에서 1 초 값으로 반올림되지 않았으며 약간 높다고 생각할 수도 있습니다. Linux 용 RTO와 관련하여 최소 (200 밀리 초) 및 최대 (120 초) 범위가 있기 때문입니다 (위의 링크 된 기사에서 이에 대한 자세한 설명이 있습니다).

따라서 RTO 값을 직접 변경할 수는 없지만 무선과 같은 손실이있는 네트워크의 경우 F-RTO를 조정할 수 있습니다 (이는 이미 배포판에 따라 활성화되어있을 수 있음). 실제로 조정할 수있는 F-RTO와 관련된 두 가지 관련 옵션이 있습니다 ( 여기 요약 ).

net.ipv4.tcp_frto
net.ipv4.tcp_frto_response

최적화하려는 대상에 따라 유용하거나 유용하지 않을 수 있습니다.

편집 : 주석에서 TCP의 rto_min / max 값을 조정할 수있는 기능에 후속.

TCP에 대한 전역 최소 RTO를 변경할 수는 없지만 (SCTP에 대해서는 가능하지만 sysctl에 노출되어 있음) 라우팅 당 RTO의 최소값을 조정할 수 있다는 것은 좋은 소식입니다. 기초. CentOS VM의 라우팅 테이블은 다음과 같습니다.

ip route
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15 
169.254.0.0/16 dev eth0  scope link  metric 1002 
default via 10.0.2.2 dev eth0

다음과 같이 기본 경로에서 rto_min 값을 변경할 수 있습니다.

ip route change default via 10.0.2.2 dev eth0 rto_min 5ms

이제 내 라우팅 테이블은 다음과 같습니다.

ip route
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.15 
169.254.0.0/16 dev eth0  scope link  metric 1002 
default via 10.0.2.2 dev eth0  rto_min lock 5ms

마지막으로 연결을 시작하고 ss -i이것이 존중되는지 확인 하십시오.

ss -i
State       Recv-Q Send-Q                                               Local Address:Port                                                   Peer Address:Port   
ESTAB       0      0                                                        10.0.2.15:ssh                                                        10.0.2.2:50714   
     cubic rto:201 rtt:1.5/0.75 ato:40 cwnd:10 send 77.9Mbps rcv_space:14600
ESTAB       0      0                                                        10.0.2.15:39042                                                 216.58.216.14:http    
     cubic rto:15 rtt:5/2.5 cwnd:10 send 23.4Mbps rcv_space:14600

성공! HTTP 연결의 rto (변경 후)는 15ms 인 반면 SSH 연결 (변경 전)은 200+입니다.

실제로이 방법이 마음에 듭니다. 다른 트래픽을 유발할 수있는 전 세계가 아닌 적절한 경로에서 더 낮은 값을 설정할 수 있습니다. 마찬가지로 ( ip 매뉴얼 페이지 참조 ) 경로의 초기 rtt 추정값과 초기 rttvar를 조정할 수 있습니다 (동적 RTO를 계산할 때 사용됨). 조정 측면에서 완벽한 솔루션은 아니지만 대부분의 중요한 부분이 있다고 생각합니다. 최대 설정을 조정할 수는 없지만 어떤 경우에도 일반적으로 유용하지는 않습니다.


@Adam C에게 설명을 해주셔서 감사하지만 min (200 milli) 및 max (120sec)를 언급했지만 이들 중 (min 또는 max)를 변경할 수 있습니까? 그렇다면, 어떻게? ...
obiigbe91

나는 그것들이 코드에서 상수라고 믿으며, 그것들을 동적으로 설정하는 방법을 알지 못하지만 코드를 변경하고 자신의 커널을 컴파일하는 것이 약간 많다고 가정하기 때문에 조금 파고 볼 것입니다 :)
Adam C

rto_min을 조정하는 방법을 찾아서 답에 추가 한 몇 가지 관련 항목을 추가했습니다.
Adam C

왜 같은 것이 rto_max없습니까? 전역 최대 시간 제한을 어떻게 설정합니까?
est

최소값을 설정하거나 기본값을 수락 한 다음 허용 된 재시도 횟수 ( net.ipv4.tcp_retries1net.ipv4.tcp_retries2유사한 IIRC) 를 변경 하면 RTO 최대 값에 해당한다고 생각합니다.
Adam C
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.