1. rdt 3.0 (Reliable Data Transfer 3.0)
① 배경 및 문제의식
- rdt 2.0 / 2.1 / 2.2의 한계: 패킷 손상(Bit Corruption)과 응답 손상/중복 수신 문제는 체크섬(Checksum), 시퀀스 번호(Sequence Number), 누적 ACK(Cumulative ACK)를 통해 해결했습니다.
- 해결되지 않은 문제: 비트 손상 외에도 패킷 손실(Packet Loss) 또는 ACK 손실이 발생하는 채널 환경에서는 송수신자가 무한 대기 상태(Deadlock)에 빠질 수 있습니다.
② rdt 3.0 Sender의 타이머 메커니즘
패킷 손실 감지를 위해 타이머(Timer) 개념을 도입했습니다.
[데이터 송신] ──▶ [타이머 시작 (Start Timer)]
│
┌────────────────┴────────────────┐
[정상 ACK 수신] [타임아웃 발생 (Timeout)]
│ │
[타이머 정지 (Stop Timer)] [패킷 재전송 & 타이머 재시작]
▼ ▼
(다음 패킷 전송 대기) (ACK 올 때까지 반복)
- 타이머 작동 원리:
- Start: 패킷 전송 직후 타이머를 동작시킵니다.
- Stop: 전송한 패킷에 대한 올바른 ACK를 수신했을 때 타이머를 멈춥니다.
- Timeout: 설정된 시간(RTT보다 약간 큰 값) 동안 ACK가 오지 않으면, 패킷이 손실되었거나 ACK가 유실된 것으로 판단하여 패킷을 재전송하고 타이머를 다시 켭니다.
- 수신자(Receiver) 동작: 손실 발생 시 아무것도 받지 못하면 대기하며, 이미 받은 패킷을 중복으로 받게 될 경우 해당 패킷은 버리고(Discard) 가장 최근에 성공한 누적 ACK를 재전송합니다.
2. 파이프라이닝 프로토콜 (Pipelined Protocols)
① 도입 필요성 (Stop-and-Wait의 한계)
- rdt 3.0과 같은 Stop-and-Wait(정지-후-대기) 방식은 패킷 1개를 보낸 후 ACK가 도착할 때까지 네트워크가 유휴 상태(Idle)로 남아 있어 네트워크 이용률(Utilization) 및 퍼포먼스가 극도로 저하됩니다. (특히 RTT가 큰 지연 네트워크에서 치명적)
② 파이프라이닝(Pipelining) 개념 및 필수 요소
수신자의 응답(ACK)을 기다리지 않고 여러 패킷을 한 번에 연속해서 전송하는 방식입니다.
[Stop-and-Wait] PKT0 ─────▶ ACK0 ─────▶ PKT1 ─────▶ ACK1
[Pipelining] PKT0, PKT1, PKT2 ─────────▶ ACK0, ACK1, ACK2
- 시퀀스 번호 범위 확장: 한 번에 여러 패킷을 구분해야 하므로 0과 1 외에 더 넓은 범주의 Sequence Number가 필요합니다.
- 버퍼링(Buffering): 송신자와 수신자 측에 미응답/미처리 패킷을 보관할 버퍼 공간이 추가로 요구됩니다.
- 윈도우 사이즈 (Window Size, $W$): ACK 없이 한 번에 연속으로 보낼 수 있는 최대 패킷의 양입니다.
- 성능 및 제어:
- 파이프라이닝을 통해 전송 속도를 $W$배 올릴 수 있으나, 무제한으로 늘리면 네트워크 정체(Congestion)가 발생합니다.
- 이를 제어하기 위해 흐름 제어(Flow Control - 수신자 버퍼 보호) 및 혼잡 제어(Congestion Control - 네트워크 선로 보호) 알고리즘을 사용하며, 패킷의 기본 단위는 MSS (Maximum Segment Size)로 표현합니다.
3. Go-Back-N (GBN) 프로토콜
파이프라이닝 기반의 대표적인 재전송 프로토콜 중 하나입니다.
① 주요 개념 및 동작 원리
[ 윈도우 크기 (N) ]
───────┬───────┬───────────────────┬───────
... │ ACK │ 전송됨/미응답 │ 전송 │ ...
───────┴───────┴───────────────────┴───────
▲ ▲
send_base nextseqnum
- 누적 ACK (Cumulative ACK): 수신자는 순서대로 잘 받은 마지막 패킷 번호에 대한 ACK만 보냅니다. (예: 1~4번 수신 후 5번 없이 6번이 오면 수신자는 6번을 버리고 ACK 4를 중복 전송)
- 단일 타이머 (Single Timer): ACK를 받지 않은 패킷들 중 가장 오래된 패킷(send_base)에 대해서만 1개의 타이머를 가동합니다.
- 타임아웃 시 동작 (Go-Back-N): send_base 패킷의 타이머가 만료되면, ACK를 받지 못한 send_base부터 윈도우 내의 모든 미응답 패킷을 전부 다시 전송합니다.
- 수신자 상태 (Receiver Side):
- 순서에 맞지 않게 도착한 패킷(Out-of-order)은 버퍼에 저장하지 않고 버립니다(Discard).
- 송신자가 어차피 send_base부터 전부 다시 보낼 것이므로, 수신자는 순서가 맞는 패킷만 수락하여 구조가 단순합니다.