본문 바로가기
server/Cent_os

TCP Keepalive 를 통한 연결 유지

 

TCP 연결은 UDP 와 틀리게 신뢰성 보장을 위하여 3way handshake 를 통하여 연결 수립후 established 상태가 되어 데이터를 주고 받은뒤 4way handshake 과정을 통하여 연결을 종료 한다.

이처럼 연결 수립,종료 과정에 모두 서로 간 협상 과정을 거치는데 종료시 한쪽이 정상적으로 종료 되지 않을 경우 UDP 와 다를 것이 없다.

TCP 는 이를 보안 하고자 Keepalive 를 이용하여 연결상태를 확인 하여 능동적으로 세션을 종료 한다.

명칭상 네트워크 장비간 전기적 신호로 keepalive통하여 상태를 확인 하거나, nginx/apache 등 에서 사용 하는 keepalive 와 기본적인 기능 자체는 유사 하지만

세부적으로는 틀린 부분이 있어서 정리 하였다.

 

 

TCP 연결되는 세그먼트들를 wireshark 로 확인 하면 아래와 같이 TCP Keep-Alive 세그먼트를 주기적으로 볼 수 있다.

 

리눅스 커널 파라미터 설정값을 통해서 어떻게 되는지 확인 가능하다.

 

tcp_keepalive_time 파라미터는 전송된 마지막 패킷과 첫번째 Keepalive 간격으로 Keepalive 를 유지하는 

시간을 의미 한다고 보면 될것 같다. 기본 7200초/2시간으로 설정 되어 있다.

[root@cytest2 ~]# cat /proc/sys/net/ipv4/tcp_keepalive_time
7200
 

tcp_keepalive_probes 파라미터는 tcp_keepalive_time 에 의하여 보낸 keepalive 세그먼트를 보낼 횟수로 

기본 설정 되어 있는 9회가 지나 가면 능동적으로 연결이 종료 된다.

[root@cytest2 ~]# cat /proc/sys/net/ipv4/tcp_keepalive_probes
9
 

tcp_keepalive_intvl 파라미미터는 keepalive 세그먼트를 보내고 다시 확인 하기 위한 시간으로 처음에 keepalive 를 보내고 미응답시

다음 keepalive 보낼 시간으로 기본 75초로 설정 되어 있다.

[root@cytest2 ~]# cat /proc/sys/net/ipv4/tcp_keepalive_intvl
75
 

위 기본 설정을 종합해서 클라이언트 서버 환경에서 클라이언트가 2시간동안 데이터를 주고 받은 경우가 없을 경우 서버는 keepalive 세그먼트를 보내고 이때 미응답시 75초 이후 keepalvie세그먼트를 보내고 총 9회동안 미응답시 연결을 능동적으로 종료 하게 된다.

 

기본설정이 7200초라는 시간이 서버 상황에 따라 클 수도 작을 수도 있지만, 보통 크게 느껴질 가능성이 있어 아래와 같이 수정 변경 

한다. 물론 짧은 간격으로 많이 확인 하면 그만큼 부하를 잡고 있기 때문에 서버 상황에 맞춰서 바꿔 줘야 한다.

[root@cytest2 ~]#echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time
[root@cytest2 ~]# echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl
[root@cytest2 ~]# echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes
 
 
References
 

 

반응형