다음을 사용하여 이러한 값을 조작할 수 있습니다.
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_cwnd
TCP 소켓이 초기화될 때 설정된 매개변수의 초기값을 찾고 있는 것입니다.
Linux 커널로 시작하는 것처럼 보입니다 2.6.39
. 매크로 TCP_INIT_CWND
가리눅스/include/net/tcp.hsnd_cwnd
TCP 소켓을 초기화할 때 의 값을 채웁니다 .
이 코드가 커널의 어디에 있는지 알고 있지만 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