UnReliable 계층 (Network)에서 Reliable Data Transfer (RDT)
-
UnReliable 계층에서 RDT ⇒ 방법
-
TCP Header에는 이와 같은 방법이 Field에 존재한다. ⇒ 모두 구현되어 있다.
-
UDP ⇒ Multiplexing, Demultiplexing + Checksum
-
Unreliable channel ⇒ Packet Error + Packet Loss
-
Packet Error ⇒ FSM (Fine State Machines) ⇒ Error
Detection + Feedback → ACK와 NACK + Retransmission
- 만약에 Perfect Channel ⇒ 주고 받기만 하면 된다. 문제 될 일이 없다.
- Error 발생하는 경우 (NOT LOSS)
- 수신자 → 송신자 : 재 전송, Duplicate → Discard (번호로 구분 ⇒ 왜냐하면 동일한 packet 여러 번 보냈는지 아니면 중복된 것인지 구분하기 위함이다.)
- 송신자 → 수신자 : ACK Error ⇒ NACK (PKT 번호와 ACK 번호가 다른 경우 → NACK 확인 가능)
- Loss 발생하는 경우
- Timer에 따라서 판단 ⇒ 알맞은 타이머 설정이 굉장히 중요
- 만약에 Timer가 긴 경우 ⇒ 반응 느림 (분명히 네트워크에 문제가 발생하였는데 ← ack 전송 안 됨 등) ⇒ 우리 입장에서는 알 수가 없다.
- 만약에 Timer가 짧은 경우 ⇒ ack 전송 중인데 모르고 계속 중복된 PKT 발생 → 네트워크 Overhead 발생 (Header에 무리를 주는 과정)
- 송신자 → 수신자 : Timer → 재 전송
- 수신자 → 송신자 : Timer → 재 전송 → Duplicate & Discard
- Premature Timeout : 정상적으로 돌아가긴 하는데, 문제 ⇒ NACK 볼 수 있는 여지를 남김 (반 박자 정도 늦게 응답 받기 때문) ⇒ Duplicate & Discard로 자원을 낭비하는 경우가 발생, 또한 재 전송 비율 높아진다.
지금까지 본 상황은 1개의 PKT 주고 받는 과정 확인 ⇒ 신뢰성은 있으나, 비효율적인 방법
실제로는 한 뭉텅이의 PKT 보내고, 각각 피드백 확인 ⇒ Sequence Num, Feedback 관리를 잘 해야 한다.
요약
- 신뢰하지 않는 계층에서 신뢰하는 데이터 전송을 성공적으로 하기 위한 목적 ⇒ TCP는 해당 방법을 모두 가지고 있기 때문에, Header에 Field로 차지하고 있다.
- UDP ⇒ Checksum (에러 체크) + Multiplexing과 Demultiplexing
- Error + Loss
- Error ⇒ 송신자 Error, 수신자 Error
- Loss (Timeout) ⇒ 송신자 Loss, 수신자 Loss, Premature Timeout
- 1개의 PKT RTT (Round Trip Time) ⇒ 신뢰할 수 있는 데이터 전달이지만, 비효율적이다.
- 여러 개의 PKT RTT 고려 ⇒ Sequence Num, Timeout, Feedback이 중요하다.