본문

전송계층 프로토콜의 구현방식

1. 단순 프로토콜

흐름/오류제어가 없는 단순 비연결형 프로토콜이다. 프로토콜의 수신측은 수신한 패킷을 즉시 처리할 수 있다. 상/하위 프로토콜 스택에서 받아온 패킷을 즉시 처리하며 이외의 경우는 Ready상태로서 대기하며 따로 패킷을 송/수신 할 수 없다. UDP 프로토콜은 이 프로토콜을 약간 변형한 형태이다.


2. 정지대기 프로토콜(Stop-and-Wait)

흐름/오류제어를 모두 사용하는 연결지향 프로토콜이다. 송/수신측은 모두 크기가 1인 슬라이딩 윈도우를 사용한다. 송신측은 한번에 하나의 패킷을 전송하고 확인 응답이 들어오기 전까지는 다음 패킷을 전송하지 않는다.(흐름제어) 패킷을 수신한 수신측은 패킷을 검사하여 만일 패킷의 검사합이 틀리면 패킷이 훼손되었다고 간주하고 조용히(송신측에 이를 알리지 않고)버린다. 송신측은 패킷을 전송할때마다 타이머를 구동한다. 타이머가 만료되기 전에 확인 응답이 도착하면 타이머는 정지되고, 만일 보낼 패킷이 있다면 송신측은 다음 패킷을 전송한다. 만일 타이머가 만료되면 송신측은 패킷이 손실되었거나 훼손되었다고 간주하고 패킷을 재전송한다.(오류제어) 이를 위해 송신측은 확인 응답이 도착하기 전까지는 전송한 패킷의 사본을 가지고 있어야 한다. 이때 수신자가 받기 원하는 다음 패킷의 순서번호(sequence number), 즉 확인응답 번호(acknowledgement number)가 수신자에 저장되고 확인 응답에 포함됨으로서, 확인응답이 손실되어 송신자가 (타이머가 만료되어)중복패킷을 보내는 경우, 수신자는 해당패킷이 중복패킷이라는것을 인식할 수 있게 된다.


3. N-프레임-후퇴 프로토콜(Go-Back-N, GBN)

전송 효율을 향상시키기 위해 송신측은 확인응답을 기다리는 동안에 여러개의 패킷을 전송할수 있어야 한다. 수신측은 단지 하나의 패킷을 버퍼에 저장할 수 있으며 송신측은 확인 응답이 도착하기 전에 전송된 패킷들에 대한 사본을 가지고 있어야 한다. 이 프로토콜에서는 확인 응답 번호는 누적된 값이며, 수신되기를 기대하는 다음 패킷의 순서번호를 의미한다. 예를 들어 확인응답번호(ackNo)가 7이라는 것은 처음부터 6번까지의 순서번호를 갖는 패킷 모두가 안전하게 도착했고 수신측은 번호 7을 갖는 패킷의 수신을 기다리고 있다는것을 의미한다.

송신 윈도우는 전송중이거나 전송될 데이터 패킷의 순서번호를 포함하는 가상의 상자를 나타낸다. 윈도우의 최대 크기는 2^m-1이며(m은 순서번호 필드의 비트수) 세개의 변수가 윈도우의 크기와 위치를 정의하는데, 이 변수들은 각각 Sf, Sn, Ssize 이다. Sf변수는 첫번째(가장 오래된)미해결 패킷의 순서번호를 나타낸다. Sn변수는 전송할 다음 패킷에 설정될 순서번호를 나타낸다. 마지막으로 Ssize변수는 이 프로토콜에서 고정 값을 가지는 윈도우의 크기를 나타낸다.


위 그림에서 컬러로 표시된 영역은 이미 전송은 되었지만 아직까지 확인응답되지 않은 패킷에 속하는 순서번호를 포함한다. 송신측은 이러한 패킷들이 수신측에서 수신되었는지 손실되었는지를 확인하기 위하여 기다린다. 이러한 패킷들을 미해결(outstanding)패킷이라고 한다. 그 오른쪽 하얀색 부분은 전송할 수 있지만 해당 데이터가 아직 응용계층으로부터 수신되지 못한 패킷의 순서번호이며, 굵은 상자 오른쪽의 부분은 윈도우가 이동하기 전까지는 비록 프로세스로부터 데이터를 수신하더라도 패킷을 전송할 수 없는 순서번호를 나타낸다. 이때 ackNo=6인 확인응답이 도착하였다면, 이것은 수신측에서 순서번호 6을 가지는 패킷을 기다리고 있다는 것을 의미한다.


N-프레임-후퇴에서 수신 윈도우의 크기는 항상 1이다. 수신측은 항상 특정 패킷을 기다린다. 순서에 어긋나게 도착한 패킷은 폐기되며 재전송 되어야 한다. 이때 Rn이라는 변수 하나만이 필요하다. 단지 순서번호가 Rn으로 설정된 패킷만이 수신되며 확인응답된다. 

송신측에서는 하나의 타이머를 가지고 있으며, 타이머가 만료되면 모든 미해결 패킷들을 재전송한다. 예를 들어 송신측에서 이미 패킷 6(Sn=7)을 전송하였지만 타이머가 만료되었다고 가정하자. 만일 Sf=3 이면 패킷 3,4,5,6 네개의 패킷이 아직까지 확인응답 되지 않았다는것을 의미한다. 타이머가 만료되면 송신측은 패킷3부터 패킷6까지 네개의 패킷을 재전송한다. 이것이 이 프로토콜을 N-프레임-후퇴라고 부르는 이유이다. 타임아웃이 발생되면 기기는 N위치만큼 후퇴하며 모든 패킷을 재전송한다.


이제는 송신 윈도우의 크기가 2^m 보다 작아야 하는 이유를 설명하려고 한다. 예를 들어 m=2라고 하면, 윈도우의 크기는 2^m-1=3이 된다. 만일 윈도우의 크기가 3(즉 2^m보다 작은 값)이고 세개의 확인응답이 모두 손실된다면 타이머가 만료된 후에 세개의 패킷 모두는 재전송된다. 여기에서 수신측은 패킷0이아닌 패킷 3의 수신을 기대하며, 따라서 중복되어 수신된 패킷들은 올바르게 폐기된다. 반면에 윈도우의 크기가 4(즉 2^m과 같은값)이고 확인응답이 모두 손실된다면, 송신측은 패킷0의 복사본을 전송할 것이다. 그런데 수신측은(다음 싸이클의) 패킷0의 수신을 기대하며, 따라서 수신측은 패킷 0을 복사본이 아닌 다음 사이클의 첫번째 패킷으로 간주하고 받아들인다. 이것은 명백한 오류를 유발한다. 


N-프레임-후퇴 프로토콜과 정지 대기 프로토콜과는 유사한 면이 있다는 것을 발견할 수 있을 것이다. 정지 대기 프로토콜은 실제로 순서 번호가 0과 1의 단지 두 번호만 가지며 송신 윈도우의 크기가 1인 N-프레임-후퇴 프로토콜이다. 다시 말하면,  m=1이고, 2^m-1=1이다. N-프레임-후퇴에서는  modulo 2^m 의 연산방식을 사용한다. 정지 대기에서 연산 방식은 modulo 2 이며, 이것은  m-1인 경우의  2^m 의 값과 동일하다.


4. 선택적 반복 프로토콜(Selective-Repeat, SR)

N-프레임-후퇴 프로토콜은 수신측 프로세스를 간단하게 할 수 있다. 수신측은 단지 하나의 변수만 관리하면 되고 또한 순서에 어긋나게 들어온 패킷을 버퍼에 저장할 필요 없이 단순하게 폐기하면 된다. 그렇지만 이 프로토콜은 하부의 네트워크 프로토콜에서 많은 패킷이 손실되는 경우에는 비효율적이다. 하나의 패킷이 손실되거나 훼손될때마다, 비록 여러개의 패킷이 오류없이 안전하지만 순서에 어긋나게 도착했다 하더라도 송신측은 모든 미해결 패킷들을 재전송한다. 만일 네트워크 계층에서 네트워크의 혼잡으로 인하여 많은 패킷이 손실된다면, 이러한 미해결 패킷을 재전송으로 인하여 혼잡은 더 심해지게 되고 궁극적으로는 더 많은 패킷이 손실되게 된다.


선택적 반복 프로토콜에서는 이름에서 알 수 있듯이 실제로 손실된 패킷만 선택적으로 재전송된다. 여기서 송/수신 윈도우는 둘 다 2^(m-1) 크기를 갖는다. 예를 들어, m=4이면, 순서 번호는 0에서 15까지이지만 윈도우의 최대 크기는 단지 8(N-프레임-후퇴의 경우 최대 윈도우 크기는 2^m-1인 15)이다. 예를 들어 m=2를 선택하면 윈도우의 크기는 2^(2-1)=2 가 된다. 윈도우의 크기가 2이고 모든 확인응답이 손실되면, 패킷 0에 대한 타이머는 만료되어 패킷 0이 재전송된다. 그렇지만 수신측 윈도우는 패킷0이 아닌 패킷 2를 수신하기를 기대하며 따라서 이러한 중복수신된 패킷은 올바르게 폐기된다. (순서 번호 0은 윈도우 내의 번호가 아니다) 만약 윈도우의 크기가 3이고 모든 확인응답이 손실되면, 송신측은 패킷 0의 복사본을 전송한다. 그렇지만 수신측 윈도우는 패킷0(0은 윈도우의 일부분)의 수신을 기대하고 있으며, 따라서 수신측은 패킷 0을 복사본이 아닌, 다음 사이클에 속하는 패킷으로 간주하고 받아들인다. 이것은 명백한 오류이다.


선택적 반복 프로토콜에서는 수신 윈도우만큼의 패킷들이 순서에 어긋나게 도착하더라도 버퍼에 저장되며, 순서에 맞는 패킷만이 응용 계층으로 전달된다. 송신 윈도우와 수신 윈도우의 크기가 동일하기 떄문에, 송신 윈도우에 있는 모든 패킷들이 순서에 어긋나게 도착할 수 있고, 또한 이렇게 전송된 패킷들은 응용 계층으로 전달되지 않고 버퍼에 저장된다. 단, 신뢰성 있는 프로토콜에서는 수신측은 순서에 어긋난 패킷을 응용 계층으로 전달하면 절대로 안된다는 사실을 명심해야 한다. 

이론적으로 선택적 반복에서는 각각의 미해결 패킷마다 하나씩의 타이머를 사용한다. 타이머가 만료되면 해당 패킷이 재전송된다. 다시 말하면,  N-프레임-후퇴 프로토콜에서는 미해결 패킷들을 하나의 그룹으로 처리하지만, 선택적 반복 프로토콜에서는 미해결 패킷들을 독립적으로 처리한다. 그렇지만 선택적 반복을 구현하는 대부분의 전송 계층 프로토콜은 단지 하나의 단일 타이머만 사용한다.

두 프로토콜 사이에는 또다른 차이점이 있다. N-프레임-후퇴에서 ackNo는 누적이다. 즉, ackNo는 수신하기를 기대하는 다음 패킷의 순서 번호를 나타내며, 이 번호 이전의 모든 패킷들은 모두 잘 도착했다는 것을 의미한다. 선택적 반복에서 확인응답의 의미는 다르다. 선택적 반복에서 ackNo는 오류 없이 수신된 하나의 단일 패킷의 순서 번호를 나타내며, 다른 패킷들에 대한 어떠한 피드백도 제공하지 않는다.


* 양방향 프로토콜 : 피기배킹(piggybacking)

위 네개의 프로토콜은 모두 단방향이다. 즉, 데이터 패킷은 한 방향으로 전송되며 확인 응답은 반대의 방향으로 전송된다. 실제로는 데이터 패킷은 클라이언트로부터 서버로, 그리고 서버로부터 클라이언트로의 양쪽 방향 모두로 전송되는 것이 일반적이다. 이것은 확인 응답도 역시 양방향으로 전송될 핋요가 있다는 것을 의미한다. 피기배킹이라는 기술은 양방향 통신의 효율을 향상시키기 위하여 사용된다. A로부터 B로 데이터를 전달하는 패킷은 또한 B로부터 수신한 패킷에 대한 확인응답과 관련된 피드백 정보도 같이 전달할 수 있다. 마찬가지로 B에서 A로의 데이터를 전달하는 패킷에는 또한 A로부터 수신된 패킷에 대한 확인 응답과 관련한 피드백 정보도 같이 전달할 수 있다. 아래 그림은 피기배킹을 이용하여 양방향 통신이 가능한 GBN의 개략적인 동작을 보여준다.



출처 : TCP/IP 프로토콜 4e. 13장(책에 수식 오류가 있어 정정하여 올림)

댓글

Holic Spirit :: Tistory Edition

design by tokiidesu. powerd by kakao.