idea·blog
웹 도구네트워크 미니랩 · 4/5

네트워크 미니랩 4/5 · 패킷이 사라지면 어떻게 복구할까?

네트워크 미니랩 네 번째. 데이터 조각이나 ACK이 사라졌을 때 TCP가 기다리고 다시 보내는 복구 과정을 살펴봅니다.

2026.07.17· 수정 2026.07.27작성 idea-blog 운영자· 약 3
네트워크 미니랩 4/5 · 패킷이 사라지면 어떻게 복구할까? 스크린샷

인터넷에서 패킷은 정말로 사라집니다. 그런데도 내려받은 파일은 한 바이트도 깨지지 않습니다. 비결은 택배와 같습니다.

상자마다 수령 문자를 기다리고, 문자가 안 오면 그 상자만 다시 보낸다.

이 데모는 그 약속 하나만 보여줍니다.

세 가지 약속

  • 받은 범위를 알린다 — 서버는 "여기까지 받았어요"라는 확인 응답(ACK)을 보냅니다. 실제 TCP의 ACK은 다음에 기대하는 바이트 번호라 앞부분을 한꺼번에 확인할 수도 있습니다.
  • 답이 없으면 다시 보낸다 — 보낸 쪽은 아직 확인되지 않은 데이터를 위해 재전송 타이머를 관리합니다. 시간이 지나면 가장 앞의 미확인 조각부터 다시 보냅니다.
  • 번호로 중복을 거른다 — 답장이 사라져서 같은 조각이 두 번 도착해도, 받는 쪽은 번호를 보고 이미 받은 범위를 버립니다. 같은 바이트가 데이터 흐름에 두 번 반영되지 않습니다.

이때 쓰는 번호가 3-way handshake에서 교환한 그 번호입니다.

데모에서 해볼 일

시나리오를 하나 고르면 결과까지 다섯 장면만 보여줍니다.

  1. 손실 없음 — 보내고, 답 받고, 다음 조각. 기본 리듬입니다.
  2. 조각이 사라질 때 — ❌ 유실 → ⏰ 타임아웃 → 재전송.
  3. 답장이 사라질 때 — 서버가 번호로 중복을 걸러내는 순간.

실험 시작을 누르고, 화면 위의 현재 장면과 클라이언트 카드의 타이머만 눈여겨보세요. 기술 용어를 몰라도 흐름을 이해할 수 있습니다.

타이머를 기다리지 않는 더 빠른 길

타임아웃은 확실하지만 느립니다. 답이 없다는 걸 확인하려면 정해둔 시간을 그대로 흘려보내야 하기 때문입니다. 그래서 실제 TCP에는 지름길이 하나 더 있습니다.

2번 조각만 사라지고 3·4·5번이 계속 도착했다고 해봅시다. 받는 쪽은 그때마다 "아직 2번이 필요해요"라는 같은 ACK을 반복해서 보냅니다. 보낸 쪽이 이 중복 ACK을 세 번 받으면, 타이머가 끝나기를 기다리지 않고 곧바로 2번을 다시 보냅니다. 이것이 빠른 재전송입니다.

여기에 SACK을 쓰면 받는 쪽이 "2번은 아직인데 3~5번은 이미 받았어요"라고 구체적 으로 알려줄 수 있습니다. 그러면 보낸 쪽은 정말 빠진 조각만 골라 보냅니다. SACK이 없던 시절에는 뒷부분을 통째로 다시 보내는 낭비가 있었습니다.

손실은 속도로 나타납니다

여기서 중요한 점 하나. TCP에서 손실은 오류가 아니라 지연으로 드러납니다. 파일은 멀쩡히 다 받아지는데 이상하게 느린 상황의 흔한 원인입니다.

게다가 TCP는 손실을 "회선이 붐빈다"는 신호로 읽고 보내는 속도를 스스로 줄입니다 (혼잡 제어). 그래서 손실률이 조금만 올라가도 체감 속도는 그보다 크게 떨어집니다.

# 재전송이 실제로 얼마나 일어났는지 (리눅스)
netstat -s | grep -i retrans

# 특정 연결의 RTT와 재전송 횟수
ss -ti

ss -ti 출력의 rtt는 측정된 왕복 시간, retrans는 재전송 횟수입니다. 느리다는 느낌만으로 회선을 탓하기 전에 이 숫자를 먼저 보면 판단이 빨라집니다.

요약 세 가지

  • 받는 쪽은 ACK으로 어디까지 받았는지 알립니다.
  • 보낸 쪽은 답이 없으면 가장 앞의 미확인 조각부터 다시 보냅니다.
  • 같은 조각이 두 번 와도 번호로 걸러 중복 없이 이어 붙입니다.

참고

이해를 돕기 위해 조각 번호(1, 2)와 즉시 오는 ACK을 썼지만 실제 TCP는 바이트 단위의 누적 ACK을 사용하며 ACK을 잠시 늦춰 보낼 수도 있습니다. RTO는 측정한 왕복 시간을 바탕으로 계산하고, 만료되면 가장 오래 확인되지 않은 세그먼트를 재전송합니다. 위에서 설명한 빠른 재전송·SACK·혼잡 제어는 글에서만 다루고 데모 화면에는 넣지 않았습니다. 데모는 타임아웃 재전송 한 가지에 집중합니다.

그런데 빠짐없이 배달해도 내용을 도청당하면 소용없겠죠? 암호화된 연결이 만들어지는 과정은 TLS 핸드셰이크 랩에서 이어집니다.

자료: RFC 9293 (TCP) — Data Communication, RFC 6298 — Retransmission Timer, RFC 5681 — Fast Retransmit/Fast Recovery, RFC 2018 — TCP Selective Acknowledgment (SACK)


관련 글