본문 바로가기
통신 & 네트워크/네트워크 일반

[네트워크] TCP Flow Control & Congestion Control 비교

by SIES 2022. 3. 1.
반응형

TCP는 UDP와 달리 신뢰성 있는 데이터 전송을 위해 여러 가지 제어 기능을 제공합니다. 그중 대표적인 것이 flow control (흐름 제어)와 congestion control (혼잡 제어)인데 차이점을 구별할 필요가 있습니다.

 

TCP Flow Control

Flow control은 수신 클라이언트(RX)가 수행해 주는 제어 기법으로, 송신 서버(TX)와 수신 클라이언트(RX)의 데이터 처리 속도 차이로 인한 수신 버퍼 overflow를 해결하기 위한 기법입니다.

 

수신자의 데이터 처리 속도가 송신자의 데이터 전송 속도보다 빠른 것은 문제가 되지 않지만, 수신자의 데이터 처리 속도가 송신자의 데이터 전송 속도보다 느린 경우에는 문제가 발생합니다. 수신측의 처리 속도보다 빠르게 데이터가 들어오게 되면 수신측의 버퍼는 점점 차게 되고, 버퍼가 꽉 차 버리면 초과분의 데이터는 드랍이 일어나 데이터가 손실되는데 이를 수신 버퍼 overflow라고 합니다.

 

이를 방지하기 위해서, 수신 클라이언트의 처리속도에 맞춰서 송신 서버의 데이터 전송 속도를 강제로 줄일 필요가 있는데 이를 flow control이라 합니다. 이때 수신자가 송신자의 전송 속도를 제어해야 하기 때문에, 수신측이 송신측으로 자신의 수신 가능 상태를 알리는 feedback이 필요하게 됩니다.

 

1) Stop and Wait 방식

송신 서버는 한번의 데이터 전송 후 멈춘 뒤 (stop) 수신 클라이언트로부터 이전 데이터를 잘 받았다는 응답(feedback)이 올 때까지 다음 데이터 전송을 기다립니다 (wait). 수신자가 데이터를 잘 받았다는 ACK를 보내고, 이를 수신해야만 송신자는 다음 데이터를 보낼 수 있기 때문에 송신자는 과도하게 데이터를 전송할 수 없습니다. 가장 간단한 방식이지만 전송 효율이 낮아 아래의 sliding window 방식을 일반적으로 사용합니다.

 

2) Sliding Window 방식

Sliding window 방식에서는 여러 데이터 패킷을 동시에 전송해 전송 효율을 높이기 위해 윈도우라는 개념을 사용합니다. 윈도우는 송신측과 수신측에 각각 송신 윈도우(awnd), 수신 윈도우(rwnd)가 존재합니다.

 

  • 송신 윈도우(awnd): 송신자가 ACK를 수신받지 않아도 한 번에 연속적으로 전송할 수 있는 데이터양을 의미
  • 수신 윈도우(rwnd): 수신자가 수신 버퍼 overflow가 일어나지 않는 한에서 한 번에 받을 수 있는 데이터양을 의미

 

이때 서버의 송신 윈도우(awnd)의 크기를 클라이언트의 수신 윈도우(rwnd)보다 크지 않게 하면 만들면 전송량이 수신량보다 적으니 수신 버퍼 overflow를 막을 수 있습니다. 그러면서도 연속적으로 데이터를 전송할 수 있기 때문에 stop and wait 방식보다 전송 효율을 높일 수 있습니다.

 

따라서 수신자는 자신의 수신 윈도우(rwnd)의 크기를 TCP 헤더에 기록하여 송신자에게 보내주면 (feedback), 송신자는 송신 윈도우(awnd)를 수신 윈도우(rwnd)보다 작게 설정합니다. 아래 그림과 같이 수신 윈도우(rwnd) 크기는 현재 비어있는 수신 버퍼의 크기로 계산됩니다.

 

(※ 참고로 수신 버퍼 데이터는 어플리케이션의 처리 속도가 전송 속도보다 느리거나, TCP의 in-order delivery에 의해 앞선 순번에 빠진 패킷이 존재할 때 버퍼링됩니다.)

 

Figure 1. TCP receive buffer

 

TCP Congestion Control

Congestion control은 송신 서버(TX)가 수행해 주는 제어 기법으로, 송신 서버(TX)의 데이터 전송과 네트워크의 처리 속도 차이로 인한 네트워크 혼잡을 해결하기 위한 기법입니다.

 

송신자가 데이터 전송량을 늘리면 네트워크 경로 상의 라우터에는 과부하가 걸려 전송 지연시간이 증가하거나 버퍼 overflow로 데이터 드랍이 일어나는데 이를 네트워크 혼잡이라고 합니다. 혼잡으로 인해 데이터가 드랍되면, TCP는 드랍된 데이터를 재전송하기 때문에 네트워크 혼잡이 더욱 가중됩니다.

 

이를 위해 송신 서버는 네트워크 혼잡을 해결하고 방지하기 위해 자신의 전송 속도를 조절할 필요가 있는데 이를 congestion control이라 합니다. 라우터는 여러 서버들이 동시에 사용하는 자원이며, 이러한 라우터가 경로 상에 다수 존재하기 때문에 앞서 언급한 flow control로는 네트워크 혼잡을 해결할 수 없으며, 이보다 더욱 복잡한 제어가 필요합니다.

 

Congestion control에서는 송신측에 혼잡 윈도우(cwnd)를 설정하여, 네트워크 혼잡을 방지하기 위해 전송량을 제한하게 됩니다. 앞의 flow control에서의 윈도우들과의 관계를 살펴보면 아래와 같습니다.

 

$$ awnd = \min \{cwnd,~rwnd \} $$

 

즉 송신자는 혼잡 윈도우(cwnd)와 수신 윈도우(rwnd)를 모두 만족할 만큼만 전송하여, 수신 버퍼의 overflow와 네트워크의 혼잡을 동시에 방지합니다.

 

Congestion control은 slow start, congestion avoidance, ③ fast recovery의 세 가지 state로 구성되어 있으며, 혼잡 윈도우(cwnd)를 조절하는 방식은 flow control 보다 복잡하기 때문에 다음 포스팅에서 정리해보도록 하겠습니다.

 

References

[1] J. F. Kurose and K. W. Ross, Computer Networking: A Top-Down Approach, Pearson, 2016.

[2] W. Stallings, Data and Computer Communications, Pearson, 2014.

 


네트워크 스터디의 다른 글 목록

 


오타나 잘못된 부분 있으면 댓글 부탁드립니다. 도움이 되셨다면 공감 눌러 주시면 감사하겠습니다 :)

반응형

댓글