반응형
Nagle 알고리즘은 네트워크 상에서 돌아다니는 패킷들의 오버플로우를 막기 위해 1984년 제안된 알고리즘으로, 앞서 전송한 데이터에 대한 ACK 메시지를 받아야만 다음 데이터를 전송하는 알고리즘입니다.
TCP상에서 적용되는 간단한 알고리즘이고, 적용여부에 따른 데이터 송수신 방식의 차이는 다음과 같습니다.
문자열 "Nagle"을 전송할 때 알고리즘을 적용했을 때와 적용하지 않았을 때의 극단적인 상황을 보여주는 예시입니다.
왼쪽 그림에서, 데이터 'N'을 보내고, ACK가 올 때까지 출력버퍼에 a, g, l, e를 쌓다가 ACK가 도착하자 데이터 'agle'를 하나의 패킷으로 보내는 모습입니다.
1바이트의 데이터를 보내더라도 패킷의 헤더정보의 크기가 수십바이트기 때문에 위 예시에선 알고리즘을 적용했을 때가 더 효율적입니다.
다만, 용량이 큰 데이터를 전송하는 등 Nagle 알고리즘을 적용하는 것보다 적용하지 않을 때가 유리한 상황, 즉 패킷의 수가 크게 증가하지 않으면서도 ACK를 기다리지 않아 전송속도가 빨라지는 상황도 있습니다. 이 때는 Nagle 알고리즘을 중단시켜도 되는데, TCP_NODELAY를 TRUE(1)로 변경시켜주면 됩니다.
int opt_val=1;
setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (void*)&opt_val, sizeof(opt_val));
다만 전송되는 데이터의 특성을 정확히 판단하지 않은 상태에서 Nagle 알고리즘을 중단하면 트래픽에 상당한 부담을 줄 수 있으니 주의해야 합니다.
반응형
'현생 > TCP 소켓 프로그래밍' 카테고리의 다른 글
10-2. 프로세스의 현재 상태 확인 방법과 후면처리 [LINUX] (0) | 2022.01.27 |
---|---|
10-1. 다중접속서버의 필요성과 멀티프로세스 [TCP/IP][C][LINUX] (0) | 2022.01.26 |
9-4 이미 할당된 PORT번호에 재할당하는 소켓의 옵션 [TCP/IP][C][LINUX] (0) | 2022.01.25 |
9-3 입출력 버퍼를 다루는 소켓의 옵션 [TCP/IP][C][LINUX] (0) | 2022.01.24 |
9-2. 소켓의 타입을 확인하는 소켓의 옵션 [TCP/IP][C][LINUX] (0) | 2022.01.24 |