본문 바로가기
리눅스&OS

리눅스 TCP 커널 파라메터 - 재전송과 타임 아웃 그리고 연결해제 - tcp_retries1과 tcp_retries2에 대해서

by developer's warehouse 2024. 1. 19.

니리눅스에서 네트워크 패킷이 drop되는 현상이 발생하거나 재전송 되는 경우 ss혹은 netstat으로 확인합니다. 재전송과 타임아웃은 리눅스 커널 파라메터에 의해서 조절되며, 이 값에 따라 소켓이 끊기는 경우가 발생합니다.

이 글에서는 리눅스에서 TCP 패킷 재전송에 대해 설명합니다.

리눅스 TCP 커널 파라메터 - 재전송과 타임 아웃 그리고 연결해제 썸네일

리눅스 커널 파라메터

리눅스에서 네트워크 관련 커널 파라메터는 tcp_retries1과 tcp_retries2가 있습니다. 각각은 TCP 소켓의 재전송 관련 로직에 영향을 주며, 네트워크 패킷 drop시 연결을 끊는 기준이 됩니다. 각각에 대해서 알아보겠습니다.

1. tcp_retries1

`tcp_retries1`은 TCP 연결에서 문제가 발생했을 때 재시도할 횟수를 설정하는 파라미터입니다. 이 값은 연결 시도가 실패했을 때, IP 레이어의 네트워크가 잘못되었는지 확인하는데 사용됩니다. 기본값은 3입니다.

2. tcp_retries2

`tcp_retries2`는 TCP 연결을 끊기 전에 재시도할 횟수를 설정하는 파라미터입니다. 이 값은 TCP 연결이 더 이상 유지될 수 없다고 판단하는 기준이 됩니다. 기본값은 15입니다.

이 두 파라미터는 TCP 연결의 안정성과 성능을 조정하는 데 중요한 역할을 합니다. 네트워크 환경이나 애플리케이션의 요구 사항에 따라 적절한 값으로 설정할 수 있습니다.

RTO란?

RTO는 Retransmission Timeout의 약자로 재전송 타이머가 작동하는 시간을 의미합니다.

리눅스에서 TCP의 초기 RTO 값을 확인하는 방법은 `ss -i` 명령을 사용하는 것입니다. 이 명령은 현재 통신 중인 세션의 RTO 값을 보여줍니다.

TCP의 초기 RTO 값은 `TCP_RTO_MIN`으로 정의되며, 이 값은 리눅스에서 약 200ms로 설정되어 있습니다. 그러나 이 값은 네트워크 상태와 트래픽에 따라 달라질 수 있습니다.

또한, `ip route` 명령을 사용하여 `RTO_MIN` 값을 변경할 수 있습니다. 이를 통해 특정 경로에 대한 최소 RTO 값을 조정할 수 있습니다.

그러나 이러한 설정 변경은 네트워크 성능에 영향을 미칠 수 있으므로 주의가 필요합니다. 이러한 변경은 충분한 테스트와 모니터링 후에 수행되어야 합니다.

tcp ESTAB 0 0 127.0.0.1:6010 127.0.0.1:51180
cubic wscale:9,9 rto:204 rtt:1.148/2.21 ato:40 mss:65483 pmtu:65535 rcvmss:42052 advmss:65483 cwnd:10 ssthresh:18 bytes_sent:165883440 bytes_retrans:4608 bytes_acked:165878832 bytes_received:10807702808 segs_out:5843
27 segs_in:783310 data_segs_out:435841 data_segs_in:677812 send 4.56Gbps lastsnd:528 lastrcv:552 lastack:528 pacing_rate 5.47Gbps delivery_rate 131Gbps delivered:435842 app_limited busy:2125296ms retrans:0/76 dsack_dups:76 rc
v_rtt:4.746 rcv_space:783340 rcv_ssthresh:3145024 minrtt:0.022

ss -i 명령어의 출력에서 rto는 Retransmission Timeout을 나타내며, 이는 패킷이 손실되었을 때 TCP가 재전송을 언제 시작할지를 결정하는 데 사용됩니다. 여기서 초기 RTO 값은 204이며, 이 값의 단위는 밀리초(ms)입니다.

참고: RTO는 네트워크의 현재 상태를 반영하여 동적으로 조정됩니다. 따라서 초기 RTO 값은 연결 설정 시에만 사용되며, 이후에는 네트워크 조건에 따라 변경될 수 있습니다.

네트워크 문제 후 연결이 끊기는 시간 계산

TCP는 네트워크에서 지수 백오프(Exponential backoff) 계산 방식을 사용하여 전송이 실패했을 때 재전송을 합니다. 그리고, 각 재전송 시도마다 대기 시간이 이전 대기 시간의 2배로 증가합니다. 이는 네트워크 충돌을 방지하고 효율적인 네트워크 사용을 돕기 위한 방법입니다.

초기 RTO(Retransmission Timeout)가 200ms인 경우, tcp_retries1이 3이고 tcp_retries2가 8로 8번의 재전송을 한다고 가정하면, 각 재전송 시도에 대한 대기 시간은 다음과 같이 계산됩니다:

RTO(200) X tcp_retries1(3) = 600ms

RTO(200) tcp_retries2 (8)

첫 번째 재전송: 200ms * 2 = 400ms
두 번째 재전송: 400ms * 2 = 800ms
세 번째 재전송: 800ms * 2 = 1.6s

네 번째 재전송: 1.6s * 2 = 3.2s
다섯 번째 재전송: 3.2s * 2 = 6.4s
여섯 번째 재전송: 6.4s * 2 = 12.8s
일곱 번째 재전송: 12.8s * 2 = 25.6s
여덟 번째 재전송: 25.6s * 2 = 51.2s
따라서, 8번의 재전송을 모두 완료하는 데는 총 102.4초가 소요됩니다.

결론적으로 네트워크 문제가 발생시 약 15분 정도 만에 연결이 끊어집니다.
이러한 방식은 네트워크의 혼잡성을 고려하여 효율적인 네트워크 사용을 돕습니다. 그러나 이 값은 네트워크 상태와 트래픽에 따라 크게 달라질 수 있습니다.

tcp 파라메터에 대한 linux kernel org 설명

tcp파라메터인 tcp_retries1과 tcp_retries2에 대한 리눅스 커널 사이트에서는 아래와 같이 설명하고 있습니다.

tcp 파라메터에 대한 설명 linux kernel org 설명 kernel.org/doc/Documentation/networking/ip-sysctl.txt
tcp_retries1 - INTEGER
This value influences the time, after which TCP decides, that
something is wrong due to unacknowledged RTO retransmissions,
and reports this suspicion to the network layer.
See tcp_retries2 for more details.

RFC 1122 recommends at least 3 retransmissions, which is the
default.

tcp_retries2 - INTEGER
This value influences the timeout of an alive TCP connection,
when RTO retransmissions remain unacknowledged.
Given a value of N, a hypothetical TCP connection following
exponential backoff with an initial RTO of TCP_RTO_MIN would
retransmit N times before killing the connection at the (N+1)th RTO.

The default value of 15 yields a hypothetical timeout of 924.6
seconds and is a lower bound for the effective timeout.
TCP will effectively time out at the first RTO which exceeds the
hypothetical timeout.

RFC 1122 recommends at least 100 seconds for the timeout,
which corresponds to a value of at least 8.

tcp man page 설명

리눅스 manpage에는 아래와 같이 설명되어 tcp_retries1과 tcp_retries2의 default값과 함께 설명을 하고 있습니다.

tcp_retries1 (integer; default: 3; since Linux 2.2)
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.

tcp_retries2 (integer; default: 15; since Linux 2.2)
The maximum number of times a TCP packet is retransmitted in established state before giving up. The default value is 15, which corresponds to a duration of approximately between 13 to 30 minutes, depending on the retransmission timeout. The RFC 1122 specified minimum limit of 100 seconds is typically deemed too short.

RFC 1122에 기술된 tcp_retries1과 tcp_retries1에 대해서

RFC에는 tcp_retries1과 tcp_retries2에 대해서 정의하고 있는데, 아래의 RFC 문서를 참고하시면 됩니다.

내용은 이전 내용과 같고, tcp_retries1과 tcp_retries2라는 내용만 없을 뿐, 한 개의 값은 RTO 시간 후의 재전송 횟수를 나타내며, 다른 한 개의 값은 이 재전송이 끝난 후 연결을 끊기 까지 지수 백오프로 재전송하는 값을 나타내는 변수라는 것을 정의하고 있습니다.

참고: RFC 1122: Requirements for Internet Hosts - Communication Layers (rfc-editor.org)

facebook twitter kakaoTalk kakaostory naver band shareLink