본문 바로가기
네트워크

(8) Reliable Data Transfer Protocol(rdt)

by fortissimo 2024. 4. 12.

rdt 1.0


하위 채널이 완전히 신뢰적인 경우이다.

 

송신측: 상위 계층으로부터 데이터를 받아들이면, 패킷을 생성하고 채널로 송신한다.

수신 측: 하위 계층으로부터 패킷을 수신하면, 패킷으로부터 데이터를 추출하여 상위 계층으로 전달한다.

 

rdt 2.0


하위 채널에서 비트 오류가 발생하는 모델이다.

수신측에서 잘 받았는지 확인하기 위해 '잘 받았다'라는 확인 응답인 ACK와 '다시 보내달라'는 부정 응답 NAK을 이용한다. 송신자는 NAK 응답을 받으면 패킷을 재전송한다.

 

송신측

상위 계층으로부터 데이터를 받아들이면, 패킷과 함께 체크섬을 생성하고 채널로 송신한다.

그리고 수신측의 ACK나 NAK 응답을 기다린다.

만약 ACK 응답을 받았다면 상위로부터 호출을 기다리는 초기 상태로 돌아간다.

NAK 응답을 받았다면 패킷을 재전송한다.

 

*수신자가 제대로 패킷을 받았는지 확인하기 전까지 새 패킷을 보내지 않는데 이를 전송 후 대기(stop-and-wait)이라 한다.

 

수신측

하위 계층으로부터 패킷을 수신하면, 체크섬으로 패킷에 오류가 있는지 확인한다.

오류가 있다면 NAK 응답을 송신측에 보낸다.

오류가 없다면 데이터를 추출하여 상위 계층에 전달하고 ACK 응답을 보낸다.

 

rdt 2.0은 ACK나 NAK 응답이 오류가 있을 가능성이 고려되지 않았다. 만약 ACK 응답을 보냈는데 패킷이 손상되어 NAK 응답으로 바뀌었다면, 송신측은 해당 패킷을 다시 보낼 것이고 수신 측은 중복된 패킷을 2개 받게 된다. 이러한 문제를 해결하기 위해 수신측이 보내는 패킷에 순서 번호(sequence number)를 추가로 넣어 rdt 2.1을 만들었다.

 

rdt 2.1


rdt 2.0에 순서번호가 추가된 모델이다. 이 순서 번호는 나머지 연산을 통한 한 비트만 있으면 충분하다.

 

송신 측

초기 상태는 0번 패킷에 대한 호출을 기다리는 것으로 시작한다. 상위 계층으로부터 데이터가 도착하면, 0번이라는 정보와, 체크섬, 패킷을 생성하여 채널로 송신한다. 그리고 0번에 대한 ACK 응답이나 NAK 응답을 기다린다.

 

수신 측으로부터 도착한 응답이 NAK이거나, 왜곡된 응답(ACK, NAK) 패킷이라면 0번 패킷을 다시 보낸다.

수신측으로부터 도착한 응답이 ACK이고 응답 패킷이 왜곡되지 않았다면 1번 패킷에 대한 호출을 기다린다.

 

수신측으로부터 도착한 응답이 NAK이거나, 왜곡된 응답 패킷이라면 1번 패킷을 다시 보낸다.

수신측으로부터 도착한 응답이 ACK이고, 응답 패킷이 왜곡되지 않았다면 0번 패킷에 대한 호출을 기다린다.

 

수신측

초기 상태는 하위 계층으로부터 0번 패킷에 대한 호출을 기다리는 것으로 시작한다. 데이터가 도착했을 때 0번 패킷에 대한 데이터이고, 패킷에 오류가 없다면 패킷으로부터 데이터를 추출하여 상위 계층에 전달하고 ACK 응답과 체크섬을 만들어 송신측에 전달한다. 데이터가 도착했을 때 손상되었다면 NAK 응답과 체크섬을 만들어 송신측에 전달한다.

 

1번 패킷을 기다리는 상태에서 1번 패킷에 대한 오류 없는 데이터가 도착했다면 데이터를 추출하여 상위 계층에 전달하고 ACK 응답과 체크섬을 만들어 송신측에 전달한다. 그리고 0번 패킷을 기다리는 상태로 돌아간다. 오류가 있는 데이터라면 NAK 응답과 체크섬을 만들어 송신측에 전달한다.

1번 패킷을 기다리는 상태에서 만약 0번 패킷에 대한 오류 없는 데이터가 도착했다면 ACK 응답을 보낸다. 이는 수신자가 0번 패킷을 잘 수신하였지만 응답 패킷이 왜곡되어 송신자가 다시 보낸 경우로, 송신자는 0번 패킷에 대한 ACK 응답을 중복해서 받으므로 1번 패킷을 전송받지 못했다는 것을 알게 된다.

다시 0번 패킷을 기다리는 상태에서 1번 패킷에 대한 오류 없는 데이터가 전송되었다면 1번 패킷에 대한 ACK 응답과 체크섬을 보낸다.

 

rdt 2.1은 ACK와 NAK을 둘 다 쓰니 복잡하다는 단점이 있다. 이를 개선하여 ACK만 사용하도록 한 것이 rdt 2.2이다.

 

rdt 2.2


ACK만 사용하는 모델. NAK 응답 대신 마지막으로 제대로 받은 패킷에 대한 ACK를 보낸다.

 

송신측

초기 상태는 상위 계층으로부터 0번 패킷 호출을 기다리는 것으로 시작한다. 상위 계층으로부터 데이터를 받으면 0번 패킷에 대한 데이터와 체크섬을 전송하고, 0번 패킷에 대한 ACK 응답을 기다리는 상태로 전환한다. 이 상태에서 응답을 받았는데 응답 패킷이 왜곡되었거나 1번 패킷에 대한 ACK 응답이 도착했다면 0번 패킷을 재전송한다. 0번 패킷에 대한 오류 없는 응답 패킷이라면 1번 패킷 호출을 기다리는 상태로 전환한다.

0번 패킷과 마찬가지로, 응답 패킷이 왜곡되었거나 0번 패킷에 대한 ACK 응답이 도착했다면 1번 패킷을 재전송한다. 1번 패킷에 대한 오류 없는 응답 패킷이 도착했다면 0번 패킷 호출을 기다리는 상태로 전환된다.

 

수신측

초기 상태는 하위 계층으로부터 0번 패킷에 대한 호출을 기다리는 것으로 시작한다. 도착한 패킷이 0번 패킷이고 왜곡되지 않았다면 패킷으로부터 데이터를 추출하여 상위 계층에 전달한다. 그리고 0번 패킷에 대한 ACK와 체크섬을 송신측에 전달하고, 1번 패킷을 기다리는 상태로 전환한다.

1번 패킷을 기다리는 상태에서 0번 패킷이 도착하거나 왜곡되었다면 0번 패킷에 대한 ACK와 체크섬을 전달한다. 왜곡되지 않은 1번 패킷 데이터라면 데이터를 추출하여 상위 계층에 전달한다. 그리고 1번 패킷에 대한 ACK와 체크섬을 송신측에 전달하고, 다시 0번 패킷을 기다리는 상태로 전환한다.

만약 도착한 패킷이 1번 패킷이거나 왜곡되었다면 1번 패킷에 대한 ACK를 송신측에 전달한다.

 

rdt 2.2까지는 패킷이 가는 중, 혹은 오는 중 손실되는 경우를 고려하지 않았다. 이것까지 고려한 것이 rdt 3.0이다.

 

rdt 3.0


패킷의 손실을 고려하기 위해 timeout을 둔다. 제한 시간 안에 ACK 응답이 오지 않으면 패킷을 재전송하는 것이다. 패킷이 손실되었던 것이 아니라 그냥 딜레이 된 것일 수 있지만, 순서 번호를 이용하여 이미 이것을 해결할 수 있으므로 문제가 되지 않는다.

 

송신측

마찬가지로 상위 계층으로부터 0번 패킷에 대한 호출을 기다리는 것으로 시작한다. 0번 패킷을 보낸 후 타이머를 작동시키고 0번 패킷에 대한 ACK를 기다린다. 만약 1번 패킷에 대한 ACK가 도착하거나 응답 패킷이 손상되었다면 타임 아웃에 의해 패킷이 재전송될 것이므로 아무것도 하지 않는다. 0번 패킷에 대한 ACK를 기다리는 도중 타임 아웃이 일어났다면 패킷이 재전송하고 다시 타이머를 작동시킨다. 0번 패킷에 대한 오류 없는 ACK를 받았다면 타이머를 멈추고 상위 계층으로부터 1번 패킷에 대한 호출을 기다리는 상태로 전환한다.

1번 패킷을 전송했다면 1번 패킷에 대한 ACK를 기다리는 상태로 전환한다. 응답 패킷이 제대로 도착했다면 0번 호출을 기다리는 상태로 전환하고, 타임 아웃이 되었다면 1번 패킷을 재전송, 0번 패킷에 대한 ACK이거나 오류가 있다면 아무것도 하지 않는다.

 

수신측은 rdt 2.2와 동일하다.

 

rdt 3.0의 문제점은 여전히 stop-and-wait 프로토콜이라는 것이다. 송신측이 네트워크를 이용하는 시간이 매우 짧아서 효율성이 떨어진다는 것이다. 이러한 문제를 해결하기 위해 파이프라이닝을 사용한다.

 

다음 글에서 이어진다.

'네트워크' 카테고리의 다른 글

(9) Go-Back-N과 Selective Repeat  (0) 2024.04.15
(6) DNS  (0) 2024.04.02
(5) E-mail  (0) 2024.03.31
(4) HTTP 메시지 포맷, 쿠키와 웹 캐시, HTTP/2  (0) 2024.03.05
(3) TCP와 UDP, HTTP  (0) 2024.02.21