Computer Network #03-2. Transport Layer: Reliable data transfer (rdt)

김서영·2025년 4월 18일
0

컴퓨터네트워크

목록 보기
14/15
post-thumbnail

1. Reliable data transfer(rdt)의 개요

신뢰성 있는 데이터 전송을 할 수 있으면 좋겠지만,
실제 인터넷은 unreliable channel (신뢰성 없는 통신 채널)
(중간에서 데이터가 손실될 우려 있음)

목표

unreliable channel 위에 reliable protocol (송신자/수신자 쪽 모두)을 만들어서 신뢰성 확보

데이터 전송 프로토콜의 복잡성

네트워크 채널의 특성에 따라 강하게 영향 받음

  • 네트워크 채널이 엉망이면 복잡해짐(에러 검출, 재전송, 순서 맞추기 등 필요)

2. rdt의 Interface

송신자와 수신자는 서로의 상태를 알 수 없음

  • 단, 서로 메시지를 보내서 알려주면 가능
    (여러 interface 함수를 사용해서 알리기)

rdt_send()

(송신측) 애플리케이션(상위 레이어)에서 호출, 전송할 데이터를 받아옴

udt_send()

(송신측) 실제로 unreliable channel을 통해 데이터를 전송

rdt_rcv()

(수신측) 수신 쪽 채널에 데이터가 도착했을 때 호출

deliver_data()

(수신측) 수신한 데이터를 상위 애플리케이션 레이어에 전달

3. rdt의 개발 흐름

rdt를 시작하기 전...

  1. 송신자(sender), 수신자(receiver) 각각의 rdt 프로토콜을 점진적으로 개발할 것
  2. 데이터 전송은 한 방향(unidirectional) 으로만 고려
  3. 제어정보(control info) (ex. ACK/NACK)는 양방향 흐름을 가짐
  4. Finite State Machine (FSM) 모델을 사용해서 송신자, 수신자의 동작을 설계
    (상태(state)와 이벤트(event)에 따라 송수신자 동작을 체계적으로 설계)

FSM 기본 구조

송신자와 수신자의 동작을 상태(state)와 이벤트(event)로 설계

  • State: 현재 송신자/수신자의 상태
  • Event: 특정 상황이 발생하는 것
    (ex. 데이터 수신, ACK 도착 등)
  • Action: 상태 전이할 때 수행하는 행동
    (ex. 데이터 전송, ACK 보내기)

4. rdt 1.0

기본 가정

underlying channel(하부 채널)이 완벽하게 신뢰 가능(perfectly reliable)

  • 비트 오류(bit errors) 없음
  • 패킷 손실(loss of packets) 없음

(하부 채널 자체가 완벽해서 특별한 추가 조치가 필요 없음)


rdt 1.0 동작

송신자, 수신자는 각각 따로 FSM(Finite State Machine) 으로 설계
(둘 다 state가 하나 밖에 없음)

채널이 완벽하니까 송신자는 단순히 보내고, 수신자는 단순히 받기만 함

  • 오류 검출, ACK/NACK 이런 거 전혀 필요 없음

송신자(sender) FSM

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

수신자(receiver) FSM

1) 패킷에서 데이터 추출 (extract(packet, data))
2) 위 레이어로 데이터 전달 (deliver_data(data))
3) 다시 "wait" 상태로

5. rdt 2.0

: channel with bit errors

기본 가정

비트 오류가 발생할 수 있는 채널 위에서의 신뢰성 데이터 전송

  • underlying channel(하부 채널)이 완벽 X
    (패킷 전송 중 비트가 flip(뒤집힘) 될 수 있음)
  • 오류 탐지를 위해 checksum 사용

rtd 2.0 : stop and wait

패킷이 손상되었는지 감지하는 것은 check-sum으로 가능
→ 손상되었을 때 복구하는 방법이 필요
→ 오류가 생겼을 때 '다시 요청' 하는 방식으로 해결

ACK (Acknowledgement)

수신자가 패킷 정상적으로 잘 받았음을 알림
(전송자는 다음 패킷을 전송)

NAK (Negative Acknowledgement)

수신자가 패킷에 오류가 있었음을 알림
(전송자는 그 패킷을 다시 재전송(retransmit))


rdt2.0: Sender FSM

상태: "Wait for call from above"

  • event
    rdt_send(data) 호출 (위에서 데이터가 내려옴)
  • action
    make_pkt(data, checksum)
    : 데이터(data)를 이용해 packet을 만들기
    udt_send(packet)
    : 만들어진 packet을 전송
  • state transition
    Wait for ACK or NAK 으로 이동

상태: "Wait for ACK or NAK"

  • event
    rdt_rcv(rcvpkt) 패킷 수신
    • ACK 수신
      action: 아무것도 안 함 (다음 데이터 기다리기)
      state transition: "Wait for call from above"
    • NAK 수신
      action: 방금 보냈던 packet을 다시 전송
      (udt_send(packet))
      state transition: 상태 유지

rdt2.0 동작 (정상)

Sender (보내는 쪽)

1) 위(어플리케이션)로부터 데이터 받아옴
→ rdt_send(data)

2) 데이터 패킷 생성
→ make_pkt(data, checksum)

3) 네트워크로 전송
→ udt_send(sndpkt)

4) ACK 수신 대기
→ Wait for ACK or NAK

5) ACK 수신 → 다음 데이터 준비

Receiver (받는 쪽)

1) 아래(네트워크)로부터 패킷 받음
→ rdt_rcv(rcvpkt)

2) 패킷이 오류 없는지 확인
→ notcorrupt(rcvpkt)

3) 데이터 추출
→ extract(rcvpkt, data)

4) 상위 계층(어플리케이션)으로 전달
→ deliver_data(data)

5) ACK 전송 → udt_send(ACK)


rdt2.0 동작 (오류)

Sender (보내는 쪽)

1) 위(어플리케이션)로부터 데이터 받아옴
→ rdt_send(data)

2) 데이터 패킷 생성
→ make_pkt(data, checksum)

3) 네트워크로 전송
→ udt_send(sndpkt)

4) ACK 또는 NAK 수신 대기

Receiver (받는 쪽)

1) 아래(네트워크)로부터 패킷 받음
→ rdt_rcv(rcvpkt)

2) 패킷이 손상되었는지 확인
→ corrupt(rcvpkt)

3) 오류가 감지되면 NAK 전송
→ udt_send(NAK)

Sender (보내는 쪽)

1) NAK를 받으면, 이전에 전송했던 동일한 패킷을 재전송
→ udt_send(sndpkt)

2) 이후 다시 ACK 대기


rtd 2.0 한계점

ACK/NAK(응답)이 손상되는 경우 고려 X

  • 패킷을 제대로 받았는지 알 수 없음 (송신자는 수신자 상태 모름)
  • 무작정 재전송하면 중복 패킷이 발생할 수 있음 (중복 데이터 문제)

해결책 : 중복 처리 (handling duplicates)

  • (ACK/NAK 손상 시) 현재 패킷을 재전송
  • 송신자는 각 패킷에 sequence number (순번) 를 붙임
  • 수신자는 중복된 패킷을 구별하고 무시 (같은 시퀀스 넘버면 무시)

6. rdt2.1

: sender, handling garbled ACK/NAKs

ACK/NAK도 손상될 수 있기에, 패킷 순서(번호)를 확인해서 정확성 검증 필요함

  • 송신자 : 패킷마다 sequence number(0 또는 1)을 붙임
  • 수신자 : ACK/NAK 보낼 때 sequence number를 함께 보냄

sender 동작

Wait for call from above (0 or 1)

  • 데이터 받으면 sequence number 0 또는 1을 붙여 패킷 생성하고 전송

Wait for ACK or NAK (0 or 1)

  • ACK를 정상적으로 받으면 다음 패킷(순번 전환)으로 이동
  • NAK를 받거나, 손상된 ACK/NAK를 받으면 다시 같은 패킷 재전송

receiver 동작

7. rdt2.2

: a NAK-free protocol

receiver는 NAK/ACK 말고 ACK 만 사용
(기능적으로는 rdt 2.1과 차이 x)

  • 수신자가 항상 '마지막 정상 수신한 패킷'의 ACK만 보냄
  • 송신자가 중복 ACK을 받으면 재전송함
  • NAK 신호 X

(TCP에서도 똑같이 이 내용 나옴)

sender가 0번 패킷을 보낸다고 가정

  • receiver가 0번 패킷을 처리, ACK=0 보내면 정상적으로 처리
  • receiver가 0번 패킷을 처리, ACK=1 보내면 오류로 처리(NAK)

8. rdt3.0

체크섬(checksum), 시퀀스 번호(sequence #), ACK, 재전송(retransmission)들이 있어도 패킷이 아예 사라지면 복구 불가능

패킷이 에러가 아니라 아예 소실(loss)되는 경우 존재
→ sender와 receiver는 서로 소통을 못 하기에, 유실되면 아무도 모름
→ timeout : 일정 시간이 지나도 응답이 오지 않으면 유실로 간주


rdt3.0 시나리오별 동작

정상 수신

패킷 손실

ACK 손실

조기 타임아웃/지연 ACK

10. rdt3.0 성능

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

profile
안녕하세요 :)

0개의 댓글