내 Linux 시스템에서 실행 중인 서버가 있고 서버에서 다음 명령을 실행했습니다.
$ cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
$ cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
$ cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
내 서버는 포트 58080에서 수신 대기하며 코드에서 TCP 연결 유지를 설정하고 연결을 생성합니다. 그런 다음 이 연결을 추적하도록 Wireshark를 설정했습니다. 출력 스크린샷은 다음과 같습니다.
예상되는 2시간("tcp_keepalive_time" 값)인 7200초 후에 첫 번째 연결 유지 패킷이 전송되는 것을 볼 수 있습니다. 그러나 각 프로브가 75초("tcp_keepalive_intvl" 값)에 전송되기를 원했지만 각 프로브가 2시간 이내에 전송되는 것을 확인했습니다.
누군가 내 "tcp_keepalive_intvl" 구성 옵션이 존중되지 않는 이유를 말해 줄 수 있습니까?
고쳐 쓰다
keep-alive 시간보다 큰 keep-alive 간격을 지정하면 간격이 준수되는 것 같습니다...
답변1
매우 똑똑한 동료와 논의한 결과 문제를 파악했다고 생각하지만 아직 입증하지는 못했습니다. 일어날 수 있는 일은 연결 유지 ACK가 수신되지 않은 경우에만 연결 유지 간격이 고려된다는 것입니다. 따라서 2시간 후에 첫 번째 연결 유지 패킷에 대한 ACK가 수신되지 않으면 75초 후에 두 번째 패킷이 전송되고 ACK가 수신될 때까지 75초 간격으로 반복됩니다.
간격이 연결 유지 시간보다 큰 경우에만 간격이 고려되는 것으로 나타났습니다. 이는 위에서 언급한 것처럼 Linux 연결 유지 메커니즘이 작동하는 방식 때문입니다.내 다른 질문.
답변2
실제로,문서:
tcp_keepalive_time
전송된 마지막 패킷(간단한 ACK는 데이터로 간주되지 않음)과 첫 번째 연결 유지 프로브 사이의 간격은 연결이 유지되어야 한다고 표시된 후에는 더 이상 사용되지 않습니다.
tcp_keepalive_intvl
동시에 교환된 연결에 관계없이 후속 Keepalive 프로브 사이의 간격
tcp_keepalive_probes
연결이 끊어진 것으로 간주하고 애플리케이션 계층에 알리기 전에 보낼 승인되지 않은 프로브 수