신뢰적인 데이터 전달 프로토콜의 구축 - rdt 1.0/2.0/2.1/2.2/3.0
rdt1.0: reliable transfer over a reliable channel
• 이미 보내는 채널이 신뢰성이 있다. -> no bit error / no loss of packet
변화를 일으키는 이벤트(사건)는 변화를 표기하는 평행선 위에 나타낸다. 그리고 이벤트가 발생했을 떄 취해지는 액션(action, 행동)은 평행선 아래에 나타낸다.
rdt의 송신 측은 rdt_send(data) 이벤트에 의해 상위 계층으로부터 데이터를 받아들이고 데이터를 포함한 패킷을 생성한다. 그리고 패킷을 채널로 송신한다. 실제로 rdt_send(data) 이벤트는 상위 계층 애플리케이션의 프로시저 호출에 의해 발생한다.
rdt2.0: 비트 오류가 있는 채널 상에서의 신뢰적 데이터 전송
• 더 실질 모델은 패킷 안의 비트들이 하위 채널에서 손상되는 모델이다.
• 패킷이 전송 또는 전파되거나 버퍼링될 때 네트워크의 물리적 구성 요소에서 일반적으로 발생한다.
• ARQ 포로토콜(자동재전송요구 프로토콜)
1) 오류 검출
비트 오류가 발생했을 때 수신자가 검출할 수 있다.
UDP는 이를 위해 인터넷 체크섬 필드를 사용한다.
2) 수신자 피드백
긍정 확인응답(ACK)
부정 확인응답(NAK)
3) 재전송
수신자에서 오류를 가지고 수신된 패킷은 송신자에 의해서 재전송된다.
송신
왼쪽 상태
1. 송신 측 프로토콜은 상위 계층으로부터 데이터가 전달되기를 기다린다.
2. 송신자는 패킷 체크섬과 함께 전송될 데이터를 포함하는 패킷을 생성하고 전송한다.
오른쪽 상태
1. 수신자로부터의 ACK 또는 NAK 패킷을 기다린다.
2-1. ACK 패킷이 수신되면 송신자는 가장 최근에 전송된 패킷이 정확하게 수신되었다는 것을 알게 되고 상위 계층으로부터 데이터를 기다리는 상태로 돌아간다.
2-2. NAK가 수신되면 프로토콜은 마지막 패킷을 재전송하고 재전송된 데이터 패킷에 대한 응답인 ACK 또는 NAK를 기다린다.
수신
패킷이 도착했을 때 수신자는 수신된 패킷이 손상되었는지 아닌지에 따라 ACK 또는 NAK로 응답한다.
특징
• 전송-후-대기(stop-and-wait): 송신자가 ACK 또는 NAK를 기다리는 상태에서는 상위 계층으로부터 데이터를 전달받을 수 없다.
• ACK 또는 NAK 패킷의 손상 가능성이 있다.
rdt2.1 - rdt2.0에 순서번호(sequence number)를 삽입하는 방시그올 데이터 패킷에 송신자가 번호를 붙인다.
rdt2.1 송신자와 수신자 FSM 각각은 전송되고 있거나 기다리고 있는 패킷이 순서번호 0 또는 1을 가져야 하는지를 반영해야 하기 때문에 전보다 두 배 많은 상태를 가지고 있다.
• 수신자로부터 송신자까지의 긍정 확인응답과 부정 확인응답을 모두 포함한다. 순서가 바뀐 패킷이 수신되면 수신자는 이미 전에 수신한 패킷에 대한 긍정 확인응답 ACK를 전송하고 손상된 패킷이 수신되면 수신자는 부정 확인응답을 전송한다. 같은 패킷에 대해 2개의 ACK를 수신, 즉, 중복 ACK를 수신한 송신자는 수신자가 그 다음 패킷을 정확하게 수신하지 못했다는 것을 알 수 있다.
rdt2.2 - 비트 오류를 갖는 채널을 위한 NAK 없는 신뢰적인 데이터 전송 프로토콜
rdt2.1과 rdt2.2의 차이는 수신자가 NAK가 없기 때문에 반드시 ACK 메시지에 의해서 확인응답하는 패킷의 순서번호를 포함해야 한다는 것이다. 그리고 송신자는 수신된 ACK 메시지에 의해 확인응답된 패킷의 순서번호를 반드시 검사해야한다.
rdt3.0 - 비트 오류와 손실 있는 채널 상에서의 신뢰적 데이터 전송
• 송신자가 데이터 패킷을 전송하고 패킷 또는 수신자의 패킷에 대한 ACK를 손실했다고 가정하자. 두 경우 모두 송신자에게는 어떠한 응답도 없다. 송신자 관점에서는 데이터 패킷이 손실되었는지, ACK가 손실되었는지, 패킷 또는 ACK가 단순히 지나치게 지연된 것인지를 알지 못한다. 이러한 모든 경우에서 송신자는 오직 재전송을 하면 된다. 시간 기반의 재전송 메커니즘을 위해 주어진 시간이 경과된 후에 송신자를 중단할 수 있는 카운트다운 타이머(countdown timer)를 설정한다.
1) 매 패킷(첫 번째 또는 재전송 패킷)이 송신된 시간에 타이머를 시작함
2) 타이머 인터럽트에 반응함
3) 타이머를 멈춤