씨유
← 목차로
인프라

TCP 에러 복구 살펴보기

2023.11.09·2분 읽기·이동규

안정적으로 보이는 TCP 연결도 패킷 손실, 지연, 순서 뒤바뀜을 끊임없이 마주합니다. 우리가 신뢰할 수 있는 스트림을 얻는 건 그 아래에서 벌어지는 정교한 복구 메커니즘 덕분이에요.

재전송의 두 가지 트리거

TCP는 손실을 두 가지 방식으로 감지합니다. 하나는 타임아웃(RTO), 다른 하나는 중복 ACK를 통한 빠른 재전송(Fast Retransmit)입니다. 전자는 보수적이고 느리며, 후자는 공격적이고 빠릅니다.

세 개의 중복 ACK를 받으면, TCP는 타임아웃을 기다리지 않고 즉시 해당 세그먼트를 재전송합니다.

RTO는 어떻게 계산되나

RTO는 고정값이 아니라 관측된 왕복 시간(RTT)을 기반으로 끊임없이 추정됩니다.

// Jacobson/Karels RTO 추정
SRTT   = (1 - a) * SRTT   + a * R        // a = 1/8
RTTVAR = (1 - b) * RTTVAR + b * abs(SRTT - R)
RTO    = SRTT + 4 * RTTVAR               // 최소 1초로 클램프

추정된 RTO 안에 ACK가 도착하지 않으면 세그먼트는 손실로 간주되고, RTO는 지수적으로 두 배씩 늘어납니다.

실전에서 확인하기

실제 트래픽에서 재전송을 관찰하려면 tcpdump로 캡처한 뒤 흐름을 따라가면 됩니다.

# 특정 호스트의 재전송만 필터링
tcpdump -i eth0 'tcp[tcpflags] & tcp-push != 0' \
  -n host 10.0.1.42

재전송 비율이 1%를 넘기 시작하면 대개 네트워크 경로나 수신 측 버퍼에 병목이 있다는 신호입니다.

정리

TCP의 신뢰성은 마법이 아니라 관측·추정·재전송의 반복입니다.

함께 읽으면 좋은 글