# TCP keepalive
+ TCP 관련 커널 파라미터에는 keepalive 관련 3개의 값이 있음
+ net.ipv4.tcp_keepalive_time : TCP 세션, keepalive 유지시간 (default : 7200)
+ net.ipv4.tcp_keepalive_probes : keepalive가 끊어졌다고 판단될때 세션 정리하는 동안 보낼 ping-pong 패킷수 ( default : 9 )
+ net.ipv4.tcp_keepalive_intvl : 첫번째 health_check이후 ping-pong 패킷을 보내는데 걸리는 패킷사이 주기 (default : 75 )
+ 두 노드간 TCP 세션이 Idle 한 상태가 된지 7200초 후 살아있는지 체크하는 ping-pong 패킷을 보냄
+ 최대 9번까지 75초 간격으로 패킷을 보내고 세션을 정리.
#nginx keepalive
+ nginx keepalive는 기본적으로 애플리케이션 레벨의 keepalive.
+ tcp keepliave 를 사용하지 않고, tcp keepalive 처럼 ping-pong으로 체크하지 않음.
+ keepalive time 동안 세션을 그대로 ESTABLISH 상태로 유지
+ nginx에서 tcp keeplive 사용을 위해서는 listen 지시자 옆에 so_keepalive 옵션 추가
# tcp, nginx keepalive 차이점
+ tcp keepalive 는 keepalive 유지/관리에 대한 작업ㅇ르 커널이 수행
+ tcp keepalive 는 ping-pong 응답이 오는경우 세션 유지
+ nginx 는 keepalive 시간이 만료되면 연결을 끊음.
+ 전자는 계속적으로 세션유지, 후자는 설정시간 이후 세션이 유지되지 않음.
# 상호영향
+ application 자체 keepalive는 커널의 설정에 영향받지 않음.
# TCP keepalive 는 언제 필요한가.
+ DSR 방식의 로드 밸런서 하단의 커넥션 풀링 방식으로 서비스 할 때 필요.
+ active mq, rabbit mq 등 TCP 기반의 서비스
+ 아래와같이 2대의 서버에서 TCP기반 통신서비스 제공가정.
+ 커넥션 풀 방식이기때문에 Client는 LB와 계속해서 세션을 열어두고 있음
+ 처음 Client 는 A서버로 데이터를 보냄.
+ LB는 10분이 지났기 때문에 기존 세션에 대한 정보 삭제,
+ 새로운 데이터로 인식해서 B서버로 클라이언트 데이터를 보냄.
+ B서버는 연결된 세션이 없으므로 RST 패킷을 보내어 타임아웃 발생
+ 타임아웃후 다시 SYN을 맺고 B서버로 세션이 맺어짐.
+ 원치않는 타임아웃, A서버는 FIN 패킷을 받지 못해 EST 소켓이 쌓여 garbage 세션이 발생
+ TCP Keepalive를 사용하면 A서버는 지속적으로 클라이언트로 ping-pong 형식의 ACK를 보내고
+ 클라이언트는 계속해서 응답을 보내기 때문에 LB의 세션 테이블에서 지워지지 않고 계속해서 세션 정보 유지
+ 세션 테이블의 주기인 10분보다 tcp_keepalive_time 값이 낮아야함!
+ 웹 서비스가 아닌 TCP 기반의 서비스도 LB를 통해 서비스 할 수 있음.
#RST 패킷
+ Reset : 제 연결종료
+ 재설정(Reset)을 하는 과정이며 양방향에서 동시에 일어나는 중단 작업.
+ 비 정상적인 세션 연결 끊기에 해당함.
+ 패킷을 보내는 곳이 현재 접속하고 있는 곳과 즉시 연결을 끊고자 할 때 사용.
[참고]