04 · 사라진 데이터 다시 보내기

받았다는 답이 없으면 다시 보냅니다.

택배 수령 확인이 오지 않으면 같은 상자를 다시 보내는 것과 비슷합니다. 데이터나 답장이 사라졌을 때 복구되는 흐름만 따라가 보세요.

이것만 기억하세요받았다는 답이 없으면
다시 보낸다

아래 파란 버튼만 누르세요

사라진 뒤 다시 도착하는 5장면

시나리오
  1. 1조각 보내기
  2. 2조각 유실
  3. 3답 없음
  4. 4다시 보내기
  5. 5복구 완료
준비
‘조각이 사라질 때’ 실험을 시작할 준비가 됐어요

아래 ‘실험 시작’을 누르면 지금 무슨 일이 생겼는지 한 장면씩 보여드려요.

대기 중
내 컴퓨터192.168.0.10
조각 1대기조각 2대기
타이머 꺼짐
Redis 서버192.168.0.20 : 6379
?아직?아직
번호로 중복을 걸러요
시나리오: 조각이 사라질 때보내기 시작을 누르면 데이터 두 조각이 어떤 일을 겪는지 한 단계씩 보여드려요. 시나리오를 바꿔가며 비교해 보세요.

약속 세 가지만

패킷이 사라져도 데이터가 완성되는 이유

01받은 범위를 알려줘요.

서버는 “여기까지 받았다”고 ACK으로 알려줘요. 실제 TCP에서는 여러 바이트를 한 번의 누적 ACK으로 확인할 수도 있어요.

02답이 없으면 다시 보내요.

보낸 쪽은 아직 확인되지 않은 데이터를 위해 타이머를 관리해요. 시간이 지나면 가장 앞의 미확인 조각부터 다시 보내요.

03번호로 중복을 빼요.

답장이 사라져서 같은 조각이 두 번 도착해도, 받는 쪽은 번호를 보고 이미 받은 범위를 알아봐요. 같은 바이트를 받은 데이터에 두 번 넣지 않아요.

보내고 타이머 켜기ACK 기다리기안 오면 재전송빠짐없이 완성
규격 기반 시뮬레이션입니다.

이 페이지는 실제 패킷 캡처가 아니라 TCP의 확인 응답과 재전송 원리를 따라 만든 교육용 시뮬레이션입니다. 이해를 돕기 위해 조각 번호(1, 2)를 썼지만 실제 TCP는 바이트 단위의 누적 ACK을 쓰며 ACK을 잠시 늦춰 보낼 수도 있습니다. RTO는 왕복 시간을 바탕으로 계산하고, 만료되면 가장 오래 확인되지 않은 세그먼트를 재전송합니다. 빠른 재전송, 선택적 확인(SACK), 혼잡 제어는 다루지 않습니다.

참고: RFC 9293 (TCP) · RFC 6298 (Retransmission Timer)

이 데모에 대하여

같은 데이터를 세 가지 상황에서 보냅니다

조각 두 개를 보내는 같은 작업을 손실 없음 · 조각 유실 · 답장 유실 세 가지 상황으로 각각 만들어 두고 비교합니다. 단계 수가 8 · 11 · 12 로 다른데, 그 차이가 곧 손실을 복구하는 데 드는 비용입니다. 조각이 사라지든 답장이 사라지든 데이터는 결국 도착하지만, 거기까지 가는 데 필요한 왕복 수가 달라집니다. 무엇이 사라졌는지에 따라 대응이 달라지고, 특히 답장이 사라진 경우에는 보낸 쪽이 상황을 잘못 판단한 채로 움직인다는 점이 이 화면의 핵심입니다.

  1. ‘손실 없음’으로 기본 리듬을 먼저 익힙니다. 조각마다 보내고 답을 받습니다.
  2. ‘조각이 사라질 때’로 바꿔 타이머가 만료되는 단계를 확인합니다.
  3. 재전송되는 조각이 새 번호가 아니라 같은 번호를 달고 가는지 봅니다.
  4. ‘답장이 사라질 때’로 바꿔, 서버가 이미 받아 둔 상태에서 다시 받는 상황을 봅니다.
  5. 서버 쪽에 쌓인 조각 목록에 중복이 생기지 않는지 확인합니다.
  6. 세 시나리오의 단계 수를 비교해 복구에 드는 왕복이 얼마나 늘어나는지 봅니다.
  7. 보낸 쪽 목록과 받은 쪽 목록이 어긋나 있는 단계를 찾아봅니다.
  8. 세 시나리오에서 보낸 쪽이 취하는 대응이 결국 하나뿐인지 확인합니다.
  9. 재전송된 조각이 도착했을 때 받는 쪽 목록이 늘어나지 않는 경우를 찾아봅니다.
  10. 타이머가 켜져 있는 단계와 꺼져 있는 단계를 구분해 봅니다.
  11. 손실 없음과 답장 유실을 번갈아 보며 받는 쪽 화면이 거의 같다는 점을 확인합니다.

손실을 복구하는 규칙

01

보낸 쪽은 사라진 것을 곧바로 알 수 없습니다.

조각이 사라지는 단계에서 화면은 그 사실을 보여주지만, 보낸 쪽의 상태는 아무것도 바뀌지 않습니다. 회선 어딘가에서 조용히 버려진 것이라 누구도 알려주지 않기 때문입니다. 그래서 보낸 쪽이 쓸 수 있는 단서는 답장이 오지 않는다는 사실 하나뿐이고, 이 데모가 타이머를 화면에 계속 띄워 두는 이유가 여기 있습니다.

02

복구를 시작하는 것은 시간입니다.

잃어버린 조각을 다시 보내게 만드는 신호는 상대의 요청이 아니라 타이머 만료입니다. 정해 둔 시간 안에 답이 오지 않으면 사라진 것으로 보고 같은 조각을 한 번 더 보냅니다. 이 방식은 단순하지만 대가가 있는데, 실제로는 사라지지 않고 늦게 도착하는 중이었을 수도 있어서 그런 경우 같은 조각이 두 번 도착합니다.

03

번호가 중복을 걸러 냅니다.

답장이 사라진 시나리오에서는 서버가 이미 받아 둔 조각을 한 번 더 받습니다. 그런데 조각에 붙은 번호가 같기 때문에 서버는 그것이 새 데이터가 아니라 이미 처리한 것임을 알아보고 버립니다. 번호가 없었다면 같은 데이터가 두 번 쌓였을 것이고, 재전송이라는 방식 자체가 성립하지 않았을 것입니다.

04

두 가지 유실이 겉으로는 같아 보입니다.

보낸 쪽에서 보면 조각이 사라진 경우와 답장이 사라진 경우가 구분되지 않습니다. 둘 다 답이 오지 않는 것으로 관찰되기 때문입니다. 그래서 대응도 똑같이 다시 보내는 것 하나뿐이고, 어느 쪽이었는지는 받는 쪽에서 중복을 걸러 내며 자연스럽게 해결됩니다. 구분할 수 없는 상황을 구분하지 않고도 옳게 동작하도록 만든 설계입니다.

05

번호는 읽기 쉽게 단순화했습니다.

화면의 조각 번호는 1 과 2 처럼 순서대로 붙였지만, 실제로는 조각 단위가 아니라 바이트 단위로 번호를 셉니다. 조각 크기가 매번 다를 수 있어서 몇 번째 조각인지보다 몇 번째 바이트까지 받았는지가 더 정확한 표현이기 때문입니다. 여기서는 재전송과 중복 제거라는 구조만 보이면 되므로 번호를 단순하게 바꿨습니다.

06

세 시나리오를 같은 형식으로 만들었습니다.

세 경우 모두 같은 자료 구조로 되어 있어서, 각 단계가 어느 쪽이 움직이는 차례인지 · 지금 어떤 조각이 어디 있는지 · 타이머가 어떤 상태인지를 똑같이 담고 있습니다. 형식이 같으면 시나리오를 바꿔도 화면 구성이 그대로라 비교가 쉬워지고, 단계 수가 늘어난 부분만 눈에 들어옵니다.

07

양쪽이 아는 것을 따로 표시합니다.

화면에는 보낸 쪽이 확인받은 조각 목록과 받은 쪽이 실제로 가진 조각 목록이 따로 있습니다. 이 둘이 어긋나는 구간이 생기는 것이 손실 상황의 본질인데, 답장이 사라진 경우에는 받는 쪽은 다 받았는데 보내는 쪽만 모르는 상태가 됩니다. 목록 하나로 합쳐 두었다면 이 어긋남이 화면에서 사라졌을 것이고, 왜 불필요한 재전송이 일어나는지도 설명되지 않았을 것입니다.

08

복구 비용이 단계 수로 드러납니다.

손실이 없으면 여덟 단계로 끝나는 일이, 조각 하나가 사라지면 열한 단계, 답장이 사라지면 열두 단계가 됩니다. 늘어난 단계 대부분은 데이터를 나르는 것이 아니라 기다리고 다시 보내는 데 쓰입니다. 손실률이 조금만 올라가도 체감 속도가 크게 나빠지는 이유가 여기 있고, 회선 품질이 대역폭보다 중요할 때가 있다는 말이 이 구조에서 나옵니다.

재전송의 구조만 보여줍니다.

이 화면은 아무 데이터도 전송하지 않고 미리 만들어 둔 단계를 순서대로 보여줄 뿐입니다. 손실은 무작위로 일어나는 것이 아니라 시나리오마다 정해진 지점에서만 일어납니다. 실제 구현에는 여기 없는 것이 많은데, 답을 기다리는 시간을 왕복 시간 측정치로 계속 조정하는 과정, 답이 없을 때마다 기다리는 시간을 늘려 가는 방식, 손실을 혼잡의 신호로 보고 보내는 속도를 줄이는 동작, 답장 하나로 여러 조각을 한꺼번에 확인하거나 빠진 조각만 골라 알리는 방식이 모두 빠져 있습니다. 조각 두 개는 구조를 보기 위한 최소 단위이고, 실제로는 훨씬 많은 조각이 동시에 회선 위에 떠 있습니다.

참고 자료RFC 9293 — Transport Control Protocol (재전송과 확인 응답)RFC 6298 — 재전송 타이머 계산

실험을 마쳤다면