Nagle 알고리즘

nayoon·2021년 11월 15일
0

CS 공부

목록 보기
4/4

최근에 이 알고리즘을 시험에서 만난 적이 있어서 호다닥 정리해보려고 한당.

Nagle(네이글) 알고리즘

정의

네트워크 패킷을 줄이기 위해 개발된 알고리즘

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);
  • on = true: delay가 없다는 뜻으로 Nagle 알고리즘을 위한 버퍼링 옵션을 끈다는 것이다.
  • off = false: delay가 있도록 해서 출력 버퍼에 패킷을 모아서

장단점

장점

  • 생산하는 패킷량이 줄어 네트워크 사용 효율이 높아진다.
  • 특히 대역폭이 낮은 WAN에서 빈번한 전송을 줄이게 됨으로 효과적인 대역폭 활용이 가능해진다.

단점

  • ACK를 기다리기 때문에 전송이 지연되어(딜레이 발생) 속도가 저하된다.
  • TCP에서만 사용할 수 있고 UDP를 포함한 다른 프로토콜은 Nagle 알고리즘을 지원하지 않는다.
  • 인터넷 전화나 1인칭 슈팅 게임과 같이 빠른 네트워크 응답이 필요한 TCP 응용 프로그램에 Nagle 알고리즘이 적용되면 제대로 작동하지 않을 수 있다.
  • 네트워크가 느린 환경에서 Nagle 알고리즘을 적용할 경우 단순한 타이핑마저 느려질 수 있다.

서버를 개발할 때에는 이러한 장단점에 맞춰 Nagle 알고리즘을 On/Off 시킨다.

대역폭

컴퓨팅에서 대역폭은 주어진 경로를 통한 데이터 전송의 최대 속도이다.

네트워크에서 대역폭은 논리적 또는 물리적 통신 경로의 최대 처리량을 정의한다.

트래픽

네트워크 장치에서 일정 시간 내에 흐르는 데이터의 양을 말한다.

웹 사이트에 트래픽이 많다는 것은 사용자 접속이 많아서 전송하는 데이터의 양이 많다는 것을 뜻한다.

트래픽이 너무 많으면 서버에 과부하가 걸려서 기능에 문제가 생길 수 있다.

참고 - TCP 네트워크 통신을위한 Nagle 알고리즘
참고 - [JAVA] 소켓 옵션 설정하기(Client)

profile
뚜벅뚜벅 열심히 공부하는 개발자

0개의 댓글