본문 바로가기
TCP/IP

Nagle 알고리즘

by 상레알 2011. 5. 2.
출처 : http://depiness.egloos.com/772710
       : http://www.joinc.co.kr/modules/moniwiki/wiki.php/man/12/Nagle


1. 일반 네트워크 통신 방법

일반적인 통신 알고리즘은 데이터는 패킷으로 만들어 보낸다는 것이며 수신 호스트는 이에 대한 ACK를 보낸다는 것이다.

예를 들어  A,B 두 호스트가 통신을 한다고 했을때 A는 B에게 'Nagle' 라는 데이터를 보내기 원하면, 먼저 'N'이라는 데이터

를 패킷으로 만들어 출력 버퍼로 보내고 ACK를 받고 안받고 관계없이 'a'를 패킷으로 만들어 보내고 이어서

'g', 'l','e' 각 데이터를 패킷으로 만들어 보낸다. 수신호스트로부터의 ACK가 언제 오는가는 전혀 관계가 없고,

언제 오든지 오기만 하면 되는 것이다.


2. Nagle 알고리즘

네트워크에서 Nagle 알고리즘은 "가능하면 조금씩 여러 번 보내지 말고 한번에 많이 보내라(Effective TCP)" 라는

원칙을 기반으로 만들어 진 알고리즘이다.

Nagle 알고리즘의 원리는 ACK를 받은 다음에 데이터를 보내고 ACK를 받을 때까지 출력 버퍼의 데이터를 저장하였다가

ACK를 받으면 버퍼의 데이터를 모두 패킷으로 만들어 보낸다는 것이다. 예를 들어 A가 'N' 이라는 데이터를 패킷으로

만들어 보내고, 계속해서 다음 데이터를 보내는 것이 아니라 출력버퍼로 보내어 저장시켜 둔다. 그러다가 ACK가 오면

출력버퍼에 저장된 'agle' 라는 데이터를 보낸다.

즉, Nagle 알고리즘은 한번의 세그먼트로 보낼 수 있는 패킷이 있는데, 이것을 여러 개의 세그먼트로 보낸다면 전송효율이

떨어지기 때문에  필요 이상의 작은 세그먼트들을  병합해서 보내는 것이다.  

Nagle 알고리즘은 세그먼트 크기를 구하는 공식에 의해 결정된 크기보다 작은 세그먼트들은 전송된 세그먼트의 수신이

확인되거나 완전한 크기의 세그먼트가 전송될 수 있을 때까지 지연시키는 방법으로 전송 효율을 높인다.


- 장.단 점 .

장점으로는   전체적으로 네트워크의 전송 효율을 높일 수 있다. 

하지만 단점으로는  세그먼트가 모일 때까지 지연될 수 있는 단점이 있다.

예를 들어 반응 속도가 중요시한 온라인 게임 등 에 Nagle 알고리즘을 적용시킬 경우 반응속도가 떨어질 수 있다.

이런 이유로 서버쪽은 Nagle 알고리즘을 활성화 하고 클라이언트측은 Nagle 알고리즘을 비활성 하는 등의 방법을 사용한다.


Nagle 알고리즘 비활성화 는   TCP_NODELAY 라는   옵션을 사용하여 Nagle  알고리즘을 제거 할 수 있다.

-  TCP_NODELAY 옵션
   1(TRUE) : Nagle 알고맂믕르 적용하지 않는다.
   2(FALSE): Nagle 알고리즘을 적용

int opt_val=TRUE;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt_val,sizeof(opt_val));

해당 옵션의 사용은 네트워크 부하를 극대화 시켜주면서 서버의 전체적인 성능을 무척 감소하기 때문에 꼭 필요한 

경우에만  주의해서 사용해야 한다.

 전송은 작은 단위로 자주 이루어지지만 즉각적인 응답은 필요 없는 어플리케이션에서만 사용 되어야 합니다.
(
마우스 움직임 같은)

Nagle 알고리즘은 리얼타임시스템에서의 제어와 특히나 인터렉티브한 키 입력을 하는 어플리케이션에서는 안 좋은

영향을 미친다. 선택적으로 Nagle 알고리즘을 통과하는 한가지 방법은 Out-of-bind 메시지 시스템을 쓰는 것 입니다.

그러나 이것은 내용물에 제약이 있고 또 다른 문제 (순서의 상실:loss of sequentialiy)를 일으킬 수 있다. 

'TCP/IP' 카테고리의 다른 글

getsockopt() , setopt () 함수  (0) 2011.05.02
ioctl : 장치 제어 함수  (0) 2011.04.29
소켓 함수 및 헤더들  (0) 2011.02.07
sendto()  (0) 2010.03.28
SOCKADDR_IN 구조체  (0) 2010.03.28
SOCKET() 함수  (0) 2010.03.25
Linux: SOCK_PARCKET  (0) 2009.12.03
ICMP 프로토콜  (0) 2009.11.16
인터넷 소켓 활용  (0) 2009.08.31
TCP/IP 열혈 강의  (0) 2009.08.12