TCP/IP 네트워크 스택의 혼잡 제어 알고리즘 진화와 커널 레벨 큐잉 지연 성능 최적화
최근 실무에서 이 기술을 프로젝트에 적용해 보면서 정말 많은 시행착오를 겪었습니다. 답답한 마음에 제가 직접 정리해 본 핵심 내용입니다.
인터넷의 근간을 이루는 TCP/IP 프로토콜 스택은 패킷 유실과 지연이 일상적으로 발생하는 불안정한 매체 위에서 신뢰성 있는 데이터 전송을 보장하기 위해 설계되었습니다. 이 신뢰성의 핵심에는 수신자의 처리 능력을 초과하지 않도록 송신량을 조절하는 흐름 제어(Flow Control)와 더불어, 중간 라우터나 스위치의 패킷 큐가 넘쳐나는 것을 방지하는 혼잡 제어(Congestion Control) 메커니즘이 자리 잡고 있습니다. 초창기 TCP 구현의 결함으로 인해 인터넷 전체가 마비되는 혼잡 붕괴(Congestion Collapse) 사태를 겪은 후, 반 야콥슨(Van Jacobson)이 제안한 슬로우 스타트(Slow Start)와 혼잡 회피(Congestion Avoidance) 알고리즘은 네트워크 엔지니어링의 패러다임을 바꿨습니다. 초기의 TCP Tahoe와 Reno 알고리즘은 패킷 유실을 네트워크 혼잡의 유일하고 절대적인 신호로 간주했습니다. 이들은 슬로우 스타트 구간에서 윈도우 크기를 지수적으로 증가시키다가, 임계치에 도달하면 선형적으로 증가시키며, 3개의 중복 ACK를 수신하여 패킷 유실을 감지하는 순간 윈도우 크기를 절반으로 뚝 떨어뜨리는 AIMD(Additive Increase Multiplicative Decrease) 방식을 사용했습니다. 이는 네트워크를 안정화시키는 데는 탁월했으나, 고속 광대역 네트워크(High BDP 네트워크)에서는 큰 대역폭을 완전히 활용하기까지 너무 오랜 시간이 걸린다는 치명적인 단점이 있었습니다.
이러한 한계를 극복하기 위해 등장한 TCP CUBIC 프로토콜은 리눅스 커널의 기본 혼잡 제어 알고리즘으로 채택되며 현대 인터넷의 표준으로 자리매김했습니다. CUBIC은 이름에서 알 수 있듯이 혼잡 윈도우 크기를 시간에 대한 3차 함수(Cubic function) 형태로 제어합니다. 패킷 유실이 발생하여 윈도우 크기가 감소한 직후에는 빠르게 윈도우를 회복시키고, 유실이 발생했던 임계점 근처에 다다르면 증가 속도를 완만하게 늦춤으로써 네트워크의 가용 대역폭을 매우 공격적이면서도 안정적으로 탐색합니다. 그런데 스트리밍 서비스와 클라우드 컴퓨팅의 발전으로 인해 대역폭뿐만 아니라 극단적으로 낮은 지연 시간(Low Latency)에 대한 요구가 커지면서 새로운 문제가 대두되었습니다. 바로 버퍼블로트(Bufferbloat) 현상입니다. 라우터 제조사들이 패킷 유실을 막기 위해 장비의 버퍼 크기를 지나치게 키우다 보니, 병목 구간에서 큐가 가득 차기 전까지는 TCP가 패킷 유실을 감지하지 못하고 계속 윈도우를 키워 막대한 지연 시간을 유발하게 된 것입니다. 패킷 유실 기반의 혼잡 제어 알고리즘이 가진 근본적인 한계였습니다.
구글이 발표한 TCP BBR(Bottleneck Bandwidth and Round-trip propagation time) 알고리즘은 이 한계를 근본적으로 타파하기 위해 혼잡의 지표를 패킷 유실이 아닌 지연 시간의 변화로 완전히 재정의했습니다. BBR은 링크의 최대 대역폭(Bandwidth)과 최소 지연 시간(RTT)을 지속적으로 측정하고 추정하여, 네트워크 병목 구간에 데이터가 과도하게 쌓이기 직전의 정확한 데이터 전송률을 계산해 냅니다. 큐에 패킷을 쌓아두지 않고 파이프의 크기에 딱 맞게 패킷을 밀어 넣기 때문에 유실 기반 알고리즘 고유의 버퍼 팽창 문제를 원천적으로 차단합니다. 특히 패킷 유실이 혼잡 때문이 아니라 비트 에러나 무선 네트워크의 물리적 간섭 때문에 무작위로 발생하는 모바일 네트워크 환경에서, 기존 알고리즘들은 억울하게 윈도우 크기를 줄여버렸지만 BBR은 이 무작위 유실을 무시하고 측정된 대역폭에 맞춰 전송을 계속 유지함으로써 경이로운 스루풋 향상을 이뤄냅니다. 그러나 BBR을 적용한 트래픽이 기존 CUBIC 트래픽과 경쟁할 경우 큐를 차지하는 방식의 차이로 인해 공정성(Fairness) 문제가 발생할 수 있다는 단점이 꾸준히 연구되며 점차 BBRv2 등으로 고도화되고 있습니다. 이러한 혼잡 제어 메커니즘의 진화는 운영체제 커널의 깊숙한 곳에서 네트워크 하드웨어와 응용 프로그램 사이의 미묘한 타이밍을 조절하는 극한의 엔지니어링 미학입니다.