SO_TCP_NODELAY 설정(Nagle 알고리즘 비활성화)

SO_TCP_NODELAY 설정(Nagle 알고리즘 비활성화)

내가 아는 한, Nagle 알고리즘을 비활성화하는 SO_TCP_NODELAY 소켓 옵션이 있는데, 이것이 TCP/IP 스택에 구현되어 있는 것으로 나타났습니다.https://elixir.bootlin.com/linux/v4.4.90/source/net/ipv4/tcp.c#L2401. 그런데 커널에 구현된 Nagle 알고리즘의 소스코드가 어디에 있는지 모르겠습니다. 알고 계시다면 저를 도와주실 수 있나요?

답변1

짧은 답변:net_ipv4_tcp_output.c의 tcp_nagle_check()

Nagle을 피하기 위한 조건은 코드에서 확인할 수 있습니다.

/* Return false, if packet can be sent now without violation Nagle's rules:
 * 1. It is full sized. (provided by caller in %partial bool)
 * 2. Or it contains FIN. (already checked by caller)
 * 3. Or TCP_CORK is not set, and TCP_NODELAY is set.
 * 4. Or TCP_CORK is not set, and all sent packets are ACKed.
 *    With Minshall's modification: all sent small packets are ACKed.
 */
static bool tcp_nagle_check(bool partial, const struct tcp_sock *tp,
                            int nonagle)
{
        return partial &&
                ((nonagle & TCP_NAGLE_CORK) ||
                 (!nonagle && tp->packets_out && tcp_minshall_check(tp)));
}

이 함수에 가능한 호출 스택은 tcp_sendmsg_locked()->tcp_push()->__tcp_push_pending_frames()->tcp_write_xmit()->tcp_nagle_test()->tcp_nagle_check() tcp_sendmsg_locked()(net/ipv4/tcp.c)일 수 있습니다. 주요 기능은 데이터를 보내는 것입니다. 이 함수가 호출될 때마다 소켓에서 데이터 세그먼트를 가져와서 전송할 준비를 합니다. Nagle의 알고리즘은 전송 스트림을 최적화하기 위해 소켓을 통해 도착하는 데이터를 집계하는 최적화 알고리즘입니다. 당신은 또한 볼 수 있습니다TCP 차단 해제 및 자동 차단 해제, 이는 Nagle과 유사하게 작동하지만 NO_DELAY 옵션보다 우선할 수 있습니다. 패킷이 지연 없이 전송되도록 하려면 패킷을 캡처하고(tcpdump 사용) 전송된 패킷 크기가 애플리케이션에서 전송하는 데이터 크기(추가된 헤더로 인해)보다 약간 더 큰지 확인하십시오.

관련 정보