Socket 의 setTcpNoDelay 관련 정리. (Nagle 알고리즘 관련) I.lib()/I.lib(Java)2013. 6. 17. 17:11
SocketChannel 의 설정을 알아보던중에 아래와 같은 설정을 확인했다.
SocketChannel.socket().setTcpNoDelay(true);
무엇을 하는 설정인지 알아보다 귀찮음에 뒤로 미루어 두었다가 다시 한번 알아보고 정리한다.
JavaDoc 을 살펴보면 아래와 같이 설명이 되어있다.
" Enable/disable TCP_NODELAY (disable/enable Nagle's algorithm). "
한글로 풀어보니 대충
" TCP_NoDelay 기능을 사용/비사용 (Nagle`s 알고리즘을 On/OFF) "
하는 기능으로 조심스래 유추된다.
그래서 Nagle`s 알고리즘이 무엇인지 찾아보니 아래와 같은 뜻임을 알수 있었다.
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'라는 데이터를 보냅니다.
- TCP 소켓은 Default로 Nagle 알고리즘을 적용하고 있습니다.
3. Nagle 알고리즘의 장단점
- 장점 : 네트워크의 효율성이 높아짐. (똑같은 데이터를 보내더라도 생산하는 패킷이 적음)
- 단점 : 송신 호스트가 ACK를 받을 때까지 기다려야 하므로 전송 속도가 느려짐
4. 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 sequentiality)를 일으킬 수 있습니다.
위 글을 읽어보고 유추되는 setTcpNoDelay 라는 기능은 아래와 같이 정리할수 있다.
SocketChannel.socket().setTcpNoDelay(true);
-- Tcp에 딜레이가 없도록(NoDelay) 하겠다.
(즉 Nagle 알고리즘을 적용하면 Tcp에 Delay 가 있으수 있으니 Nagle 알고리즘을 적용하지 않겠다.)
SocketChannel.socket().setTcpNoDelay(false);
-- 위와 반대의 개념.
일단 위와같이 정리가 된다.
보고 도움이 되셨으면 댓글하나 달아주고 가시면 안잡아 먹습니다.
ps : 알아보고 설명해달랬더니 모르겠다고 하고 프로젝트를 나가버린 이X영씨는 이글보면 술한잔 사라~!
'I.lib() > I.lib(Java)' 카테고리의 다른 글
JVM에서 Pid 를 이용하여 Process 정보 읽기 (Attach api) (0) | 2014.01.02 |
---|---|
J2EE 란? (0) | 2013.10.30 |
Network 통신중 TIME_WAIT 관련 정보 정리 (0) | 2013.06.17 |
Deque (덱) 요약 (0) | 2013.06.05 |
[펌] ByteBuffer 설명 정리 (0) | 2013.04.23 |