TCP 재전송 모호성이란, 송신자가 재전송을 수행한 후 ACK(응답)를 받았을 때, 이 ACK가 '최초 전송'에 대한 응답인지, '재전송'에 대한 응답인지 구분하지 못하는 현상을 말합니다.
이 현상은 수신자가 아닌, 송신자의 RTT(Round Trip Time) 측정과 RTO(Retransmission Timeout) 설정에 치명적인 오류를 일으킵니다.
Seq 100이 들어오면 그냥 ACK 100을 보냅니다. 패킷 안에는 "이게 몇 번째 시도인지"를 알려주는 별도의 ID가 없습니다.질문자님께서 지적해주신 대로, 수신자와 송신자의 입장은 완전히 다릅니다.
수신자의 역할은 단순합니다. 데이터의 무결성과 순서만 맞추면 됩니다.
Seq 100이 오면 받습니다. 만약 네트워크 지연으로 인해 먼저 보낸 Seq 100과 재전송된 Seq 100이 둘 다 도착하더라도, 수신자는 "어? 중복이네?" 하고 하나를 버리면 그만입니다.송신자는 네트워크의 혼잡 상황을 판단하기 위해 RTT(왕복 시간)를 정밀하게 측정해야 하는 의무가 있습니다.
ACK 도착여기서 송신자는 멘붕(Dilemma)에 빠집니다.
송신자는 이 둘 중 무엇이 정답인지 알 수 없기 때문에, 다음번 타임아웃(RTO)을 6분으로 잡아야 할지 1분으로 잡아야 할지 결정할 수 없게 됩니다.
송신자가 잘못 찍어서 RTT를 계산하면 다음과 같은 문제가 발생합니다.
| 시나리오 | 송신자의 착각 | 결과 (문제점) |
|---|---|---|
| 실제 RTT가 긴 경우 | "아, 이거 방금 재전송한 거에 대한 응답이구나!" (RTT를 짧게 계산) | 불필요한 재전송 (Spurious Retransmission): RTO를 너무 짧게 설정하여, 패킷이 아직 가고 있는데도 성급하게 재전송을 남발합니다. 네트워크 혼잡을 가중시킵니다. |
| 실제 RTT가 짧은 경우 | "아, 이거 아까 보낸 거에 대한 응답이구나!" (RTT를 길게 계산) | 대응 느림: RTO를 너무 길게 설정하여, 진짜 패킷 손실이 발생했을 때 재전송까지 한참을 기다리게 됩니다. 전송 속도가 저하됩니다. |
이 상황을 가장 잘 설명하는 비유입니다.
고객(수신자)은 행복합니다. 물건을 받았으니까요. 이게 첫 번째로 보낸 건지 두 번째로 보낸 건지 몰라도 사용하는 데는 지장이 없습니다.
쇼핑몰(송신자)은 혼란스럽습니다. "이게 처음에 보낸 게 8일 걸려 도착한 건가? 아니면 두 번째 보낸 게 하루 만에 간 건가? 앞으로 배송 기간 안내를 '8일 소요'로 해야 해, '1일 소요'로 해야 해?"
이 문제를 해결하기 위해 프로토콜들은 서로 다른 접근 방식을 취합니다.
ACK 100이 오면 원본, ACK 200이 오면 재전송임을 명확히 구분합니다. 이것이 QUIC이 TCP보다 혼잡 제어가 뛰어난 결정적인 이유 중 하나입니다.