핵심 인사이트 (3줄 요약)

  1. 본질: 불필요한 재전송(Spurious Retransmission)은 패킷이 중간에 유실되거나 죽지 않고 멀쩡히 살아서 가고 있는데도, 단지 차가 좀 막혀서 늦게 도착(지연)했다는 이유만으로 송신자가 성급하게 "죽었네!" 착각하고 똑같은 패킷을 쓸데없이 두 번 쏘아버리는 대역폭 낭비 현상이다.
  2. 치명적인 나비효과: 단순히 패킷 하나를 낭비하는 데 그치지 않는다. 송신자(TCP)는 타임아웃이 났다고 착각하므로, 멀쩡한 고속도로에서 갑자기 자기 혼자 쫄아서 **속도(CWND)를 1로 확 깎아버리고 슬로우 스타트의 바닥으로 곤두박질치는 치명적인 스피드 저하(거짓 혼잡 제어 발동)**를 일으킨다.
  3. F-RTO와 D-SACK (해결사들): 이 억울함을 막기 위해, 수신자가 "야! 나 아까 네가 보낸 패킷 이미 받았는데, 네가 방금 헛발질로 한 번 더(중복) 보냈더라!"라고 친절하게 알려주는 D-SACK(Duplicate SACK) 옵션과, 송신자가 헛발질을 눈치채면 바닥으로 떨어뜨렸던 속도를 1초 만에 롤백(원상복구)시켜주는 F-RTO 같은 현대 방어 기술들이 투입되었다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

  • 개념: 실제로는 패킷이나 ACK가 유실되지 않았으나, RTT 지연, 재경로 설정(Re-routing) 등의 이유로 RTO 타이머가 먼저 만료되거나 순서가 뒤집혀, 송신 측이 오판하여 동일한 패킷을 불필요하게 재전송하는 현상.

  • 필요성: 모바일 시대가 오면서 내가 지하철 와이파이에서 LTE로 망을 휙휙 갈아타는 일(Handover)이 잦아졌다. 폰이 기지국을 갈아타는 1초의 틈 동안 패킷이 안 죽고 잠깐 버퍼에 갇혀(지연) 있었다. 1.1초 뒤에 무사히 통과했는데, 송신자(유튜브 서버)는 타이머가 1초에 맞춰져 있어서 "어? 죽었네! 재전송 빵! 속도(CWND) 1로 떡락!" 해버렸다. "아니! 패킷이 안 죽고 살아서 잘 갔는데, 단지 0.1초 늦게 영수증이 도착했다고 내 스피드를 바닥으로 깎아버리는 게 말이 돼? 내가 헛발질(Spurious)한 걸 눈치챘으면, 깎았던 속도를 다시 원상 복구 시켜주는 알고리즘이 필요해!!"

  • 💡 비유: 불필요한 재전송은 식당에서의 **"음식 중복 주문 대참사"**와 같습니다.

    • 내가 김치찌개를 시켰는데 15분(RTO)이 지나도 안 나옵니다.
    • 빡쳐서 "아줌마! 아까 시킨 김치찌개 취소된 거 아니에요? 다시 주문 넣어주세요!(재전송)"라고 소리칩니다.
    • 그런데 1분 뒤, 주방에서 이미 끓여둔 **첫 번째 김치찌개(지연된 원본)**가 나옵니다.
    • 그리고 10분 뒤, 내가 아까 빡쳐서 다시 주문한 **두 번째 김치찌개(불필요한 재전송)**마저 나와버립니다. 나는 내 배(대역폭)를 채울 수도 없는 김치찌개 두 그릇 값을 내는 멍청한 짓을 한 것입니다.

📢 섹션 요약 비유: Spurious Retransmission은 상대방이 카톡을 못 본 게 아니라 단지 회의 중이라 답장을 "늦게(Delay)" 하는 것뿐인데, 혼자 "차단당했네!"라고 오해(Timeout)하여 구질구질하게 문자를 한 번 더 보내는 흑역사와 같습니다. 이 착각 때문에 우리 사이(통신 속도)는 회복 불가(CWND=1)로 곤두박질칩니다.


Ⅱ. D-SACK과 오해의 롤백(Undo) 메커니즘 (Deep Dive)

1. 오판의 결과: 속도 박살 (False Congestion Avoidance)

TCP의 가장 뼈아픈 약점이다.

  • 송신자는 타임아웃이 터지자마자, 이게 진짜 길이 꽉 막혀서 터진 건지, 아니면 와이파이가 잠깐 끊겨서 지연된 건지 절대 알 도리가 없다.
  • 그래서 무조건 ssthresh를 절반으로 깎고, CWND를 1로 박살 낸다(슬로우 스타트).
  • 만약 모바일 5G 환경에서 지연(Jitter)이 심하면, 패킷 유실이 0%인데도 속도는 맨날 바닥을 기어 다니는 황당한 현상이 벌어진다.

2. 수신자의 팩폭: D-SACK (Duplicate SACK)

"야 송신자야, 네가 아까 보낸 1번 택배 분명히 어제 잘 도착했거든? 근데 네가 오늘 아침에 1번 택배를 한 번 더(재전송) 보냈더라?" 이 사실을 송신자에게 친절하게 알려주기 위해, SACK 확장 헤더를 개조한 **D-SACK(RFC 2883)**이 도입되었다.

  • 수신자는 잉여 패킷(두 번째 도착한 1번 택배)을 버리면서, 영수증(ACK) 꼬리표에 **"나 1번 택배 중복(Duplicate)으로 받았어 멍청아!"**라고 콕 집어 적어 보낸다.
 ┌─────────────────────────────────────────────────────────────┐
 │                D-SACK에 의한 송신자의 오판 회복(Undo) 과정          │
 ├─────────────────────────────────────────────────────────────┤
 │                                                             │
 │   [ 송신자 (유튜브) ]                            [ 수신자 (스마트폰) ]│
 │   1번 패킷 발사! ────────(기지국 전환으로 버퍼에 갇힘)──────▶  │
 │                                                             │
 │   (타임아웃 발생! 아 죽었네! 속도 CWND 1로 박살 냄!)               │
 │   1번 패킷 재전송! ────────(빛의 속도로 날아감)────────▶     │
 │                                                             │
 │   * 스마트폰 상황: "아까 갇혀있던 원본 1번도 오고, 재전송 1번도 오네?"  │
 │   * 스마트폰 ── "야, 나 1번 중복으로 2개 받았어!(D-SACK)" ──▶ │
 │                                                             │
 │   * 송신자의 뇌구조 (롤백 발동!):                               │
 │     "헐! 내가 아까 친 타임아웃은 패킷이 죽은 게 아니라, 내가 성급하게 │
 │      헛발질(Spurious)한 거였구나!! 미안 미안, 아까 CWND 1로     │
 │      박살 냈던 거 없던 일(Undo)로 하고 원래 속도로 다시 돌려놓을게!!"│
 └─────────────────────────────────────────────────────────────┘

3. F-RTO (Forward RTO-Recovery)

D-SACK은 영수증이 올 때까지 기다려야 아는 거지만, F-RTO는 한술 더 뜬 방어책이다.

  • 타임아웃이 나서 재전송을 딱 1개 갈겨본다.
  • 그런데 연달아 날아오는 다음 영수증들을 보니까 "어라? 상대방이 2번, 3번 영수증을 정상적으로 부르네?"
  • "아! 타임아웃 난 게 진짜 혼잡이 터진 게 아니라, 방금 잠깐 스파크가 튀어서 지연된 거였구나!"
  • 즉시 바닥으로 깎았던 CWND를 원래대로 휙 돌려버린다. 이 기능 덕분에 스마트폰이 와이파이를 갈아타도 유튜브가 거의 안 끊긴다.

📢 섹션 요약 비유: 불필요한 재전송의 롤백(Undo) 알고리즘은 오해로 헤어질 뻔한 연인들의 **"빠른 사과와 화해"**입니다. "네가 안 읽씹 한 줄 알고 화내서(CWND=1) 미안해. 핸드폰이 꺼졌던 거였구나(지연). 화낸 거 다 취소(Undo)하고 우리 다시 예전처럼 지내자!"라며 재빠르게 원상 복구하는 훈훈한 결말입니다.