[한양대학교 이석복 교수, 2015년도 컴퓨터네트워크 강의]
를 개인이 정리한 글이며, [추가 내용 및 의역]이 포함되어 있습니다.
목차
Principles of Reliable Data Transfer
- (TCP 등에서) 신뢰성 보장을 위해 어떤 프로토콜을 사용할 수 있는지, 또한 그 프로토콜은 어떤 매커니즘으로 동작하는지 탐구한다. (이는 네트워크에서 근본적으로 중요한 주제이다.)
- 기본적으로 전송 계층 하위의 계층들은 Unreliable한 구조로 이루어져 있다. 즉, 신뢰성 보장을 위한 규약이 따로 존재하지 않는다.
- 따라서, 하위 계층을 사용하는 전송 계층에서 구현해야 한다. 이를 위한 프로토콜로, 현대에서는 RDT(Reliable Data Transfer Protocol)를 사용한다.
What can happen over unreliable channer?
- Message error
- Message loss
즉, 신뢰성이 보장된다는 것은, error와 loss에 대한 대처가 보장됨을 의미한다.
Let's Buiild simple Reliable Data Transfer Protocol
RDT를 점진적으로 구현해 나가기 위해, 하나의 packet만을 주고받는 sender와 reciver을 가정한다.
또한, RDT는 주로 FSM( Finite State Machines, 유한상태머신)을 사용한다.
State가 다음 Action을 결정한다. Event는 State Transition을 야기하여, 최종적으로 Action을 일으키게 한다.
RDT 1.0 : Data Transfer over a Perfect Channel
하위 계층의 신뢰성이 보장된다면 error와 loss가 일어나지 않는다. 그렇다면, 신뢰성을 위한 추가 동작이 필요하지 않다.
따라서, 다음과 같은 매커니즘을 사용한다.
rdt_send(data)
상위 계층에서 내려온 데이터를 하위 계층으로 전송한다.
make_pkt(data)를 통해 패킷을 만들고, udt_send(packet)을 통해 패킷을 보낸다.
여기서, udt는 Unreliable Data Transfer로서, udt_send는 신뢰할 수 없는 계층으로 보냄을 의미한다.
rdt_rcv(packet)
하위 계층에서 올라온 데이터를 상위 계층으로 전송한다.
extract(packet,data)로 추출(header 정보에 기반하여 data 부분을 파싱/역직렬화)하여, deliver_data(data)로 상위 계층으로 전송한다.
RDT 2.0 : Channel with Packet Errors (no loss)
loss가 일어나지 않는다고 가정하면, error에 대처할 다음과 같은 매커니즘이 필요하다.
Error detection
- add checksum bits
Feedback
- Acknowledgments (AKCs): receiver가 sender에게 packet을 완벽하게 전달받았음을 알리는 역할
- Negative Acknowledgments(NAKs): receiver가 sender에게 packet에 error가 발생했음을 알리는 역할
Restransmission
NAK를 받았다면, sender가 재전송을 수행
Sequnce Number
패킷의 식별자
error 발생 시 다음과 같은 과정을 수행한다. 여기서 0에 해당하는 것은 Sequnce Number이다.
1. sender가 packet(0)을 보냈지만, receiver가 받지 못해 NCK(0)을 보낸다.
2. sender가 packet(0)을 재전송한다.
RDT 2.1 : Handling Duplicate Packets
하지만 이 때, 다음과 같은 상황이 있을 수 있다.
1. sender가 packet(0)을 보낸다.
2. receiver가 packet(0)을 받지 못하여 NAK(0)를 보냈지만, 아직 packet(0) 전송되고 있는 도중이다.
3. sender가 NAK를 받아 packet(0)을 재전송한다.
4. 전송 도중인 packet(0)와 재전송된 packet(0)를 receiver가 받아 중복(duplicate)이 발생한다.
따라서,
이 때 receiver는 중복 패킷을 버리는(discard) 동작을 추가로 수행해야 한다.
RDT 2.2 : a NAK-Free Protocol
우리는 PKT, ACK, NAK에 Packet의 식별자로 Sequnce Number를 사용하였다. 이를 개선한다.
1. NAK는 필요가 없다. ACK만 사용한다.
- ACK에 가장 최근에 정상 수신한 시퀀스넘버를 넣어 보내는 방식으로 절충한다.
2. Sequnce Number는 0과 1만 사용한다.
- 무수히 많은 패킷이 보내지는 환경에서 Sequnce Number를 0부터 순차적으로 생성한다면, 범위를 특정하기 힘들고 오버헤드 또한 증가한다.
- 이를 절충하기 위해 0-1-0-1과 같이 교차되는 방식을 사용한다.
RDT 3.0 : Channel With loss & packet errors
error 외 loss를 추가로 해결하기 위한 매커니즘을 추가해야 한다.
이를 위해 일정 시간동안 sender가 ACK를 받지 못했을 때 재전송하기 위한 Timer를 사용한다.
알야아 할 것
- Timer의 주기는 "적절한" 주기여야 한다. 이는 다소 추상적이지만, 서비스에 맞는 reasonable한 주기여야 한다.
- Packet(or ACK)가 loss가 아닌 단지 delayed 된 것이라면, 이에 대한 대처 매커니즘은 앞서 RDT 2.X에서 구현하였다.
추가 사항
1. 강의 및 정리글은 하나의 패킷을 전송하고, 이를 기다리고 답신하는 과정을 전제로 하였다.
현대에서는 당연히 여러 패킷이 묶여(e.g. batch) 전송되며, 병렬적으로 이루어진다.
중요한 것은, 이 경우 역시도 탐구한 내용과 같은 원칙이다.
2. RDT 3.0을 적용한 이후, 정말로 모든 경우에 신뢰성을 보장할 수 있을까?
개인 과제로 남겨주셨다. 결론은 "모든 경우 보장할 수 있다." 이다.
'CS - 강의, 서적 > [Network] 한양대학교 이석복 교수 강의' 카테고리의 다른 글
[네트워크] KOCW 이석복 강의 - 애플리케이션 1 (0) | 2024.09.08 |
---|---|
[네트워크] KOCW 이석복 강의 - 컴퓨터 네트워크 기본 2 (0) | 2024.07.31 |
[네트워크] KOCW 이석복 강의 - 컴퓨터 네트워크 기본 1 (0) | 2024.07.26 |