TCP 세그먼트의 체크섬 필드는 단순히 데이터의 훼손 여부만 나타내므로 패킷 자체의 유실, 잘못된 순서로 전송되는 등의 상황에는 이것만으로는 대처할 수 없다. 따라서 TCP는 연결 수립 이후 오류·흐름·혼잡 제어를 통해 신뢰성있는 전송을 보장한다.
ARQ(Automatic Repeat Request, 자동 재전송 요구)란 수신 호스트의 응답(ACK)과 타임아웃을 토대로 문제를 진단하고, 문제가 생긴 메시지를 재전송함으로써 신뢰성을 확보하는 방식이다.
ARQ를 사용하는 프로토콜이나 계층은 TCP나 전송 계층에 국한된 것은 아니다.
제대로 전달했음을 확인하기 전까지는 새로운 메시지를 보내지 않는 기법이다.
파이프라이닝 기반 ARQ의 일종으로, 여러 세그먼트 전송 중 오류가 발생하면 해당 세그먼트부터 전부 재전송하는 기법이다.
TCP의 빠른 재전송
재전송 타이머가 만료되기 전이라도 세 번의 동일한 ACK 세그먼트를 받았다면, 타임아웃이 발생했다고 간주하고 곧바로 세그먼트를 재전송한다.
선택적으로 반복하여 세그먼트를 재전송하는 기법이다. 오늘날 대부분의 호스트는 Selective Repeat ARQ를 지원하며, 이를 사용하지 않을 경우 Go-Back-N ARQ로 동작하게 된다.
Go-Back-N ARQ와 Selective ARQ를 시각적으로 확인할 수 있는 학습 사이트
https://www.tkn.tu-berlin.de/teaching/rn/animations/gbn_sr/
수신 호스트가 한 번에 받아 처리할 수 있을 만큼만 전송하는 기법이다. 수신 호스트가 한 번에 n개의 바이트를 처리할 수 있다면, 송신 호스트는 n개의 바이트를 넘지 않는 선에서 송신해야 한다. TCP 헤더의 윈도우 필드에는 수신 호스트가 한 번에 처리할 수 있는 수신 윈도우 크기가 명시되어 있다.
Stop-and-Wait ARQ를 사용하면 별도의 흐름 제어가 필요없지만, 파이프라이닝 기반의 Go-Back-N ARQ와 Selective Repeat ARQ에서는 흐름 제어가 필요하다. TCP의 흐름 제어는 슬라이딩 윈도우를 사용하여 실현된다.
수신 호스트로부터 1, 2, 3, …,k 번째 세그먼트에 대한 ACK 응답을 받았다면, 윈도우가 점차 오른쪽으로 미끄러지듯이 움직이며 그 다음 세그먼트를 전송하게 된다.
송신 측의 윈도우도 있다. 따라서 수신 호스트는 TCP 헤더를 통해 송신 호스트에게 자신이 받을 수 있는 데이터의 양을 미리 알려준다.
TCP의 혼잡 제어에서 송신 호스트는 네트워크의 혼잡한 정도에 맞춰 유동적으로 전송량을 조절한다. 흐름 제어에서 수신 호스트가 헤더로 알려주는 반면, 혼잡 제어에서는 송신 호스트가 알아서 혼잡 윈도우를 직접 계산하여 알아내야 한다. 따라서 흐름 제어의 주체가 수신 호스트에, 혼잡 제어의 주체는 송신 호스트에 가깝다고 할 수 있다.
그렇다면 송신 호스트는 혼잡 윈도우의 크기를 어떻게 결정할 수 있을까? 이를 결정하는 대표적인 알고리즘은 AIMD(Additive Increase/Multiplicative Decrease, 합으로 증가/곱으로 감소)가 있다. AIMD는 혼잡이 감지되지 않으면 혼잡 윈도우를 RTT(Round Trip Time)마다 1씩 선형적으로 증가시키고, 혼잡이 감지되면 혼잡 윈도우를 절반으로 감소시키는 동작을 반복한다.
RTT
메시지를 전송한 뒤 그에 대한 답변을 받는 데까지 걸리는 시간
[출처: GeeksforGeeks]
더 나아가, 송신 호스트는 이 ‘혼잡’ 상황을 어떻게 인지할 수 있을까? 그에 대한 답은 이전에 설명한 ‘오류 제어’의 오류 판단과 동일하다. 즉, ‘중복된 ACK 세그먼트를 수신하는 상황’과 ‘타임아웃이 발생하는 상황'이다.