TCP 흐름제어, 혼잡 제어에 이어서 오류제어에 대해 공부해보자!
지난 혼잡제어 내용 중 3 ACK duplicated
발생 시 오류 제어를 통해 원활한 데이터 전달을 복구 시킨다고 했는데, 오늘 그 내용에 대해 자세히 알아보려 한다.
오류를 제어하기 위해선 먼저 오류가 발생했음을 인지 해야 하지 않겠는가?
TCP 에서 오류를 파악하는 방법은 크게 두가지로 설명할 수 있다.
2번에서 ACK 가 TimeOut 내에 도착하지 않는 것은 송신측에서 전송한 데이터가 유실되었을 수도 있고, 수신측에서 답한 ACK 패킷이 유실되었을 수도 있다.
또, 중복된 ACK 란 보통 3개 이상이 전달 될 때 오류 발생으로 파악하며
1번 방법 사용시 송신측에 NAK 를 확인하는 새로운 로직이 필요하기 때문에 일반적으로 2번 방법을 적용해 오류를 인지한다고 한다!
흐름제어에서 등장했던 이 녀석이 왜 또 나왔을까? 이 방법만으로도 기본적인 오류 제어가 가능하기 때문이다.
송신 측에서 패킷을 보내고, 보낸 패킷에 대한 응답이 오면 다음 패킷을 보내는 방식이기 때문에 만약 packet2를 보낸 후 timeout 이 발생한다면, 즉 보낸 packet 2 에 대한 응답이 없다면, 이를 다시 전송하면 되는 것이다!
하지만 만약 Sliding Window를 사용한다면 어떨까?
Sliding Window 는 윈도우에 있는 여러개의 데이터들을 연속적으로 보내는 방식이기에 이 경우 stop and wait 으로 오류제어를 한다면 sliding window 을 이용하는 의미가 전혀 없을 것이다!
이러한 이유로 재전송 기반의 오류 제어, ARQ (Automatic Repeat Request)
를 사용하게 된다!
TCP는 기본적으로 재전송 기반의 오류 제어를 사용한다. 즉 통신중에 어떤 오류가 발생하면 송신 측에서 수신측으로 해당 데이터를 재전송하는 방식을 사용하여 오류 발생 상황을 해결한다는 의미이다.
하지만 실제로 수 많은 데이터를 주고 받아야 하는 네트워크 상황에서 이러한 재전송 방식은 그 자체로 비효율적이기 때문에 이러한 재전송을 최대한 적게하는 여러 방식으로 TCP는 오류를 제어한다!
ARQ를 이용한 오류 제어 방식엔 크게 두가지, Go Back N
과 Selective Repeat
이 있다!
Go Back N 에선, 송신측에서 여러개의 데이터를 연속적으로 보내다가 오류가 발생한 데이터부터 다시 재전송하는 방식을 사용한다!
위 그림에서, 송신측에서 0~2 패킷을 보낸 후 수신측은 이를 정상적으로 받은 후 송신측에게 ACK 3을 전송해 3부터 전송하면 된다고 알린다.
송신측이 3~5를 보냈는데, 그 중 4번이 유실되어 수신측이 받지 못했고, 수신측은 에러가 발생한 4번 데이터 이후의 데이터는 모두 폐기한다. 즉, 수신측에서 5번 데이터를 폐기한 후 4번이 유실되었음을 송신측에 알린다! NAK 4
이때 송신측은, 유실된 데이터인 4번부터 다시 데이터를 전송하게 되는데, 4~5를 재전송 하여 오류를 해결한다!
하지만 이러한 방식 역시 이미 수신한 데이터를 폐기하고 다시 재전송해야 한다는 단점이 존재한다. 이러한 단점을 보완하는 것이 Selective Repeat
방식이다.
이름처럼 오류가 발생한 데이터만을 골라서, 재전송하는 방식이다!
위와 동일하게 4번 패킷에서 오류가 발생했고 이를 수신측이 송신측에 알리지만, 수신측은 이미 받은 5번 데이터를 폐기 하지 않는다!
송신측은 오류가 발생한 4번 패킷만을 재전송하고 수식측이 이를 정상적으로 받으면 송신측은 다시 6번 부터 전송을 시작하면 되는 것이다.
하지만 이 때 수신측의 수신 버퍼는 어떤 형태일까?
0,1,2,3 이 차곡차곡 쌓이다가, 4번을 수신하지 못하고 5번을 수신, 이후 4,6을 수신,, 말하자면 수신측의 버퍼는 0-1-2-3-5-4-6
과 같은 순서일 것이다!
즉, Selective Repeat 방식에서는 수신측의 버퍼에 순서가 보장되지 않는다는 단점이 존재한다!
때문에 수신 버퍼에 대한 재정렬
이 필요하고, 이는 필연적으로 또 다른 버퍼 공간을 필요로 한다는 단점이 있다!
두가지 방식을 표로 정리해보면,
결국, Go Back N 처럼 재전송이냐, Selective Repeat 처럼 재정렬이냐,, 인데, 사실상 굉장히 복잡한 네트워크로 재전송을 거치는 것 보다 수신 버퍼 재전송이 보다 간단하기에 기본적으로 Selective Repeat 방식을 많이 사용한다고 한다!
오늘의 내용 역시 지난번과 같은 블로그의 글을 참고 하였다..!
이분 참 설명 잘 하시는 것 같다 찐이다 ㅎㅎ