네이글(Nagle) 알고리즘이란?
네이글 알고리즘이 처음 소개된 RFC 896을 보면...
작은 패킷과 관련하여 특수한 문제가 있다. 키보드로 작성한 단일 문자를 TCP로 전송하면 일반적으로 41 바이트(1 바이트의 데이터, 40 바이트의 헤더)의 패킷이 된다. 이 4000%의 오버헤드는 짜증나지만 부하가 적은 네트워크에서는 견딜만한 수준이다. 그러나 혼잡한 네트워크에서는 이 오버헤드로 인해 손실, 재전송 등의 문제가 발생할 수 있다. 실제로 처리량이 너무 낮아지면 TCP 연결이 중단될 수도 있다.
라는 내용이 있는데, 요약하자면 1 바이트를 보내려고 수십 바이트의 헤더를 덧붙이는 게 싫다는 말이다.
이는 타이머 등을 활용해서 해결할 수도 있었지만 여러 문제가 있었기에, John Nagle은 아래의 해결책을 제시한다.
⋯간단하고 우아한 해결책이 발견되었다. 이전에 송신한 데이터가 아직 ACK되지 않았다면, 다음 데이터의 송신을 보류하는 것이다. 다른 조건은 필요하지 않다. 프로그램 내부에 1~2줄만 추가하면 된다.
생각보다 단순한 해결책이다.
송신한 패킷이 ACK될 때까지 기다린다는 뜻인데, 그림으로 나타내면 아래와 같다.
결과적으로 네이글 알고리즘을 적용하면 응답 속도가 느려질 수도 있다. (물론 상황에 따라 다르다. 위는 이상적인 예시)
그러나 패킷의 총량을 줄임으로써 네트워크 및 호스트에 가해지는 부하를 줄일 수 있다.
별다른 설정을 하지 않았다면 네이글 알고리즘은 기본적으로 적용이 되어 있다.
모종의 이유로 네이글 알고리즘을 꺼야 한다면, 여러 방법이 있겠으나 Winsock에서는 setsockopt 함수를 사용하면 된다.