kyuseo의 게임 프로그래밍

setsockopt의 TCP_NODELAY을 활용한 Socket의 즉시전송vs지연 전송(Nagle알고리즘) 본문

C++ 개발

setsockopt의 TCP_NODELAY을 활용한 Socket의 즉시전송vs지연 전송(Nagle알고리즘)

kyuseo 2007. 11. 6. 13:49

개요..

 

네트워크 프로그래밍에서 Nagle 알고리즘이란 "가능하면 조금씩 자주 보내지 말고 한번에 많이 보내라(Effective TCP인용)" 라는 원칙을 기반으로 만들어진 알고리즘입니다.  이 알고리즘을 소켓(Socket)에 적용, 해제하는 함수가 setsockopt 함수의 TCP_NODELAY 옵션입니다. 이 옵션을 언제 사용하면 좋은지를 어떻게 사용하면 되는지를 알아봅니다.

 

WinSock의 경우 별도로 옵션을 조정하지 않는다면 기본으로 Nagle 알고리즘이 적용이 되어있습니다. 하지만 몇몇 네트워크 프로그램에서는 네트워크의 성능보다는 빠른 응답속도가 더욱 중요하게 여기는 상황이 있습니다. 그러한 경우 setsockopt 함수의 TCP_NODELAY 옵션을 사용하여 Nagle 알고리즘을 제거 할 수 있습니다. 하지만 해당 옵션의 사용은 네트워크의 부하를 증대하여 서버의 전체적인 성능이 감소하기 때문에 꼭 필요한 경우에만 주의를 해서 사용해야 합니다.

 

 

특징

 

 

구분

특징

즉시 전송

(Nagle 알고리즘 해제)

작은 패킷도 바로 보내서 전송 속도가 빠르다.

네트워크 부하의 증가

지연 전송

(Nagle 알고리즘 사용)

작은 패킷은 한꺼번에 보내서 전송 속도가 느리다

네트워크의 부하감소

 

 

 

코드

 

- 지연전송 (Nagle 알고리즘 적용, default)

 

int nValue = 0;

setsockopt( TCP_NODELAY, &nValue, sizeof(int), IPPROTO_TCP );

(100Byte의 패킷을 5번에 보내고 에코로 받은 시간 : 100~150ms)

 

 

- 즉시전송 (Nagle 알고리즘 해제)

 

int nValue = 1;

setsockopt( TCP_NODELAY, &nValue, sizeof(int), IPPROTO_TCP );

(100Byte의 패킷을 5번에 보내고 에코로 받은 시간 : 1~3 ms)