Loss evidence vs reaction

TCP 손실 처리는 “무엇을 증거로 보나”와 “어떻게 줄이나”를 분리한다

중복 ACK, SACK 블록, RTO, RACK/TLP는 손실을 추정하는 서로 다른 증거다. Fast Retransmit, SACK recovery, RTO recovery는 그 증거를 받은 송신자가 cwnd와 재전송을 조정하는 반응이다.

감지 신호에서 재전송 선택까지의 판단 단계

신호 수집 손실 추정 복구 선택 혼잡 반응
1 감지 신호 수집

dup ACK, SACK/DSACK, ACK 간격, 타이머, 송신 시각을 함께 본다. 패킷 캡처만으로 cwnd를 직접 알 수는 없다.

2 재정렬 가능성 보류

dup ACK는 gap 신호지만 손실 확정은 아니다. 경로 재정렬, ACK 손실, 지연도 같은 모양을 만들 수 있다.

3 손실로 표시

Reno는 3 dup ACK, SACK recovery는 scoreboard, RACK은 시간 증거로 어떤 sequence를 재전송할지 고른다.

4 혼잡 반응 적용

ACK clock이 살아 있으면 Fast Recovery로 복구하고, RTO면 더 보수적으로 cwnd를 loss window로 낮춘다.

S1만 빠지고 S2-S4가 도착한 경우: 중복 ACK와 SACK이 같이 보인다

Sender flight Receiver view S1 lost or late S2 S3 S4 SACK block: S2-S4 arrived ACK=S1 + SACK resend S1 ACK+
send S1 S2 S3 S4

송신자는 여러 세그먼트를 flight 상태로 네트워크에 보낸다.

loss S1 missing

S1이 손실되거나 크게 지연되고, 뒤 세그먼트가 먼저 도착한다.

receiver ACK=S1 반복

수신자는 아직 S1을 기다리므로 누적 ACK 번호를 전진시키지 못한다.

SACK blocks=S2-S4

SACK 옵션은 이미 도착한 뒤 블록을 알려 재전송 범위를 좁힌다.

recover retransmit S1

송신자는 ACK clock을 유지한 채 빠진 구간부터 재전송한다.

advance cumulative ACK

S1이 도착하면 누적 ACK가 한 번에 S4 뒤까지 전진할 수 있다.

3 duplicate ACKs gap 뒤 데이터 도착, ACK clock 유지 Reno 계열 Fast Retransmit Fast Recovery로 보수 조정 재정렬과 구분 필요
SACK scoreboard 도착 블록과 빈 byte range 기록 pipe 추정으로 재전송 범위 축소 빠진 블록을 순서대로 메움 SACK 협상과 정보 품질 의존
RTO expiry 타이머 안에 ACK가 돌아오지 않음 가장 오래된 미확인 데이터 재전송 slow start와 backoff 진입 재전송 RTT 샘플은 모호함
RACK / TLP 송신 시간과 후속 ACK 시간 증거 tail probe로 ACK 피드백 유도 불필요한 timeout 진입 감소 reordering window 필요
packet view

패킷 캡처에서 보이는 것

dup ACK, SACK/DSACK 블록, 재전송 시점, ACK 간격은 보인다. 하지만 송신자 내부 cwnd, ssthresh, 실제 RTO 값은 패킷에 직접 실리지 않는다.

kernel view

송신자 상태가 필요할 때

ss -ti, tcp_info, eBPF tracepoint처럼 커널 상태를 보는 도구가 있어야 cwnd, rtt, rto, retrans, delivery rate를 더 정확히 확인한다.

scope

Reno 규칙을 모든 TCP에 일반화하지 않는다

CUBIC, BBR, OS별 SACK/RACK 구현은 세부 반응이 다르다. 본 그림은 학습용 기준 흐름과 현대 구현에서 추가되는 증거를 함께 보여준다.

진단 기준

손실 추정과 혼잡 제어 반응을 한 문장으로 섞지 않는다. dup ACK는 gap의 증거, SACK은 도착 블록의 증거, RTO는 ACK가 돌아오지 않은 시간의 증거, RACK/TLP는 송신 시각과 tail loss의 증거다. 그 다음에 송신자는 Fast Recovery, SACK recovery, RTO recovery 중 현재 ACK clock과 구현에 맞는 경로를 선택한다.