Transport Layer
해야하는 일
- multiplexing / demultiplexing
- error checking
→ reliable한 data transfer을 하도록 도와줘야 함
Reliable Data Transfer의 원칙
- 하나씩 보내고 확인하고 다음 것을 보냄
- unreliable channel
-
Message Error
-
Message Loss
→이 두개를 잘 처리하면 된다.
Rdt 1.0 : Perfect Channel
sender, receiver 각자의 역할을 잘 하면 된다.
Rdt 2.0 : Packet Errors but no loss
-
error detection : checksum bits을 헤더에 담아서 체크
-
Feedback : 잘 받았는지 안받았는지 메세지
지속적으로 패킷을 받을 때마다 피드백을 보낸다.
- ACKs : receiver → sender 잘받았어!
- NAKs : receiver → sender 못받았어!
-
Retransmission
- NAK을 받으면 sender는 재전송을 한다.
→ 하지만 이것이 Packet Error를 완벽하게 커버하지는 못한다.
만약, 피드백에 에러가 있다면 (ACK→NAK), Receiver는 Sender가 retransmission하기에 중복된 패킷을 받게 된다. 하지만 R은 이 사실을 모른다.
→ 그래서 패킷에 번호를 붙인다 : Sequence #
Rdt 2.1 : Sequence Number
- 최소화가 돼야 하므로 0과 1을 반복해서 사용한다 → 1 bit면 충분한 이유
- Receiver는 Sequence #을 기억한다.
- R이 기대하는 #가 아닌 것이 오면 기다린다. 기대하는 것이 올때까지 기다리는 것
Sender | Receiver |
---|
add Seq # to pkt | Seq # 을 계속 check하여 pkt이 중복인지를 확인 |
ACK/NAK을 계속 체크 | pkt이 잘못왔으면 NAK을 보내기 |
NAK이온다면 Retransmit | |
Rdt 2.2 : NAK-free protocol
- ACK에 가장 마지막으로 제대로 받은 Seq # 을 포함하기 →ACK만으로도 NAK을 표현할 수 있다.
Rdt 3.0 : channel with loss & pkt errors
- Timer : 패킷 loss를 체크할 수 있는 수단
- ACK을 기다리는 reasonable amount 시간이 지나면 Time-out (lost ACK)
- Time-out이 되면 유실로 판단하고 재전송한다.
- 만약에 그냥 delay된 거였지만 재전송이 되었더라도 Seq#로 R은 알아서 판단한다. (premature time-out) → 네트워크에서 해결할 문제 → Seq #은 항상 가장 마지막으로 잘 받은 패킷의 #을 보내게 된다.
정리
- Packet Error Mechanism → Error Detection, feedback, retransmission, sequence #
- Packet Loss Mechanism → Timeout
Pipelined Protocols
- sender allows multiple
- 이제는 여러 개를 보낸다 → in-flight
- 도착하지 않았더라도 일단 보내고 봄