
1. Reliable data transfer(rdt)의 개요

신뢰성 있는 데이터 전송을 할 수 있으면 좋겠지만,
실제 인터넷은 unreliable channel (신뢰성 없는 통신 채널)
(중간에서 데이터가 손실될 우려 있음)
unreliable channel 위에 reliable protocol (송신자/수신자 쪽 모두)을 만들어서 신뢰성 확보
네트워크 채널의 특성에 따라 강하게 영향 받음
2. rdt의 Interface
송신자와 수신자는 서로의 상태를 알 수 없음

(송신측) 애플리케이션(상위 레이어)에서 호출, 전송할 데이터를 받아옴
(송신측) 실제로 unreliable channel을 통해 데이터를 전송
(수신측) 수신 쪽 채널에 데이터가 도착했을 때 호출
(수신측) 수신한 데이터를 상위 애플리케이션 레이어에 전달
3. rdt의 개발 흐름
송신자와 수신자의 동작을 상태(state)와 이벤트(event)로 설계

4. rdt 1.0
underlying channel(하부 채널)이 완벽하게 신뢰 가능(perfectly reliable)
(하부 채널 자체가 완벽해서 특별한 추가 조치가 필요 없음)
송신자, 수신자는 각각 따로 FSM(Finite State Machine) 으로 설계
(둘 다 state가 하나 밖에 없음)
채널이 완벽하니까 송신자는 단순히 보내고, 수신자는 단순히 받기만 함

1) 패킷 생성 (make_pkt(data))
2) 하부 채널로 전송 (udt_send(packet))
3) 다시 "wait" 상태로

1) 패킷에서 데이터 추출 (extract(packet, data))
2) 위 레이어로 데이터 전달 (deliver_data(data))
3) 다시 "wait" 상태로
5. rdt 2.0
: channel with bit errors
비트 오류가 발생할 수 있는 채널 위에서의 신뢰성 데이터 전송
패킷이 손상되었는지 감지하는 것은 check-sum으로 가능
→ 손상되었을 때 복구하는 방법이 필요
→ 오류가 생겼을 때 '다시 요청' 하는 방식으로 해결
수신자가 패킷 정상적으로 잘 받았음을 알림
(전송자는 다음 패킷을 전송)
수신자가 패킷에 오류가 있었음을 알림
(전송자는 그 패킷을 다시 재전송(retransmit))


1) 위(어플리케이션)로부터 데이터 받아옴
→ rdt_send(data)
2) 데이터 패킷 생성
→ make_pkt(data, checksum)
3) 네트워크로 전송
→ udt_send(sndpkt)
4) ACK 수신 대기
→ Wait for ACK or NAK
5) ACK 수신 → 다음 데이터 준비
1) 아래(네트워크)로부터 패킷 받음
→ rdt_rcv(rcvpkt)
2) 패킷이 오류 없는지 확인
→ notcorrupt(rcvpkt)
3) 데이터 추출
→ extract(rcvpkt, data)
4) 상위 계층(어플리케이션)으로 전달
→ deliver_data(data)
5) ACK 전송 → udt_send(ACK)

1) 위(어플리케이션)로부터 데이터 받아옴
→ rdt_send(data)
2) 데이터 패킷 생성
→ make_pkt(data, checksum)
3) 네트워크로 전송
→ udt_send(sndpkt)
4) ACK 또는 NAK 수신 대기
1) 아래(네트워크)로부터 패킷 받음
→ rdt_rcv(rcvpkt)
2) 패킷이 손상되었는지 확인
→ corrupt(rcvpkt)
3) 오류가 감지되면 NAK 전송
→ udt_send(NAK)
1) NAK를 받으면, 이전에 전송했던 동일한 패킷을 재전송
→ udt_send(sndpkt)
2) 이후 다시 ACK 대기
ACK/NAK(응답)이 손상되는 경우 고려 X
6. rdt2.1
: sender, handling garbled ACK/NAKs
ACK/NAK도 손상될 수 있기에, 패킷 순서(번호)를 확인해서 정확성 검증 필요함

Wait for call from above (0 or 1)
Wait for ACK or NAK (0 or 1)

7. rdt2.2
: a NAK-free protocol
receiver는 NAK/ACK 말고 ACK 만 사용
(기능적으로는 rdt 2.1과 차이 x)
(TCP에서도 똑같이 이 내용 나옴)
sender가 0번 패킷을 보낸다고 가정


8. rdt3.0
체크섬(checksum), 시퀀스 번호(sequence #), ACK, 재전송(retransmission)들이 있어도 패킷이 아예 사라지면 복구 불가능
패킷이 에러가 아니라 아예 소실(loss)되는 경우 존재
→ sender와 receiver는 서로 소통을 못 하기에, 유실되면 아무도 모름
→ timeout : 일정 시간이 지나도 응답이 오지 않으면 유실로 간주





10. rdt3.0 성능
🛤 Stop-and-Wait 성능 분석
송신자 활용도 (Usender) 계산
1Gbps 링크, 15ms 왕복 지연(RTT) 예시
매우 낮은 채널 활용도