본문 바로가기

Etc/TCP/IP

Nagle 알고리즘

Nagle 알고리즘
기존에 전송한 패킷이 있을 경우 그 패킷에 대한 ACK를 받아야 하지만 다음 전송을 진행하는 알고리즘
Nagle 알고리즘을 적용하지 않으면 전송할 데이터가 있는 경우 ACK를 기다리지 않고 바로 전송해버리 때문이다.
따라서 네트워크의 효율적인 사용을 위해 Nagle알고리즘은 반드시 필요하다. Nagle 알고리즘을 적용하지 않으면 네트워크에 상당한 부하를 주게되어 더 좋지 않은 결과를 얻게 될 수도 있다..(빠르긴하다..)

TCP_NODELAY 옵션이 1인 경우 Nagle 알고리즘을 적용하지 않겠다는 의미이고 0인경우는 적용한다는 의미가 된다.

//
// Nagle test
//
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <netinet/ip.h>

#define TRUE 1
#define FALSE 0

int main(int argc, char *argv[])
{
    int sock;
    int state, opt_val, opt_len;

    sock = socket(PF_INET, SOCK_STREAM, 0);
    
    state = getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt_val, &opt_len);

    if(state)
    {
        puts("getsockopt() error!");
        exit(1);
    }
    printf("default nagle algorithm : %s \n", opt_val ? "disabled":"enabled");

    // nagle algorithm disabled
    opt_val = TRUE;
    state = setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt_val, sizeof(opt_val));

    if(state)
    {
        puts("setsockopt() error!");
        exit(1);
    }

    // changed nagle algorithm
    getsockopt(sock, IPPROTO_TCP, TCP_NODELAY, &opt_val, &opt_len);
    printf("changed nagle algorithm : %s \n", opt_val ?"diabled":"enabled");

    close(sock);

    return 0;
}