[Computer Network] Congestion Control

G·2023년 4월 11일
0

Computer Network

목록 보기
9/20

TCP protocol에서 네트워크 혼잡을 제어하는 방법을 알아보자.
cwnd를 먼저 알아야하는데, rwnd는 흐름제어를 위한 데이터라면 cwnd는 혼잡제어를 위한 데이터이다. rwnd와 다르게 sender에서 관리하며 window size를 구하는데 사용된다.

window size = min(rwnd, cwnd)

cwnd는 sender가 보낼 데이터 패킷의 사이즈를 제어하기 위한 데이터이다.
사이즈를 제어하는 이유는 네트워크 혼잡이 일어나는 것을 방지하기 위함이다.
혼잡을 방지하기 위해 데이터의 크기를 서서히 증가시키다가 ACK loss가 발생했을 때, 이를 줄여 전송하는 데이터의 크기를 줄인다. 이러한 이유는 네트워크의 혼잡을 사전에 알 수 없기 때문이다.

예를 들어, 마치 간을 보며 절도를 하되, 훔치는 물건의 양을 걸리지 않게 서서히 올린다. 그러다 주인에게 적발됐을 경우 다음번 부턴 훔치는 물건의 양을 과거에 비해 상대적으로 적게 훔친다.

만약 혼잡제어가 없으면 어떤 일이 발생할까? rwnd의 크기를 보고 sender가 데이터를 막 보내면 무조건 혼잡이 발생할 것이다.

참고: cwnd는 패킷 단위로 설명하지만 원래 byte 단위이다.


(RTT는 왕복 지연시간이다. 데이터 패킷이 출발하고 이에 대한 ACK패킷이 오는데 걸리는 시간이다.)

위의 이미지는 Slow Start의 예시이다. Slow Start란 3 way handshake로 클라이언트와 서버가 연결된 뒤 바로 시작되는 경우이다.

처음에 연결한 후 1 byte의 데이터 패킷으로 시작한다. 이후 두 배씩 증가시키며 데이터 패킷을 전송한다. 이러한 이유로 exponential increase라 부른다.

slow start라 부르는 이유는 두 배씩 증가시킨다해도 최대 21612^{16}-1 크기를 가질 수 있는 rwnd에 비해 턱없이 작은 값으로 시작하기 때문이다.(예시에 1byte로 나타나있다.)

이는 한계점에 도달하면 2배로 증가하지 않는다. 다음 상황을 보자.

위의 예시는 2배가 아닌 상수 1을 더하며 증가시키는 모습이다. 이는 Congestion avoidance, 즉 혼잡을 회피하기 위한 상황이며 이름에 알 수 있듯이 이미 혼잡이 발생한 상태이다. 이러한 경우 +1씩만 증가시키며 간을 제대로 보고 있다. addictive increase라 부른다.

TCP congestion control


Slow Start

  • Time-out: 보낼 데이터가 없어 2개의 ACK 패킷이 왔거나, 모든 ACK 패킷이 손실되거나 다양한 원인으로 발생한다 이때, 현재 한계점을 window size의 반으로 줄이고, cwnd를 1 MSS로 변경한다.(header 제외 536 Byte 이다.)
  • 3 ACKs: cwnd를 반으로 줄이고 Cogestion avoidance로 들어간다.
  • cwndssthreshcwnd \geq ssthresh: 한계점보다 cwnd값이 커지면 Congestion avoidance로 간다.

Congestion avoidance

  • Time-out: 보낼 데이터가 없어 2개의 ACK 패킷이 왔거나, 모든 ACK 패킷이 손실되거나 다양한 원인으로 발생한다 이때, 현재 한계점을 window size의 반으로 줄이고, cwnd를 1 MSS로 변경한다.(header 제외 536 Byte 이다.) 그리고 Slow Start로 들어간다.
  • 3 ACKs: cwnd를 반으로 줄인다.: 이는 sending rate를 반으로 줄인다.

참고: Example 1

  • Time-out시 사실 1초가 더 걸리지만 이는 신경쓰지 않는다.
  • AI, MD는 상수로 증가하고 배수로 감소한다는 것을 의미한다.
  • 대부분 Addictive increase이 제일 많다.
profile
열심히 안 사는 사람

0개의 댓글