핵심 인사이트 (3줄 요약)
- 본질: TCP 헤더에 있는 확인응답번호(Acknowledgment Number) 필드는, 내가 상대방으로부터 데이터를 무사히 받았다는 영수증 도장 역할을 하며, 특이하게도 "나 100번 잘 받았어!"가 아니라 "나 100번까지 완벽하게 받았으니까, 다음번엔 101번부터 던져주렴!"이라고 다음 받을 번호를 콕 집어 요구(Expectation)하는 진취적인 성격을 지닌다.
- 누적 ACK (Cumulative ACK): TCP는 데이터가 도착할 때마다 일일이 영수증을 써주지 않는다. 1, 2, 3번이 연속으로 오면 3번까지 묶어서 퉁치고 "4번 줘(ACK=4)"라고 한 장의 영수증만 끊어주어 대역폭 낭비를 극단적으로 줄인다.
- 이빨 빠짐의 비극: 1, 2, 4번 패킷이 왔다. 3번이 바다에 빠졌다. 수신자는 4번을 받았음에도 불구하고 억하심정으로 **"아 몰라 나 3번 못 받았으니까 3번 내놔! (ACK=3)"**라고 징징대는 영수증만 계속 반복해서 쏘아 보내며(Duplicate ACK), 결국 송신자가 3번을 재전송하게 만든다.
Ⅰ. 개요 및 필요성 (Context & Necessity)
-
개념: 수신 측에서 송신 측으로부터 패킷을 에러 없이 잘 받았음을 보장하기 위해 보내는 32비트짜리 확인 응답 필드. 항상 TCP 제어 플래그 중
ACK비트가 1로 켜져 있을 때만 이 필드의 숫자가 유효하다. -
필요성: 무전기를 생각해보자. 내가 "침투해!"라고 말하고 끝내면, 부하가 내 말을 들었는지 딴청 피우다 못 들었는지 알 길이 없다. 무전기는 찌그러지기 쉬운 무선망이기 때문이다. 그래서 부하가 "침투해라고 잘 들었습니다. 완료(오버)!"라고 **영수증(ACK)**을 쳐줘야만 나는 안심하고 다음 작전 명령을 쏠 수 있다. 이처럼 무법천지 인터넷(IP) 망에서 데이터가 확실하게 목적지에 꽂혔음을 보장하는 가장 근본적이고 절대적인 안전벨트다.
-
💡 비유: ACK 번호는 택배 배달의 **"이어 받기 쿠폰"**과 같습니다.
- 전집 100권 중 오늘 1권부터 10권까지 무사히 배송을 받았습니다.
- 나는 우체부 아저씨 패드에 사인을 하면서 **"자, 10권까지 잘 받았고 파본 없으니, 내일은 11권부터 가져오쇼! (ACK Number = 11)"**라고 다음번 배송 시작점을 딱 찍어서 영수증을 써줍니다.
- 내일 우체부 아저씨는 내 영수증을 보고 고민 없이 창고에서 11권부터 싣고 출발합니다.
📢 섹션 요약 비유: TCP의 누적 ACK(Cumulative ACK)는 식당의 **"최종 결제 계산서"**입니다. 삼겹살, 소주, 볶음밥을 시킬 때마다 카드를 긁지 않고(개별 ACK 낭비), 다 먹고 나갈 때 한 방에 퉁쳐서 "볶음밥(마지막 패킷)까지 다 먹었으니 5만 원 결제해(누적 ACK)!"라고 쿨하게 승인하는 고도의 효율성입니다.
Ⅱ. 누적 ACK의 메커니즘과 중복 ACK(Dup-ACK) 트러블슈팅 (Deep Dive)
1. 바이트(Byte) 단위의 "다음 번호" 요구
앞 장에서 배운 시퀀스 넘버(Seq)와 영혼의 파트너로 움직인다.
- 송신자가
Seq = 1000번부터100 바이트짜리 알맹이를 보냈다. (즉, 1000 ~ 1099번 바이트가 날아감). - 수신자가 이걸 1바이트도 안 깨지고 다 받았다!
- 수신자는 답장 헤더에 **
ACK Number = 1100**이라고 딱 적어서 쏜다. - 의미: "나 1099번 바이트까지 기가 막히게 다 받았다. 이제 다음번엔 1100번 바이트부터 보내주면 된다!"
2. 치명적인 이빨 빠짐 (중복 ACK의 징징거림)
송신자가 1, 2, 3, 4, 5번 상자(각 100바이트)를 쏟아부었다.
그런데 3번 상자(Seq 300)가 라우터 큐 오버플로우(Drop)로 사라졌다! 수신자의 램(버퍼)에는 1, 2, _, 4, 5가 들어왔다. 수신자는 어떻게 행동할까?
- 1, 2번 상자 수신 완료 ──▶
ACK = 300(오케이 300번 상자 줘!) - 3번 상자(Seq 300) 증발함.
- 4번 상자(Seq 400) 도착!
- 수신자 뇌구조: "야 4번 상자 먼저 왔네? 근데 난 아직 3번 못 받았다고!! 난 3번 안 주면 뒤에 거 인정 안 해!!"
- 수신자는 4번을 받았지만 억지로 무시하고, 또다시
ACK = 300(300번 내놓으라고!!)을 쏜다.
- 5번 상자(Seq 500) 도착!
- 수신자는 개빡쳐서 또다시
ACK = 300(아 300번 달라고 미친놈아!!)을 쏜다.
- 수신자는 개빡쳐서 또다시
- 송신자 뇌구조: "어? 저쪽에서 똑같은 영수증(
ACK=300)이 3번 연속으로 날아오네 (3 Duplicate ACKs). 이거 백퍼 3번 상자 가다가 터진 거네! 타이머 다 되기 전이지만 당장 3번 상자 복사해서 긴급 재전송 때려라! (Fast Retransmit)"
┌─────────────────────────────────────────────────────────────┐
│ TCP 빠른 재전송 (Fast Retransmit) 시나리오 │
├─────────────────────────────────────────────────────────────┤
│ │
│ [ 송신자 ] [ 수신자 ] │
│ 패킷 1 (Seq 100) ───────────────▶ 잘 받음! │
│ 패킷 2 (Seq 200) ───────────────▶ 잘 받음! │
│ 패킷 3 (Seq 300) ───(가다 터짐 Drop) │
│ │
│ 패킷 4 (Seq 400) ───────────────▶ "어 3번 내놔!" (ACK 300) │
│ 패킷 5 (Seq 500) ───────────────▶ "아 3번 달라고!" (ACK 300)│
│ 패킷 6 (Seq 600) ───────────────▶ "3번!! 3번!!" (ACK 300) │
│ │
│ 송신자: "헐 ACK 300이 중복(Dup)으로 3번이나 날아왔네! 3번 유실 확정!"│
│ 송신자 ── (타이머 무시하고 패킷 3번 긴급 재전송 빵!!) ──▶ 수신자 쾌재.│
└─────────────────────────────────────────────────────────────┘
3. 현대적 보완: SACK (Selective ACK)
누적 ACK의 멍청한 점은, 위 상황에서 3번만 유실됐는데 송신자가 빡쳐서 3번부터 6번까지 멀쩡히 잘 간 것들까지 싹 다 몽땅 다시 재전송해 버린다는 거다. 엄청난 대역폭 낭비다.
- 그래서 윈도우/리눅스는
SACK(선택적 확인 응답)옵션을 기본으로 켠다. - 수신자 왈: "야! 메인 영수증은
ACK=300인데, 나 뒤에400~600번은 잘 받았으니까 진짜 잃어버린 300번 딱 한 놈만 핀셋으로 집어서 다시 보내라!" - 이 SACK 마법 덕분에 현대 기가비트 인터넷은 재전송 폭풍에 휘말리지 않고 극강의 쾌적함을 유지한다.
📢 섹션 요약 비유: 중복 ACK 발송과 빠른 재전송은 택배 회사 **"진상 고객의 연속 클레임"**과 같습니다. 배송이 누락된 순간 고객이 고객센터에 전화를 걸어 3번 연속으로 "내 물건 어디 갔냐!"고 진상을 부리면(Dup-ACK), 본사가 배송 마감 시간(Timeout)까지 기다리지 않고 즉각 VIP 퀵 서비스(Fast Retransmit)로 누락된 물건을 당장 꽂아주는 위기 탈출 매뉴얼입니다.