Linux에서 TCP initcwnd의 현재/기본값 가져오기

Linux에서 TCP initcwnd의 현재/기본값 가져오기

다음을 사용하여 이러한 값을 조작할 수 있습니다.

ip route change ... initcwnd 10

그런 다음 다음과 같은 피드백을 받습니다.

ip route show

하지만 수정 전의 기본값은 어떻습니까? 시스템에서 해당 값을 쿼리하는 방법이 있나요?

또는 다음을 제공할 수 있나요?유효한각 커널 버전에 대해 하드코딩된 기본 값을 보여주는 참조는 무엇입니까?

답변1

정확히는 모르겠지만, 이것은 합법적인 참고 자료인 것 같습니다.

직감:

$ grep -A 2 initcwnd `find /usr/src/linux/include -type f -iname '*h'`

밖으로:

/usr/src/linux/include/net/tcp.h:
/* TCP initial congestion window as per draft-hkchu-tcpm-initcwnd-01 */
#define TCP_INIT_CWND          10

답변2

글쎄, 이것이 답이라고 100% 확신할 수는 없지만, 종종 그렇듯이 ss일부 정보를 공개하는 것이 좋은 선택입니다. 예를 들면 다음과 같습니다.

 ss -nli|fgrep cwnd
     westwood rto:1000 mss:536 cwnd:10
     westwood rto:1000 mss:536 cwnd:10
     westwood rto:1000 mss:536 cwnd:10

-n성가신 DNS 확인을 제거하는 것이 일반적입니다. -l우리는 청취 소켓만 고수하고 -i(핵심)은 "내부 TCP 정보 표시"입니다. 보시다시피 혼잡 알고리즘과 기본 cwnd가 모두 표시됩니다.

답변3

올바르게 이해했다면 snd_cwndTCP 소켓이 초기화될 때 설정된 매개변수의 초기값을 찾고 있는 것입니다.

Linux 커널로 시작하는 것처럼 보입니다 2.6.39. 매크로 TCP_INIT_CWND리눅스/include/net/tcp.hsnd_cwndTCP 소켓을 초기화할 때 의 값을 채웁니다 .

이 코드가 커널의 어디에 있는지 알고 있지만 IPv4불행하게도 다음보다 오래된 커널의 값을 채우기 위해 매크로를 사용하지 않는 것 같습니다.2.6.39

/* net/ipv4/tcp_ipv4.c from 2.6.37 kernel */
static int tcp_v4_init_sock(struct sock *sk)
{
        struct inet_connection_sock *icsk = inet_csk(sk);
        struct tcp_sock *tp = tcp_sk(sk);

        ....
        ....
        ....

        /* So many TCP implementations out there (incorrectly) count the
         * initial SYN frame in their delayed-ACK and congestion control
         * algorithms that we must have the following bandaid to talk
         * efficiently to them.  -DaveM
         */
        tp->snd_cwnd = 2;

        ....
        ....
        ....
}

유사한 초기화 코드가 함수 IPv6내부에도 존재합니다.tcp_v6_init_sock()net/ipv6/tcp_ipv6.c

관련 정보