티스토리 뷰

IT/Network

[네트워크] TCP Nagle 알고리즘

주인장 진빼이

Nagle Algorithm

네트워크상에서 돌아다니는 패킷들의 흘러넘침을 막기 위해서 1984년에 제안된 알고리즘이다.

네트워크 전송 횟수는 줄이고 작은 데이터를 여러번 전송하기보단 데이터를 묶어서 한 번에 보내는 방식을 사용한다.

 

Nagle 알고리즘은 네트워크 전송 빈도가 큰 서버에게 설정하는 것이 바람직하다. 알고리즘의 목적은 네트워크 전송 빈도를 낮추어 네트워크 부하량을 낮추어 효율성을 증가시키는 데 있다. TCP 프로토콜에서 작은 크기의 데이터를 잦은 빈도로 전송하게 되면 네트워크 효율이 감소된다. 큰 세그먼트를 묶어 전송하기 때문에 작은 크기의 세그먼트를 여러 번 보내는 것보단 느릴 수 있다. 알고리즘이 적용되면, 다음 데이터를 전송할 때 지연시간이 발생하므로 주의해서 사용해야 한다.

 

Socket 옵션(setsockopt)을 통해 Nagle 알고리즘을 적용시킬 수 있으며

기본값으로 TCP Socket 옵션엔 Nagle 알고리즘이 적용되어 있다.

 

 

Nagle 알고리즘은 언제 적용되어야 바람직할까?

데이터가 손실(Packet Loss)되어도 괜찮고 빠른 속도로 전송해야 할 필요가 있다면 UDP 통신을 이용한다.

데이터 손실이 없어야 하고, 네트워크 대역폭 여유가 있고 서버 및 클라이언트와 빠른 통신을 원한다면 Nagle 알고리즘을 미사용 하는 것이 바람직하다.

데이터 손실이 없어야 하고, 트래픽을 줄이고 싶거나 크기가 작은 데이터가 많은 경우 Nagle 알고리즘 사용하는 것이 바람직하다.

 

 

Nagle 알고리즘 적용 여부에 따른 전송 흐름

다음 그림은 Nagle 알고리즘이 적용되지 않은 상태에서의 데이터 전송 흐름을 볼 수 있다.

중요하게 봐야 할 건 Server가 데이터를 송신할 때, 클라이언트에게 ACK를 받지 않았음에도 다음 데이터를 송신하는 것이다.

Nagle OFF / NoDelay Apply

 

 

 

 

 

 

아래 그림은 Nagle 알고리즘이 적용된 상태에서의 데이터 전송 흐름을 보여주고 있다.

서버는 데이터의 송신 횟수가 알고리즘이 적용되기 이전보다 적어졌고 클라이언트가 보낸 ACK를 수신한 뒤에 다음 데이터를 전송하는 것이다.

그림과 같이 한 차례씩 데이터를 주고받으며 통신을 진행한다.

Nagle ON / Delay

 

Nagle 알고리즘의 장점과 단점

장점: 데이터의 전송 횟수가 적어 한번 전송할 때 큰 데이터로 전송하기 때문에 네트워크 부하량이 감소되며 전송 효율이 좋아진다.

단점: 지연시간(Delay)이 발생하므로 전송 속도에 영향을 끼칠 수 있다.

 

 

[WinSock2] Nagle 알고리즘 적용 해제 하기

기본적으로 TCP Socket Option에서 Nagle 알고리즘은 Apply 되어 있으므로 적용을 해제하는 작업을 다음과 같은 코드를 이용하여 적용한다.

int DelayZeroOpt = 1;
setsockopt(socket, SOL_SOCKET, TCP_NODELAY, (const char*)&DelayZeroOpt, sizeof(DelayZeroOpt));

딜레이 없음: 1 (Nagle OFF)

딜레이 있음: 0 (Nagle ON)

TCP_NODELAY Option이 가진 의미는 딜레이를 없앤다(Nagle 알고리즘 적용을 해제) 한다는 의미로 보면 된다.

댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함