TCP 재전송 모호성 (Retransmission Ambiguity)

agnusdei·2025년 12월 12일

🛑 TCP 재전송 모호성 (Retransmission Ambiguity)

TCP 재전송 모호성이란, 송신자가 재전송을 수행한 후 ACK(응답)를 받았을 때, 이 ACK가 '최초 전송'에 대한 응답인지, '재전송'에 대한 응답인지 구분하지 못하는 현상을 말합니다.

이 현상은 수신자가 아닌, 송신자의 RTT(Round Trip Time) 측정과 RTO(Retransmission Timeout) 설정에 치명적인 오류를 일으킵니다.

1. 문제의 원인: 동일한 순서 번호 (Sequence Number)

  • TCP의 설계: TCP는 신뢰성을 위해 패킷에 순서 번호(Seq)를 붙입니다. 패킷이 손실되어 재전송할 때, TCP는 최초 패킷과 동일한 순서 번호를 붙여서 다시 보냅니다.
  • 수신자의 동작: 수신자는 Seq 100이 들어오면 그냥 ACK 100을 보냅니다. 패킷 안에는 "이게 몇 번째 시도인지"를 알려주는 별도의 ID가 없습니다.

2. 왜 '송신자'만의 문제인가? (핵심 분석)

질문자님께서 지적해주신 대로, 수신자와 송신자의 입장은 완전히 다릅니다.

🕵️ 수신자 (Receiver) 입장: "난 아무 문제 없어"

수신자의 역할은 단순합니다. 데이터의 무결성과 순서만 맞추면 됩니다.

  • 상황: Seq 100이 오면 받습니다. 만약 네트워크 지연으로 인해 먼저 보낸 Seq 100과 재전송된 Seq 100이 둘 다 도착하더라도, 수신자는 "어? 중복이네?" 하고 하나를 버리면 그만입니다.
  • 결론: 수신자는 RTT를 잴 필요가 없으므로, 이 모호성으로 인해 곤란할 일이 전혀 없습니다.

🤯 송신자 (Sender) 입장: "스톱워치를 언제 눌러야 해?"

송신자는 네트워크의 혼잡 상황을 판단하기 위해 RTT(왕복 시간)를 정밀하게 측정해야 하는 의무가 있습니다.

  1. 1시 00분: 패킷 A 발송 (스톱워치 시작)
  2. (타임아웃 발생)
  3. 1시 05분: 패킷 A' 재전송 (동일한 Seq 번호)
  4. 1시 06분: ACK 도착

여기서 송신자는 멘붕(Dilemma)에 빠집니다.

  • 가설 1: 이 ACK가 1시 00분에 보낸 것의 응답이라면? \rightarrow RTT는 6분.
  • 가설 2: 이 ACK가 1시 05분에 보낸 것의 응답이라면? \rightarrow RTT는 1분.

송신자는 이 둘 중 무엇이 정답인지 알 수 없기 때문에, 다음번 타임아웃(RTO)을 6분으로 잡아야 할지 1분으로 잡아야 할지 결정할 수 없게 됩니다.

3. 잘못된 판단의 치명적 결과

송신자가 잘못 찍어서 RTT를 계산하면 다음과 같은 문제가 발생합니다.

시나리오송신자의 착각결과 (문제점)
실제 RTT가 긴 경우"아, 이거 방금 재전송한 거에 대한 응답이구나!" (RTT를 짧게 계산)불필요한 재전송 (Spurious Retransmission): RTO를 너무 짧게 설정하여, 패킷이 아직 가고 있는데도 성급하게 재전송을 남발합니다. 네트워크 혼잡을 가중시킵니다.
실제 RTT가 짧은 경우"아, 이거 아까 보낸 거에 대한 응답이구나!" (RTT를 길게 계산)대응 느림: RTO를 너무 길게 설정하여, 진짜 패킷 손실이 발생했을 때 재전송까지 한참을 기다리게 됩니다. 전송 속도가 저하됩니다.

4. 비유를 통한 요약 (쇼핑몰 vs 고객)

이 상황을 가장 잘 설명하는 비유입니다.

  • 송신자 (쇼핑몰) / 수신자 (고객)
  • 쇼핑몰이 물건을 보냈는데 소식이 없어 하나 더 보냈습니다.
  • 다음 날 고객이 "물건 잘 받았습니다"라고 연락했습니다.

고객(수신자)은 행복합니다. 물건을 받았으니까요. 이게 첫 번째로 보낸 건지 두 번째로 보낸 건지 몰라도 사용하는 데는 지장이 없습니다.

쇼핑몰(송신자)은 혼란스럽습니다. "이게 처음에 보낸 게 8일 걸려 도착한 건가? 아니면 두 번째 보낸 게 하루 만에 간 건가? 앞으로 배송 기간 안내를 '8일 소요'로 해야 해, '1일 소요'로 해야 해?"

5. 해결책: TCP vs QUIC

이 문제를 해결하기 위해 프로토콜들은 서로 다른 접근 방식을 취합니다.

  • TCP의 해결책 (Karn 알고리즘 & 타임스탬프):
    • Karn 알고리즘: "재전송한 패킷에 대한 ACK는 믿지 말자." (재전송 발생 시 RTT 측정을 포기함)
    • TCP 타임스탬프: 패킷에 보낸 시간을 적어서, 돌아온 ACK에 적힌 시간을 보고 구분함. (헤더가 커지는 단점)
  • QUIC(HTTP/3)의 해결책:
    • Packet Number 분리: 재전송을 하더라도 내용물(Payload)은 같지만 패킷 번호(Packet Number)는 무조건 1씩 증가시킵니다.
    • 따라서 ACK 100이 오면 원본, ACK 200이 오면 재전송임을 명확히 구분합니다. 이것이 QUIC이 TCP보다 혼잡 제어가 뛰어난 결정적인 이유 중 하나입니다.

0개의 댓글