네이글(Nagle) 알고리즘은 엔지니어 존 네이글(John Nagle)의 이름을 딴 기술로, TCP 애플리케이션에서 발생하는 작은 패킷 문제로 인한 네트워크 혼잡을 줄이기 위해 설계되었습니다. 1980년대부터 UNIX 구현체에서 사용되기 시작했으며, 오늘날에도 TCP의 표준 기능으로 자리 잡고 있습니다.
네이글 알고리즘의 작동 원리
네이글 알고리즘은 '네글링(nagling)'이라 불리는 방식으로 TCP 애플리케이션의 송신 측 데이터를 처리합니다. 크기가 작은 메시지를 감지하면, 데이터를 네트워크로 전송하기 전에 이를 더 큰 TCP 패킷으로 모아서 전송합니다. 이 과정을 통해 불필요하게 많은 수의 작은 패킷이 생성되는 것을 방지할 수 있습니다.
네이글 알고리즘의 기술 사양은 1984년 RFC 896으로 발표되었습니다. 얼마나 많은 데이터를 모을지, 그리고 전송 사이에 얼마나 기다릴지에 대한 결정은 알고리즘의 전반적인 성능을 좌우하는 핵심 요소입니다.
네글링의 장점
네글링은 지연 시간(latency)이 추가되는 대가를 치르면서도 네트워크 연결의 대역폭을 효율적으로 활용할 수 있게 해줍니다. RFC 896에 소개된 예시는 잠재적인 대역폭 절감 효과와 이 알고리즘이 탄생하게 된 배경을 잘 보여줍니다.
- 키보드 입력을 감지하는 TCP 애플리케이션이 입력되는 각 문자를 수신자에게 전달하려면, 각각 1바이트의 데이터를 담은 일련의 메시지를 생성하게 됩니다.
- 이러한 메시지를 네트워크로 전송하려면 TCP/IP 규격에 따라 각 메시지에 TCP 헤더 정보를 포함해야 하며, 헤더 크기는 20~60바이트에 이릅니다.
- 네글링 없이는 이 애플리케이션이 생성하는 네트워크 메시지의 95% 이상(21바이트 중 최소 20바이트)이 헤더 정보이고, 실제 키보드 데이터는 5% 이하에 불과합니다. 반면 네이글 알고리즘을 사용하면 동일한 데이터를 더 적은 수의 메시지로 전달할 수 있어 대역폭을 크게 절약할 수 있습니다.
애플리케이션은 TCP_NODELAY 소켓 프로그래밍 옵션을 통해 네이글 알고리즘의 사용 여부를 제어할 수 있습니다. Windows, Linux, Java 환경에서는 일반적으로 네이글 알고리즘이 기본적으로 활성화되어 있으므로, 해당 환경에서 개발된 애플리케이션이 알고리즘을 끄려면 TCP_NODELAY를 명시적으로 지정해야 합니다.

네이글 알고리즘의 한계점
영상 통화나 온라인 게임처럼 빠른 네트워크 응답이 필요한 애플리케이션은 네이글 알고리즘이 활성화되어 있으면 성능 저하를 겪을 수 있습니다. 작은 데이터 조각들을 모으는 데 추가 시간이 소요되면서 발생하는 지연은 화면 출력이나 디지털 오디오 스트림에서 눈에 띄는 랙(lag) 현상으로 이어질 수 있습니다. 따라서 이런 유형의 애플리케이션은 일반적으로 네이글 알고리즘을 비활성화합니다.
또한 이 알고리즘은 오늘날보다 대역폭이 훨씬 낮았던 시절에 개발되었습니다. 앞서 소개한 예시는 1980년대 초 존 네이글이 포드 에어로스페이스(Ford Aerospace)에서 근무할 당시의 경험을 바탕으로 한 것으로, 당시 포드의 느리고 부하가 심한 장거리 네트워크 환경에서는 네글링의 트레이드오프가 충분히 합리적이었습니다. 하지만 네트워크 기술이 발전한 오늘날에는 이 알고리즘의 도움을 받을 수 있는 상황이 점점 줄어들고 있습니다.
참고: 네이글 알고리즘은 TCP에서만 사용할 수 있습니다. UDP와 같은 다른 프로토콜은 이를 지원하지 않습니다.