본문 바로가기

[TCP] 혼잡 제어(Congestion Control)

by mugglim 2022. 7. 7.

호스트의 상황을 넘어 네트워크 상황으로

TCP의 각 호스트는 Send Buffer, Receive Buffer을 가지고 있다. 송신 호스트의 Send Buffer는 수신 호스트의 Receive Buffer 여유 공간에 영향을 받는다. Receiver Buffer의 정보는 TCP 헤더의 Window Size에 담겨 보내진다. 여기에 네트워크의 혼잡 상태를 추가로 적용한 예시를 확인해보자.

상황 1

네트워크 상황이 좋아 최대 100개의 패킷을 보낼 수 있다. 하지만 수신자의 Receive Buffer의 여유 공간은 50 패킷 정도이다. 이때 송신자는 최대로 50개의 패킷만 보낼 수 있다.

상황 2

상황 1과 반대로 네트워크 상황이 좋지 않아 최대 30개의 패킷만 보낼 수 있다. 여전히 수신자의 Receive Buffer의 여유 공간은 50패킷 정도이다. 이 때는 Receiver Buffer의 여유 공간이 아닌 네트워크의 상황을 고려하여 최대로 30개의 패킷을 보낼 수 있다.

두 상황을 통해 말하고자 하는 것은 송신자가 최대로 보낼 수 있는 패킷의 크기는 네트워크의 혼잡 상태를 영향받는다는 것이다.

Congestion Control

Congestion Control은 네트워크의 상황을 고려하여 송신자가 보낼 수 있는 최대 패킷의 수를 제한하는 방법이다. 네트워크는 공유자원이기 때문에 Congestion Control을 하지 않는다면 모두에게 악영향을 미치게 된다. 예를 들어, 연휴 고속도로에 교통사고가 발생해 차선이 막혔는데 아무도 해결하려 하지 않고 직진하면서 무작정 해결되기만을 바라는 상황과 같다.

어떻게 네트워크 혼잡을 감지하나?

TCP는 호스트 간(End to End) 통신이다. 호스트에서 대부분의 기능을 하며 라우터는 별도의 역할을 하지 않는다. 호스트는 패킷이 유실될 때 네트워크가 혼잡되어 있다고 판단한다.

패킷이 유실되는 경우는 2가지이다.

1. Timeout : 전송된 패킷이 유실되거나, 피드백을 받지 못한 상황
2. 3 duplicate ACKs : 동일한 ACK를 3번 피드백을 받은 상황 (총 4번 ACK를 받은 경우)

1번과 2번 모두 패킷이 유실된 경우이다. 그런데 한 가지 주의해야 할 점이 있다. 1번과 2번의 네트워크 혼잡 상태가 동일할까? Timeout은 패킷 송신을 실패하거나 피드백을 받지 못한 경우이다. 3 duplicate ACKs는 다른 패킷은 잘 전송고, 적어도 유실된 패킷에 대해 피드백을 3번이나 받은 경우이다. 즉, 1번 상황이 2번 상황보다 혼잡 상태가 심한 경우이다. 그래서 동일하게 패킷이 유실되었더라고 다른 상황이라고 인식 후 대응해야 한다.

Congestion Control Phase

Congestion Control은 3가지의 단계(Phase)로 구성된다. 송신자가 최대로 보낼 수 있는 패킷의 크기를 MSS(Maximum Segement Size)라고 한다.

Step 1 : Slow Start

Slow Start는 아직 혼잡이 발생하지 않은 단계이다. 그래서 MSS를 지수적으로 증가시킨다.

Step 2 : Additive Increase

MSS의 값이 임계값(threshold)에 도달한 상태이다. 선형적으로 MSS를 증가시킨다. 초기의 임계값은 설정된 값이거나, 패킷의 전송 속도인 MSS/RTT를 통해 설정할 수 있다. (다른 TCP 연결의 Threshold를 사용할 수 있기도 하다.)

Step 3 : Multiplicative Decrease

패킷 유실을 탐지하여 MSS를 줄이는 단계이다. Timeout이 발생하면 MSS를 1로, 3 duplicate ACKs인 경우는 절반으로 줄인다. 과감히 윈도우 크기를 절반으로 줄이는 이유는 네트워크 혼잡을 빠르게 해결하기 위함이다.

참고로, TCP의 정책에 따라 3 duplicate ACKs의 대응이 다르긴 하다. 초기 TCP 정책 Tahoe는 Timeout과 3 duplicate ACKs을 동일하게 대응하며, Reno는 Timeout은 MSS를 1로, 3 duplicate ACKs는 절반으로 줄인다.

이번 포스트를 통해 TCP의 혼잡 제어를 알아보았습니다. TCP Flow Control을 작성하면 글이 길어질 것 같아, 이후에 다른 포스트에 정리해보겠습니다.

Ref.

본 글은 KOCW 컴퓨터네트워크(한양대학교 이석복 교수님) 강의롤 참고하여 작성하였습니다. 잘못된 내용이 있으면 자유롭게 댓글로 달아주시길 바랍니다.

'Computer Science > Network' 카테고리의 다른 글

[HTTP] HTTP/2는 정말로 HOL blocking를 해결했을까?  (0) 2022.07.22
[IP] IP fragmentation, reassembly  (0) 2022.07.18
[TCP] Fast Retransmission  (0) 2022.07.18
[HTTP] HTTP란?  (0) 2022.07.11
[TCP] 파이프 라이닝(Pipelining)  (0) 2022.07.06

댓글