TCP Keepalive 와 HTTP Keep-Alive
1. TCP Keepalive — 죽은 연결 감지
- 목적: idle 연결에서 상대방 생존 여부 확인
- 동작 주체: 커널
- 프로브에 ACK 오면 → 연결 유지
- N번 무응답이면 → 연결 종료 (ETIMEDOUT or ECONNRESET)
종료 공식
종료까지 시간 = tcp_keepalive_time + (tcp_keepalive_intvl × tcp_keepalive_probes)
기본값 = 7200 + (75 × 9) = 7875초 ≈ 2시간 11분
파라미터
파라미터 기본값 의미
| tcp_keepalive_time | 7200초 | 마지막 데이터 후 첫 프로브까지 대기 |
| tcp_keepalive_intvl | 75초 | 프로브 재전송 간격 |
| tcp_keepalive_probes | 9회 | 최대 프로브 횟수 |
종료 방식
상황 종료 방식
| 호스트 다운 (응답 없음) | ETIMEDOUT |
| 재부팅 후 연결 모름 | RST → 즉시 ECONNRESET |
TCP Keepalive가 실제로 필요한 경우
- 서버 크래시 / 전원 차단 (FIN 없이 사라짐)
- 방화벽 / NAT가 idle 연결을 몰래 끊는 경우
- 케이블 뽑힘, NIC 장애
서버가 정상 동작 중이면 프로브에 계속 ACK → 연결은 영원히 유지됨
2. HTTP Keep-Alive — TCP 연결 재사용
- 목적: 매 요청마다 TCP 연결을 새로 맺는 오버헤드 제거
- 동작 주체: 애플리케이션
- HTTP/1.1부터 기본 활성화 (Connection: close로 명시해야 끊음)
HTTP/1.0: TCP연결 → 요청 → 응답 → TCP종료 (매번 반복)
HTTP/1.1: TCP연결 → 요청1 → 응답1 → 요청2 → 응답2 → TCP종료
3. nginx의 Keepalive
설정 대상 성격
| keepalive_timeout 65 | 클라이언트 ↔ nginx | HTTP Keep-Alive (L7) |
| keepalive 32 | nginx ↔ upstream | TCP 연결 풀 재사용 |
Client ──(keepalive_timeout)──▶ nginx ──(keepalive 풀)──▶ WAS
4. TCP Keepalive vs HTTP Keep-Alive 비교
TCP Keepalive HTTP Keep-Alive
| 레이어 | L4 (Transport) | L7 (Application) |
| 목적 | 죽은 연결 감지 | TCP 연결 재사용 |
| 동작 주체 | 커널 | 애플리케이션 |
| 패킷 | 빈 ACK 프로브 | 실제 HTTP 요청/응답 |
5. 타임아웃 우선순위
둘 중 짧은 쪽이 실제 연결 수명을 결정한다
- TCP Keepalive 60초, HTTP Keep-Alive 30초인 경우
- 30초에 nginx가 FIN 전송 → TCP 연결 종료
- TCP Keepalive는 개입할 여지 없음
TCP Keepalive는 "아무도 끊으려 하지 않는데 상대가 죽은 경우"를 감지하는 것
애플리케이션이 먼저 끊으면 TCP Keepalive는 동작하지 않음