나가는 연결을 위해 Linux에서 Keep-alive 옵션이 작동하지 않음


8

리눅스가 나가는 연결에서 keep-alive 소켓 옵션을 지원하는지 아는 사람이 있습니까?

keep-alive 옵션으로 나가는 연결을 만들었지 만 netstat --timers가 표시됩니다 (타이머가 꺼져 있다고 가정합니다).

tcp 0 0 localhost.localdomain:44307 172.16.0.15:2717 ESTABLISHED off (0.00/0/0)

동일한 소켓 옵션이 적용된 수신 연결은 다음과 같습니다.

tcp 0 0 172.16.0.3:8585 localhost.localdomain:21527 ESTABLISHED keepalive (29.26/0/0)

소켓 옵션을 볼 수는 있지만 ss 또는 lsof가 나에게 표시하지는 않습니다.

답변:


7

먼저 시스템에서 TCP keepalive가 활성화되어 있는지 확인해야합니다. 다음과 같이 기본 설정을 확인할 수 있습니다.

# sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_probes net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_intvl = 75

그런 다음 코드에서 올바르게 설정했는지 확인하십시오. 다음과 같이 보일 것입니다 :

int optval = 1;
if (setsockopt(s, SOL_SOCKET, SO_KEEPALIVE, &optval, sizeof(optval)) < 0) {
    perror("setsockopt()");
    close(s);
    exit(EXIT_FAILURE);
}

위의 코드를 사용하여 양쪽에 SO_KEEPALIVE를 설정하면 시스템에서 다음을 볼 수 있습니다.

tcp        0      0 127.0.0.1:48591         127.0.0.1:5555          ESTABLISHED keepalive (6958.37/0/0)
tcp        0      0 127.0.0.1:5555          127.0.0.1:48591         ESTABLISHED keepalive (6958.37/0/0)

그런 다음 keepalive NOP가 전송되고 있는지 wireshark로 확인했습니다 .

자세한 내용은 TCP Keepalive HOWTO 에서 찾을 수 있습니다 .


정보 주셔서 감사합니다,하지만 나는 이미 그 세트를 가지고 있었고 나는 당신과 정확히 같은 방식으로 설정하고 있습니다, 나는 netstat에서 keepalive를 설정하지 않습니다.
James Hartig

1
이 경우 시스템 및 소스 코드 (또는 단순화 된 테스트 사례)에 대한 자세한 정보를 게시하여 문제를 재현하려고 시도하십시오. 그렇지 않으면 디버깅 할 여기가 많지 않습니다.
aculich

@aculich가 맞습니다. 시스템에서 keepalive를 설정 한 경우 제대로 사용하지 않는 응용 프로그램입니다. aculich가 제안한 TCP Keepalive HOWTO를 읽거나 애플리케이션의 소스 코드를 게시하거나 lsof를 실행하여 어떤 일이 발생하는지 확인하는 것이
좋습니다.

0

클라이언트 -sysctl 설정 :

sudo /sbin/sysctl -a|grep keep
net.ipv4.tcp_keepalive_time = 20
net.ipv4.tcp_keepalive_probes = 1
net.ipv4.tcp_keepalive_intvl = 1

클라이언트 유지 tcpdump :

sudo /usr/sbin/tcpdump  -nn -vv -i bond0 tcp and host 10.201.126.72 and port 8001
tcpdump: listening on bond0, link-type EN10MB (Ethernet), capture size 65535 bytes

그러나 패키지 캡처가 아닙니다. 이는 tcp_keepalive_time이 작동하지 않음을 의미합니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.