Linux에서 기본 SYN 재전송 지수 백오프를 변경하는 방법은 무엇입니까?

Linux에서 기본 SYN 재전송 지수 백오프를 변경하는 방법은 무엇입니까?

기본적으로 SYN 패킷이 1초 이내에 응답하지 않으면 Linux는 첫 번째 패킷이 어딘가에 삭제되었다고 가정하고 다른 패킷을 보냅니다. 2초 후에 또 한 번, 그다음에는 4초 후에 특정 한도까지.

기본을 1초에서 더 높은 값(예: 10초)으로 변경하려면 어떻게 해야 합니까?

이유

대기 시간이 길고 대역폭이 낮습니다(참고: 대역폭이 낮습니다. 이는 전형적인 대역폭 지연 제품 문제가 아닙니다). 이 채널은 일부 구성에서 대기 시간이 높기 때문에 1초 내에 답변을 얻을 수 있을 것으로 기대하지 않습니다. 대역폭이 낮기 때문에 SYN을 불필요하게 다시 보내면 귀중한 대역폭이 소모됩니다.

구체적으로 이것은ㅋㅋㅋ, SYN 패킷을 전송하는 데 5초 이상이 걸릴 수 있습니다(채널 설정에 따라, 범위 등에 따라 다름). 즉, 내가 또 다른 이메일을 보내면 추가로 5초 동안 송신기를 열어 두게 되며 상대방의 응답도 듣지 못하게 되어 더 많은 재전송이 발생하게 될 가능성이 높습니다.

내가 시도한 것

IP 라우팅

나는 그것을 cwnd처럼 바꿀 수 있다고 생각한다:

ip route change default via x.x.x.x initcwnd 20 initrwnd 20

그래서 rtt, rttvar, rto_min및 그 이상을 변경했지만 재전송에는 아무런 영향을 미치지 않았습니다.

setockopt/ioctl

아직 적합한 소켓을 찾지 못했지만, 찾았다고 해도 애플리케이션 코드를 변경해야 겠죠?

시스템 제어

다시 말하지만, 설정을 찾지 못했을 뿐만 아니라 이상적으로는 노드가 정상적인 인터넷 연결을 가질 수 있으므로 시스템 전체에 적용되어서는 안 됩니다.

답변1

나는 그것에 대해 생각했다.

바라보다이 블로그 게시물시간 초과를 재정의할 수 있는 eBPF 프로그램을 만드는 방법을 알아보세요.

즉, 다음 sockops프로그램을 로드해야 합니다.

#include<linux/bpf.h>
#define SEC(NAME) __attribute__((section(NAME), used))

// TODO: assumes little-endian (x86, amd64)
#define bpf_ntohl(x)  __builtin_bswap32(x)

SEC("sockops")
int bpf_sockmap(struct bpf_sock_ops *skops)
{
  const int op = (int) skops->op;
  if (op == BPF_SOCK_OPS_TIMEOUT_INIT) {
     // TODO: this is in jiffies, and despite `getconf CLK_TCK` return 100, HZ is clearly 25 on my kernel.
     // 5000 / 250 = 20 seconds
     skops->reply = 5000;
     return 1;
  }
  return 0;
}
char _license[] __attribute((section("license"),used)) = "GPL";
int _version SEC("version") = 1;

다음을 사용하여 컴파일하고 로드할 수 있습니다.

clang $CFLAGS -target bpf  -Wall -g -O2 -c set_rto.c -o set_rto.o
sudo bpftool prog load set_rto.o  /sys/fs/bpf/bpf_sockop
sudo bpftool cgroup attach /sys/fs/cgroup/unified/ sock_ops pinned /sys/fs/bpf/set_rto

관련 정보