Post

TCP 흐름제어

TCP 흐름제어

흐름제어(Flow Control)

흐름제어(Flow Control)은 송신 측과 수신 측의 TCP 버퍼 크기 차이로 인해 생기는
데이터 처리 속도 차이를 해결하기 위한 방법입니다.

TCP에서 흐름제어를 사용하는 이유는
송신 측의 데이터 전송 속도가 수신 측의 데이터 처리 속도보다 빠를 경우
수신 측에서 제한된 저장 용량을 초과한 이후에 도착하는 패킷은 손실될 수 있습니다.
그렇기에 흐름제어를 사용하여 송신 측과 수신 측의
TCP 버퍼 크기차이로 인해 생기는 데이터 처리 속도 차이를 해결합니다.

TCP 버퍼는 송신 측에서 출력 버퍼에 TCP 세그먼트를 보관한 후 순차적으로 전송하기 위해,
그리고 수신 측은 도착한 TCP 세그먼트를 애플리케이션이 읽을 때까지 입력 버퍼에 보관하기 위해 사용됩니다.

흐름제어 기법의 종류

흐름제어 기법의 종류로는 Stop And Wait과 Sliding Window가 있습니다.

Desktop View

Stop And Wait 기법

Stop And Wait는 매번 전송한 패킷에 대한 확인 응답을 받아야만 그 다음 패킷을 전송하는 기법입니다.
그렇기에 오버플로우가 일어날 일은 없지만 너무 느리다는 단점이 있습니다.

Stop And Wait 과정

Desktop View

  1. 송신자가 패킷을 전송합니다.

  2. 패킷을 받은 수신자에서 패킷에 대한 ACK를 보냅니다.

이 과정을 반복하다 ACK를 받지 못해 타임아웃이 발생한다면 패킷을 재전송합니다.

Stop And Wait에서 SEQ와 ACK는 0과 1을 번갈아갑니다.

현대의 네트워크에서는 효율성이 떨어지기 때문에 Stop And Wait 기법을 사용하지 않습니다.

Sliding Window 기법

Sliding Window는 수신 측에서 설정한 윈도우 크기만큼
송신 측에서 패킷 각각에 대한 ACK없이 세그먼트를 전송 가능하고,
데이터 흐름을 동적으로 조절하는 기법입니다.

윈도우 크기는 송신자가 수신자의 ACK 없이 보낼 수 있는 데이터의 최대 크기입니다.
또한, 최초의 윈도우 크기는 3way handshaking을 통해 수신 측 윈도우 크기로 설정됩니다.

Sliding Window 종류

대표적인 Sliding Window의 종류로는 GBN(Go Back N)과 SR(Selective Repeat)이 있습니다.

GBN(Go Back N)

GBN에서 송신자는 ACK를 기다리지 않고 윈도우 크기만큼의 패킷 전송이 가능합니다.
이 방식은 정상적으로 전송되었던 가장 마지막 패킷에 대한
ACK 다음 패킷을 받을 때마다 전송하는 방식이고 중복되는 ACK를 무시합니다.
또한, 수신자는 유실되거나 순서가 잘못된 이후에 수신하는 모든 패킷을 버립니다.

송신 윈도우는 아래와 같은 그림으로 유지 됩니다.

Desktop View

GBN 과정

Desktop View

  1. 송신자에서 남은 윈도우 크기만큼 전송 대기 중인 패킷을 전송합니다.

  2. 패킷을 받은 수신자에서 패킷에 대한 ACK를 보냅니다.

  3. ACK를 받은 송신자에서 송신 윈도우에서 ACK 이하의 모든 패킷을 제거합니다.

이 과정을 반복하다 ACK를 받지 못해 타임아웃이 발생한다면
송신 윈도우에 있는 ACK를 받지 못한 모든 패킷을 재전송합니다.

GBN 단점

GBN은 손실된 패킷 이후의 모든 패킷을 재전송한다는 단점 때문에
에러율이 높아질수록 생기는 대역폭 낭비가 심해져 성능이 급격히 저하됩니다.

SR(Selective Repeat)

SR에서는 Go Back N의 단점을 보완하기 위해
송신자는 에러가 발생한 패킷에 대해서만 재전송하여 불필요한 재전송을 하지 않습니다.
따라서 수신자는 수신되는 패킷에 각각 ACK를 응답해야 하고
순서가 바뀌거나 누락된 패킷이 있다면 수신될 때까지 버퍼링 하여,
모두 수신된 경우에 상위 계층에서 순서대로 전달할 수 있습니다.

SR의 송수신 윈도우는 아래와 같은 그림으로 유지 됩니다.
또한, 송신 윈도우에는 ACK가 된 패킷 또한 존재할 수 있습니다.

Desktop View

SR 과정

Desktop View

  1. 송신자에서 남은 윈도우 크기만큼 전송 대기 중인 패킷을 전송합니다.

  2. 패킷을 받은 수신자에서 패킷에 대한 ACK를 보냅니다.

  3. ACK를 받은 송신자에서 ACK를 받은 패킷이
    송신 윈도우에서 가장 왼쪽에 있다면 송신 윈도우에서 제거합니다

이 과정을 반복하다 특정 패킷이 ACK를 받지 못해
타임아웃이 발생한다면 ACK를 받지 못한 패킷을 재전송합니다.

GBN과 SR 비교

특징GBN(Go Back N)SR(Selective Repeat)
ACK 처리 방식누적 ACK 사용개별 ACK 사용
패킷 재전송 방식손실된 패킷 이후 모든 패킷 재전송손실된 패킷만 개별적으로 재전송
수신 측 동작순서가 맞지 않은 패킷은 모두 폐기순서가 맞지 않은 패킷은 버퍼링
대역폭 효율성손실 발생 시 대역폭 낭비가 큼대역폭 효율이 높음

TCP에서의 흐름제어

TCP에서는 GBN과 SR을 혼합한 기법을 사용합니다.
GBN의 방법인 누적 ACK 방식을 사용하고
SR의 방법인 타임 아웃 또는 3개의 중복 ACK를 받을 시 하나의 패킷만 재전송하는 방법을 사용합니다.

This post is licensed under CC BY 4.0 by the author.