Post

8. RDT

How to transfer ‘reliable’ data?

사실 link layer는 reliable하지 않다. channel이 길어지고 느려지면, reliable하기 힘들어진다.

따라서, RDT를 위해선 transport layer의 추상화 작업이 있어야 한다.

이 layer는 4가지로 구성이 되는데,

  • rdt_send
  • udt_send
  • rdt_rcv
  • deliver_data

이다.

이제 reliable한 통신 프로토콜을 만들어보자. FSM으로.


RDT 1.0

  • 비트 에러도 없고
  • 패킷 손실도 없다고 하자.

RDT 2.0

  • checksum to detect bit-errors!

→ ACK: packet received ok

→ NAK: packet has errors!

NAK를 받으면 다시 retransmit한다는 개념.

즉, rdt 2.0에서는 error를 detect하고, receiver가 다시 feedback을 한다는 개념이 추가되었다.


→ 매우 큰 문제가 있다.

ACK / NAK가 corrupt될 수도 있다는 것이다.

ACK가 NAK으로 오면 그나마 봐줄만한데, NAK가 ACK으로 오면 재앙이 시작된다.

그렇다고 매번 retransmit할 수는 없다. (possible duplicate)

Handling dupes

  • Sender retransmits when ACK, NAK corrupted
  • Sender adds Sequence number
  • receiver discards duplicated packet

→ sender는 패킷 하나를 보내고 응답이 올떄까지 기다린다!


Rdt 2.1

sender

  • sequence # added to pkt
  • ‘현재 내가 기다리고 상태에 해당하는 패킷이 왔냐’가 중요하기 때문에 상태는 0과 1만 필요함
  • checksum으로 ACK/NAK corrupt 여부 판별

receiver

  • must check if packet is duplicated

    → 0상태 기다리고 있는데 1이 왔다면 discard 후 계속 기다림.

    → 수신자는 송신자에게 다시 보낸 ack/nak이 성공했는지 모른다. 즉, 0과 1로 기다려야한다.


Rdt 2.2: a NAK-free protocol

  • NAK 굳이 필요한가?
  • 그냥 NAK대신 이전 패킷의 ACK을 보내자. → 그러면 알아서 제대로 안간줄 알고 다시 보낼게 아닌가

RDT 3.0

  • New assumption: Channel is lossy!

→ Let’s introduce timer concept

→ Earth - mars 통신에서는 어떡할거냐. timer를 무한정으로 늘릴거냐.

→ Timer가 3번의 ACK를 bundling해서 주는 방안도 있겠다.


RDT 3.0 is correct way, but utilization is poor

  • Delay = L / R. but…
  • utilization = ( L / R ) / (RTT+L/R). → poor utilization!

Network protocol이 성능을 제한하네?

→ Let’s Pipeline!

This post is licensed under CC BY 4.0 by the author.