나누고 싶은 개발 이야기

Data Engineer로서 기록하고 공유하고 싶은 기술들. 책과 함께 이야기합니다.

Linux

Keepalive 정리

devidea 2019. 2. 13. 19:19
TCP Keep alive
3-way handshake를 통해 연결된 세션을 없애지 않고 계속 사용하는 방식.

[그림 1] TCP Keepalive 환경에서의 패킷 흐름.

 
[그림 1]과 같이 TCP Keepalive는 일정 시간이 지나면 연결된 세션이 살아있는지 확인하기 위해 아주 작은 양의 패킷을 하나 보낸다. 패킷은 연결을 유지하기 원하는 쪽에서 보낸다. 패킷을 주고 받은 다음에 타이머는 원점으로 돌아가고 카운트를 진행한다.
 
ss 명령으로 간단히 Keepalive를 확인할 수 있다. -o 옵션을 주면 timer의 정보도 볼 수 있다.
ss -otn
    -o : Show timer information.
    -t : Display only TCP sockets.
    -n : Do now try to resolve service names.
 
명령어의 결과로 ESTABLISHED 상태의 소켓에서는 Keepalive 타이머를 확인할 수 있다.
다음과 같이 2.6초 가량 타이머가 남아있음을 볼 수 있다.
timer:(keepalive,2.607ms,0)
 
TCP Keepalive 파라미터
 
OS 커널에서 Keepalive와 관련된 파라미터의 설정을 살펴보자.
sysctl -a | grep -i keepalive
 
keepalive와 관련 정보로 3개의 값이 나오는데 각각의 의미를 살펴보도록 하자. 
  • net.ipv4.tcp_keepalive_time
    • keepalive 소켓의 유지시간
    • 위 그림에서는 TCP Keepalive 옵션이 적용된 소켓은 최소한 15초 연결을 유지한다.
  • net.ipv4.tcp_keepalive_probes
    • 패킷을 보낼 최대 전송 횟수를 정의한다.
    • 네트워크 패킷은 여러 사유로 인해 유실될 수 있으므로 재전송 매커니즘을 넣는다.
  • net.ipv4.tcp_keepalive_intvl
    • 재전송 패킷을 보내는 주기를 의미한다.
 
앞서 설명한 파라미터들과 함꼐 Keepalive의 동작과정을 더 들어다 보자.
최초로 세션이 연결된 다음 tcp_keepalive_time초 동안 기다린다. 그리고 확인 패킷을 보내게 된다. 확인 패킷에 대한 응답이 오지 않으면 tcp_keepalive_intvl 간격으로 tcp_keepalive_probes 만큼 패킷을 더 보낸다. tcp_keepalive_probes의 마지막 패킷에 대해서 응답이 오지 않으면 연결을 끊는다.
 
TCP Keepalive는 연결된 세션의 재활용 측면에서만 아니라 좀비 커넥션의 삭제에도 도움을 준다.
TCP 연결을 끊으려면 FIN 패킷이 필요하다. 하지만 다양한 이유로 FIN 패킷을 받을 수 없는 상황이 된다면 FIN을 전달할 수 없어 계속 연결된 것처럼 남아있게 된다. TCP Keepalive 옵션을 사용한다면 일정시간이 확인 패킷을 보내는 로직을 통해 일정시간 동안 응답이 없다면 연결을 종료하기 때문에 좀비 커넥션을 방지할 수 있다.
 
 
TCP keepalive와 HTTP Keepalive의 차이
HTTP/1.1에서부터 Keep-Alive spec이 존재한다. 이름에서 드러나는 의미처럼 연결을 지속한다는 개념이 있지만 TCP Keepalive와 차이가 있다.
TCP Keepalive는 두 종단 간의 연결을 유지하기 위함이지만, HTTP Keep-Alive는 최대 얼마동안 연결을 유지하도록 하는게 목적이다.
 
HTTP/1.1 spec을 보면 HTTP Header에 Connection: Keep-Alive과 함께 서버에서 2개의 Keep-Alive 파라미터를 보내준다. 2개의 파라미터는 콤파(,)분리되어 응답된다.
  • timeout
    • 연결의 유지를 위한 최소한의 시간(초).
  • max
    • 연결을 종료하기 전까지 보낼 수 있는 최대 요청 수.
앞서 설명한 HTTP 응답 Header의 예는 다음과 같다. 아래 응답을 받고 10초가 되기 전에 또 요청 했다면 Keep-Alive: timeout=10, max=19가 포함된 응답을 받을 것이다.
HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Type: text/html; charset=UTF-8
Date: Thu, 15 Jan 2015 16:45:29 GMT
Content-Length: 1845
Keep-Alive: timeout=10, max=20
 
 
HTTP/1.1에서 Keep-Alive로 인한 장점은 무엇일까?
  1. 3-way handshake로 인한 지연시간을 줄일 수 있다.
  2. CPU 사용량을 줄여준다 : 새로운 TCP 연결을 만들기 위해서는 CPU, 메모리 사용과 같은 많은 리소스가 필요하다. 연결된 커넥션을 재사용하기 때문에 리소스 사용을 줄여준다.
  3. HTTP 파이프라인 커넥션 : 여러 개의 요청을 파이프라이닝 할 수 있다.
 
 
참고 문서

 

반응형

'Linux' 카테고리의 다른 글

I/O의 동작방식 이해  (0) 2020.02.13