Egloos | Log-in






Nagle's Algorithm vs Delayed ACK

Nagle's Algorithm

TCP를 통해서 패킷을 전송할 때,
전송한 패킷에 대한 ACK가 올 때까지
기다린 후 그다음 패킷을 전송하는 매커니즘을 뜻합니다.
이런 방법을 사용함으로써
ACK가 수신하기 전까지 버퍼에 쌓인 패킷들을 한번에
보냄으로써 전체적인 패킷 개수를 줄여 traffic을 감소시키는 목적이라고 합니다.

하지만, ACK가 올 때까지 다음 패킷 전송이 대기하기 때문에
응답성이 떨어지는 단점을 초래합니다. 어플리케이션에 따라서 오히려
이 알고리즘을 적용하지 않는 것이 도움이 되기도 합니다. 그래서
소켓 API를 이용해서 이를 사용하지않도록 설정 가능합니다.

BOOL option = TRUE ;
setsockopt(s, IPPROTO_TCP, TCP_NODELAY, &option, sizeof option) ;

TDI단에서도 마찬가지로 설정가능합니다. 간단히
Flag를  TDI_SEND_NO_RESPONSE_EXPECTED로 설정하면됩니다.

TdiBuildSend( ... , TDI_SEND_NO_RESPONSE_EXPECTED , ...) ;


좀더 복잡한 방법으로는
IOCTL_TCP_SET_INFORMATION_EX의 IRP를 생성 시켜
TCP_REQUEST_SET_INFORMATION_EX구조체의  toi_id필드를
TCP_SOCKET_NODELAY 로 설정하는 방법으로도 가능합니다.



Delayed ACK

이것은 수신측입장에서 패킷을 받았을 때 이에 대하여 바로 ACK를 주는 것이 아니라
시간을 좀더 기다리다가 만약 패킷 전송할 게 생긴다면 이 때 ACK를 함께 실어 두는 방식입니다.
(약 200ms 정도 기다린다고합니다.) 이렇게 데이터와 함께 ACK를 실어서
마찬가지로 효율성을 증대하기 위함이지요...

 HKEY_LOCAL_MACHINE \SYSTEM \ CurrentControlSet\\Services \Tcpip \Parameters \Interfaces \{Adapter-id}\TcpAckFrequency 를 1값으로 설정하면 Delayed ACK 또한 해제할 수 있습니다만
전역적으로 설정되는 것이라서 실제 제품에 적용하기에는 무리가 있습니다.

즉 만약 위의 2가지 알고리즘이 모두 적용되어 있다면 최악의 경우에
패킷을 보내고 200ms 후에 ACK가 전송되는 경우가 생길 수 있습니다.
즉 송신측에서는 200ms 마다 데이터가 전송되는 것이지요~.....
이렇게된다면, 전체적인 성능이 확 떨어지게 될 것입니다.
따라서, 내가 만들고자하는 어플리케이션의 용도가 무엇인지 정확하게 판단하고
이를 사용할 것인지 아닌지를 결정해야 할것입니다.

by 견우 | 2008/10/09 10:17 | WORK | 트랙백 | 덧글(0)

트랙백 주소 : http://cjhnim.egloos.com/tb/3934879
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

◀ 이전 페이지          다음 페이지 ▶