Nagle 알고리즘의 정의
Nagle 알고리즘은 TCP 통신에서 작은 크기의 패킷을 여러 개 보내는 대신, 이를 모아서 한 번에 전송하도록 만든 최적화 기법입니다. 1984년 존 네이글(John Nagle)이 제안했으며, 목적은 네트워크에 ‘자잘한 패킷’이 과도하게 흘러다니는 것을 막아 대역폭을 효율적으로 쓰는 데 있습니다.
예를 들어 텍스트 채팅 프로그램에서 한 글자씩 입력할 때마다 패킷을 보낸다면, 실제 데이터는 1바이트인데 TCP/IP 헤더만 40바이트 가까이 붙어 전송됩니다. 이런 비효율이 반복되면 네트워크 전체 성능이 떨어지기 때문에, Nagle 알고리즘은 이전에 보낸 데이터에 대한 ACK(응답)를 받기 전까지는 작은 데이터를 모아뒀다가 한꺼번에 보냅니다.
동작 원리와 예시
Nagle 알고리즘의 규칙은 간단합니다. 전송할 데이터가 MSS(최대 세그먼트 크기)보다 작고, 아직 확인응답(ACK)을 받지 못한 데이터가 있다면, 새 데이터를 바로 보내지 않고 버퍼에 쌓아둡니다. ACK가 도착하면 그때 쌓인 데이터를 한 번에 전송합니다.
이는 마치 택배 기사가 편지 한 장 배달할 때마다 트럭을 몰고 나가는 대신, 우편함에 편지가 어느 정도 모일 때까지 기다렸다가 한 번에 배달하는 것과 비슷합니다. 효율은 좋아지지만, 편지 한 장이 급한 사람 입장에서는 답답할 수 있습니다.
실무에서 왜 문제가 되는가
문제는 이 알고리즘이 실시간성이 중요한 서비스에서는 오히려 지연(latency)을 유발한다는 점입니다. 예를 들어 온라인 게임, 실시간 채팅, 금융 거래 시스템처럼 작은 데이터를 즉시 보내야 하는 경우, ACK를 기다리는 동안 데이터가 지연되어 사용자 체감 속도가 느려집니다.
특히 ‘Delayed ACK’라는 수신 측 최적화 기법과 Nagle 알고리즘이 동시에 적용되면, 서로 상대방의 응답을 기다리는 상황이 발생해 수백 밀리초 단위의 지연이 생기기도 합니다. 이를 실무에서는 소켓 옵션 TCP_NODELAY를 설정해 해결합니다. 이 옵션을 켜면 Nagle 알고리즘을 비활성화하여 데이터를 지연 없이 즉시 전송할 수 있습니다.
결국 Nagle 알고리즘은 ‘무조건 나쁜 기술’이 아니라, 대량의 작은 패킷이 오가는 환경에서는 효율적이지만, 낮은 지연이 중요한 서비스에서는 반드시 확인하고 필요하면 꺼야 하는 옵션입니다. 개발자가 TCP 기반 서비스의 성능 이슈를 진단할 때 놓치기 쉬운 숨은 원인 중 하나로 꼽히는 이유가 여기에 있습니다.