본문 바로가기

네트워크/개념

[Network] - Nagle 알고리즘

네트워크 공부를 하다가 책에서 Nagle 알고리즘이라는 개념이 나와서

좀 더 찾아보고 이해한 내용에 대해 정리해 보고자 한다.

 

Nagle 알고리즘은 네트워크상에서 돌아다니는 패킷들이 흘러 넘치는 것을 막기 위해서 사용되는 알고리즘 입니다.

이는 TCP/IP 상에서 적용되는 단순한 알고리즘으로,

 

간단히 말하면, 데이터를 전송 할때 적은 양의 데이터를 여러번에 나눠서 보내는 것이 아니라 한번에 많은 양의

데이터를 모아 보내서 네트워크의 효율성을 높이는 알고리즘 입니다.

 

처음에는 'TCP 소켓의 특징이 아닌가?' 라고 생각을 했는데, 그건 기본적으로 TCP소켓은 Nagle 알고리즘을 적용해서 데이터를 전송하기 때문에 그렇다고 합니다.

 

int opt_val = 1;
setsocketopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*)&opt_val, sizeof(opt_val));

윈도우 기준으로 <winsock2.h> 헤더 파일의 함수 중 setsocketopt라는 함수를 통해 위와 같이 TCP 소켓에서도

Nagle 알고리즘을 해제 할 수도 있습니다.

 

왼쪽이 Nagle 알고리즘이 동작하는 때의 그림이고, 반대는 Nagle 알고리즘을 사용하지 않을 때 입니다.

 

다만, Nagle 알고리즘이 무조건 좋은 쪽으로 작용하는 것은 아닙니다. 분명히 네트워크의 효율성을 높일 순 있지만

이것이 데이터 전송속도가 빨라진다는 얘기는 아닙니다.

 

데이터를 송신하는 쪽에서는 수신자로부터 ACK를 받을 때까지 데이터를 출력버퍼에 모아두고 전송하지는 않기 때문에

일부 상황에서는 오히려 속도가 느릴 수 있습니다.

 

예를 들어 한번에 많은 양의 데이터를 전송한다고 쳤을 때, 굳이 Nagle알고리즘을 적용하지 않아도 한번에 

많은 양의 데이터를 출력버퍼에 밀어넣고 전송하게 된다. 이때는 패킷의 수가 크게 증가 하지도 않고,

오히려 전송 할 때마다 ACK를 확인해야 하는 Nagle 알고리즘을 적용하지 않는게 대부분의 상황에서 빠르다고 합니다.

 

-정리

Nagle 알고리즘에 대해 정리하자면 이렇습니다.

장점 데이터 전송시에 보내야할 패킷의 수를 줄여주어 네트워크의 사용을 효율적으로 함
단점 적용하지 않은 때에 비해 반응속도가 느려 질 수 있음 -> ACK 받을 때까지 출력버퍼에서 전송하지 않고 대기하기 때문에

대부분의 상황에서 적용하는 것이 좋지만, 스트리밍 서비스와 같이 매 순간 

영상 데이터를 받아야 하는 경우, 데이터가 하나라도 유실되면 뒤의 데이터 전송도 영향을 끼쳐서

오히려 사용자에게 불편함을 초래 할 수 있다.

 

따라서 상황에 따라 맞는 옵션인지를 생각해보는것이 중요합니다.