최근에 이 알고리즘을 시험에서 만난 적이 있어서 호다닥 정리해보려고 한당.
네트워크 패킷을 줄이기 위해 개발된 알고리즘
ACK를 받을 때까지 출력 버퍼에 데이터를 저장하였다가 한번에 보내는 방식이다.
TCP소켓에는 Nagle 알고리즘을 기본으로 사용하고 있다.
nagling이라는 방법으로 TCP 애플리케이션의 송신 측에서 데이터를 처리한다.
작은 크기의 메시지를 탐지해서 유선을 통해 데이터를 보내기 전에 더 큰 TCP 패킷에 누적해서 불필요하게 많은 수의 작은 패킷이 생성되는 것을 방지한다.
Nagle 알고리즘은 지연 시간이 추가된 대신 네트워크 연결의 대역폭을 보다 효율적으로 활용할 수 있다.
응용 프로그램은 TCP_NODELAY 소켓 프로그래밍 옵션을 사용해서 Nagle 알고리즘 사용을 제어한다.
Window, Linux, Java 시스템은 일반적으로 Nagle을 활성화하기 때문에 해당 환경에서 사용되는 응용 프로그램에서 Nagle 알고리즘을 OFF하기 위해서는 TCP_NODELAY를 지정해야 한다.
Nagle 알고리즘을 끄기 위해 자바에서의 설정 방식을 알아보았다.
자바는 소켓 통신이 가능하다는 장점을 가지고 있는데, Socket 클래스를 가지고 있다.
// 위 함수를 통해 TCP_NODELAY를 끄고 킬 수 있다.
// true로 할 경우 Nagle 알고리즘을 off하는 것
// false로 할 경우 Nagle 알고리즘을 on하는 것이다.
void setTcpNoDelay(boolean on)
// 현재 TCP_NODELAY의 상태를 알아보는 것
boolean getTcpNoDelay()
// Nagle 알고리즘 해제 코드
Socket s = new Socket();
...
if (!s.getTcpNoDelay()) s.setTcpNoDelay(false);
서버를 개발할 때에는 이러한 장단점에 맞춰 Nagle 알고리즘을 On/Off 시킨다.
컴퓨팅에서 대역폭은 주어진 경로를 통한 데이터 전송의 최대 속도이다.
네트워크에서 대역폭은 논리적 또는 물리적 통신 경로의 최대 처리량을 정의한다.
네트워크 장치에서 일정 시간 내에 흐르는 데이터의 양을 말한다.
웹 사이트에 트래픽이 많다는 것은 사용자 접속이 많아서 전송하는 데이터의 양이 많다는 것을 뜻한다.
트래픽이 너무 많으면 서버에 과부하가 걸려서 기능에 문제가 생길 수 있다.
참고 - TCP 네트워크 통신을위한 Nagle 알고리즘
참고 - [JAVA] 소켓 옵션 설정하기(Client)