Principles of reliable data transfer: 두 판 사이의 차이
| 37번째 줄: | 37번째 줄: | ||
* Retransmission: 수신측에서 오류가 발생한 패킷은 송신자가 해당 패킷을 재전송한다. | * Retransmission: 수신측에서 오류가 발생한 패킷은 송신자가 해당 패킷을 재전송한다. | ||
[[파일:Rdt2.0 sending FSM.png|테두리|프레임없음|300x300픽셀]] [[파일:Rdt1.0 sender FSM.png.png|테두리|프레임없음|195x195픽셀]] | |||
adsf | |||
==각주== | ==각주== | ||
[[분류:컴퓨터 네트워크]] | [[분류:컴퓨터 네트워크]] | ||
2025년 4월 1일 (화) 08:35 판
상위 문서: Transport Layer
개요

신뢰성있는 데이터 전송(Reliable data transfer)을 구현하는 문제는 네트워크 학문에서 굉장히 중요한 문제이다. 신뢰성있는 데이터 전송의 개념적인 틀은 오른쪽 이미지가 잘 보여주고 있다.
상위 layer에게 제공되는 서비스 abstraction은 데이터를 전송할 수 있는 신뢰성있는 데이터 전송 채널의 형태이다. 이러한 채널에서는 전송되는 데이터 bit들이 손상되지 않고, 누락되지 않으며, 전송한 순서대로 수신된다. 신뢰성있는 데이터 전송 프로토콜은 이러한 서비스를 제공해야 한다. 하지만 해당 작업은 어려운데, 해당 프로토콜이 수행되는 layer는 신뢰할 수 없는 network layer 위에서 구현되기 때문이다.
위 그림은 해당 문서에 다룰 데이터 전송 프로토콜의 인터페이스이다. 이때 그림에 나타난 함수들은 다음과 같다:[1]
- 송신 측
- rdt_send(): 상위 layer에서 호출되어, 수신측 상위 layer에 전달할 데이터를 넘겨준다.
- udt_send(): 송신측이 채널에 패킷을 전송하고자 할 때 호출된다.
- 수신측
- rdt_rcv(): 채널에서 패킷이 도착했을 때 호출된다.
- deliver_data(): rdt 프로토콜이 상위 계층에 데이터를 넘기고자 할 경우 호출된다.
해당 문서에서는 신뢰성있는 데이터 전송 프로토콜을 만들고자 한다. 이때 "패킷은 전송된 순서대로 도착하지만, 일부는 손실될 수 있다."는 가정을 전제로 할 것이다. 또한 송신측과 수신측이 고정되어 있지만 control 패킷은 양방향으로 전달되어야 하므로, 송신측과 수신측은 모두 udt_send()를 통해 상대방에게 패킷을 전송한다. 그리고 transport layer에서 사용되는 용어인 segment 대신 패킷(packet)을 사용한다. 왜냐하면 해당 문서의 내용은 인터넷의 transport layer뿐 아니라 컴퓨터 네트워크 전반에 적용되기 때문이다. 또한 FSM(Finite State Machine)을 통해서 해당 프로토콜을 표현한다.
rdt1.0: reliable transfer over a reliable channel
먼저 기저를 이루는 채널(underlying channel)이 완전히 신뢰할 수 있다고 가정하자. 이는 아래와 같이 매우 단순하게 FSM이 정의된다.
위에서 중요한 점은 송신자와 수신자 각각에 대해 별도의 FSM이 존재한다는 것이다. 이는 rdt 프로토콜이 송신측과 수신측에서 독립적으로 실행되기 때문이다. 또한 FSM에서 화살표는 어떤 상태에서 다른 상태로의 전이(transition)를 나타낸다. 또한 화살표 옆에 있는 구분선을 기준으로 위쪽에는 어떤 event가 발생하였는지가 적혀있고, 아래쪽에는 해당 event가 발생했을 때 수행되는 action이 적혀있다.
rdt의 송신 측은 단순히 상위 계층으로부터 rdt_send(data) 이벤트를 통해 데이터를 받아들이고, make_pkt(data) 동작을 통해 데이터를 포함한 패킷을 생성한 후, 그 패킷을 채널에 전송한다.
수신 측에서는, rdt가 기저 채널로부터 rdt_rcv(packet) 이벤트를 통해 패킷을 수신하고, extract(packet, data) 동작을 통해 패킷에서 데이터를 추출한 뒤, deliver_data(data) 동작을 통해 상위 계층에 데이터를 전달한다.
위의 흐름에서는 완전히 신뢰할 수 있는 채널이 사용되기 때문에 송신자게 수신자가 피드백을 보낼 필요가 없다. 왜냐하면 잘못될 수 있는 일이 없기 때문이다.
rdt2.0: channel with bit errors
이번에는 패킷내의 bit들이 기저 채널에서 손상될 수 있다고 가정하자. Error bit가 발생하였다면 이를 해결하는 방법은 두가지가 있다. 하나는 수신측에서 복잡한 과정을 통해 복구하는 원래의 bit를 복구하는 것이다. 다른 방법은 error bit를 감지하고, 메시지를 다시 전송할 것을 요청하는 것이다. 일반적으로 후자가 훨씬 간단하기 때문에 후자의 방법이 주로 사용된다.
이처럼 수신측의 재전송을 기반으로 하는 rdt 프로토콜을 ARQ라고 하며, 이를 구현하기 위해서는 다음 세가지의 기능이 구현되어야 한다:
- Error detection: 수신자가 비트 오류가 발생했는지를 감지할 수 있는 메커니즘이 필요하다.
- rdt2.0 데이터 패킷의 checksum feild는 해당 메커니즘을 구현하기 위해서 사용된다.
- Receiver feedback: 수신자는 송신자에게 응답을 보내서 error bit가 전송되었는지의 여부를 알 수 있다.
- acknowledgement(ACKs)/negative acknowledgement(NACKs): 긍정/부정 응답
- Retransmission: 수신측에서 오류가 발생한 패킷은 송신자가 해당 패킷을 재전송한다.
adsf
각주
- ↑ rdt는 rliable data transfer를 의미한다.