TCP keepalive
tcp에서 수립된 세션은 원래 요청이 처리된 이후 일반적으로 끊기게되지만, server와 client 측 중 하나라도 keepalive를 사용하게 된다면 요청을 수행한 이후에도 세션을 종료하지 않고 소켓을 유지시킨다.
참고로 이러한 keepalive는 nginx, apache에서 적용하던 http keepalive와 linux kernel parameter 값으로 설정할 수 있는 TCP Parameter가 존재한다.
TCP keepalive parameter
TCP keepalive parameter에는 다음과 같이 총 3개가 존재한다.
- net.ipv4.tcp_keepalive_time
- net.ipv4.tcp_keepalive_intvl
- net.ipv4.tcp_keepalive_probes
기본적으로 tcp keepalive를 사용하는 경우, 어떠한 값도 입력되지 않았다면 위의 parameter 값을 이용하여 처리한다.
net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_time 파라미터는 keepalive 소켓의 유지 시간을 의미하는데, 세션이 성립되고 해당 값 만큼 대기 후에 keepalive 패킷을 보내서 keepalive 세션을 유지시킨다.
ubuntu@ip-172-31-59-210:~$ sudo sysctl net.ipv4.tcp_keepalive_time
net.ipv4.tcp_keepalive_time = 30
위 상황에서는 세션 성립 이후 30초간 keepalive를 유지하다가 TCP Keep-Alive 패킷을 전송한다.
net.ipv4.tcp_keepalive_intvl
net.ipv4.tcp_keepalive_intvl 파라미터는 keepalive 패킷을 전송했을 때 keepalive ack 패킷을 입력받지 못한다면 몇 초 후에 재전송할지를 지정한다.
net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_probes 파라미터는 패킷을 보낼 최대 전송 횟수를 지정한다. keepalive 패킷을 전송했을 때 유실될 경우 이를 용인하는 횟수이다.
ubuntu@ip-172-31-59-210:~$ sudo sysctl net.ipv4.tcp_keepalive_probes
net.ipv4.tcp_keepalive_probes = 9
위 파라미터의 작업 수행 과정을 정리한다면 기본적으로 net.ipv4.tcp_keepalive_time 동안 대기 후 keepalive 패킷을 전송한다. 이후 keepalive ack 패킷을 입력받지 못할 경우 net.ipv4.tcp_keepalive_probes 만큼 net.ipv4.tcp_keepailve_intvl 간격으로 keepalive 패킷을 전송한다.
Keepalive와 좀비 커넥션
일반적인 tcp 세션일 경우 연결을 종료할 때에는 FIN 패킷을 전송하고 마친다. 다만, 이때 fin 패킷을 입력받지 못할 경우 세션이 종료되지 않는 좀비 커넥션이 발생할 수 있다. 이때, keepalive를 사용한다면 지속적으로 패킷을 교환하는 과정이 포함되므로 연결이 끊어진 소켓을 정리할 수 있다.
HTTP Keepalive
nginx, apache와 같은 웹 서버에는 설정으로 KeepAlive 옵션을 입력할 수 있다.
ubuntu@ip-172-31-59-210:~$ cat /etc/apache2/apache2.conf | grep -i keepalive
# KeepAlive: Whether or not to allow persistent connections (more than
KeepAlive On
# MaxKeepAliveRequests: The maximum number of requests to allow
MaxKeepAliveRequests 100
# KeepAliveTimeout: Number of seconds to wait for the next request from the
KeepAliveTimeout 60
해당 KeepAlive 옵션은 HTTP keepalive를 설정하는데, 커널 파라미터를 통해 입력하는 tcp keepalive와는 별개로 존재한다. http keepalive 값이 60이고 net.ipv4.tcp_keepalive_time 값이 30일 경우 tcp_keepalive_time 에 의해 처리된다.
'Linux' 카테고리의 다른 글
TIME_WAIT 소켓과 keepalive (0) | 2023.07.24 |
---|---|
vm.zone_reclaim_mode (0) | 2023.07.19 |
SSH Multiplexing (0) | 2023.07.03 |