기본적으로 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