엔지니어 John Nagle의 이름을 따서 명명된 Nagle 알고리즘은 TCP 응용 프로그램의 작은 패킷 문제로 인해 발생하는 네트워크 혼잡을 줄이기 위해 설계되었습니다. UNIX 구현은 1980년대에 Nagle 알고리즘을 사용하기 시작했으며 오늘날 TCP의 표준 기능으로 남아 있습니다.
Nagle 알고리즘의 작동 방식
Nagle 알고리즘은 nagling이라는 방법으로 TCP 애플리케이션의 송신 측에서 데이터를 처리합니다. 작은 크기의 메시지를 감지하고 해당 메시지를 더 큰 TCP 패킷으로 누적한 다음 유선을 통해 데이터를 전송합니다. 이 프로세스는 불필요하게 많은 수의 작은 패킷이 생성되는 것을 방지합니다.
Nagle 알고리즘에 대한 기술 사양은 1984년에 RFC 896으로 발표되었습니다. 축적할 데이터의 양과 전송 간 대기 시간에 대한 결정은 전체 성능에 매우 중요합니다.
Nagling의 이점
Nagling은 지연 또는 대기 시간을 추가하는 대신 네트워크 연결의 대역폭을 효율적으로 활용할 수 있습니다. RFC 896에 설명된 예는 잠재적인 대역폭 이점과 생성 이유를 보여줍니다.
- 키보드 키 입력을 가로채는 TCP 애플리케이션이 입력 중인 각 문자를 수신자에게 전달하려는 경우 각각 1바이트의 데이터를 포함하는 일련의 메시지를 생성할 수 있습니다.
- 이러한 메시지가 네트워크를 통해 전송되기 전에 각 메시지는 TCP/IP에서 요구하는 TCP 헤더 정보와 함께 패키징되어야 합니다. 각 헤더의 크기는 20~60바이트입니다.
- 네글링이 없으면 이 예제 애플리케이션은 95% 이상의 헤더 정보(21바이트 중 최소 20바이트)와 5% 이하의 실제 데이터로 구성된 네트워크 메시지를 발신자의 키보드에서 생성합니다. Nagle 알고리즘을 사용하면 더 적은 수의 메시지를 사용하여 동일한 데이터를 전달할 수 있으므로 대역폭을 크게 절약할 수 있습니다.
애플리케이션은 TCP_NODELA 소켓 프로그래밍 옵션으로 Nagle 알고리즘 사용을 제어합니다. Windows, Linux 및 Java 시스템은 일반적으로 기본적으로 Nagle을 활성화합니다. 따라서 이러한 환경을 위해 작성된 애플리케이션은 알고리즘을 끄기 위해 TCP_NODELAY를 지정해야 합니다.
제한 사항
화상 통화 및 온라인 게임과 같이 빠른 네트워크 응답이 필요한 응용 프로그램은 Nagle이 활성화된 경우 제대로 작동하지 않을 수 있습니다. 알고리즘이 더 작은 데이터 청크를 모으는 데 추가 시간이 걸리는 동안 발생하는 지연은 화면이나 디지털 오디오 스트림에서 시각적으로 눈에 띄는 지연을 유발할 수 있습니다. 이러한 응용 프로그램은 일반적으로 Nagle을 비활성화합니다.
이 알고리즘은 원래 컴퓨터 네트워크가 오늘날보다 더 적은 대역폭을 지원하던 시기에 개발되었습니다. 위에 설명된 예는 1980년대 초 Ford Aerospace에서 John Nagle의 경험을 기반으로 했으며, Ford의 느리고 부하가 큰 장거리 네트워크에서 nagling tradeoffs가 합리적이었습니다. 오늘날 네트워크 애플리케이션이 그의 알고리즘을 활용할 수 있는 상황이 점점 더 줄어들고 있습니다.
Nagle 알고리즘은 TCP에서만 사용할 수 있습니다. UDP와 같은 다른 프로토콜은 지원하지 않습니다.