Keep-Alive는 HTTP 요청마다 새 TCP 연결을 수립하는 대신 기존 연결을 재사용하는 메커니즘입니다.
HTTP/1.0은 기본적으로 요청 하나에 TCP 연결 하나를 사용했습니다. 매번 TCP 3-Way Handshake와 TLS 핸드셰이크가 필요하여 지연이 발생했습니다.
웹 페이지 하나에 HTML, CSS, JS, 이미지가 수십 개라면, 그만큼 연결과 해제가 반복됩니다.
HTTP/1.1부터 기본값이 Keep-Alive입니다. 한 번 수립된 TCP 연결로 여러 요청을 처리합니다.
Connection: keep-alive
Keep-Alive: timeout=60, max=100
timeout: 유휴 상태로 유지할 최대 시간(초)max: 해당 연결로 처리할 최대 요청 수HTTP Keep-Alive와는 별개로, TCP 수준에서도 Keep-Alive 메커니즘이 있습니다. 일정 시간 동안 데이터 교환이 없으면 탐색 패킷을 보내 연결이 살아있는지 확인합니다. 응답이 없으면 연결을 끊습니다. 좀비 연결(연결은 되어 있지만 실제로는 끊어진 상태)을 정리하는 데 사용합니다.
HTTP/1.1의 파이프라이닝은 여러 요청을 보내지만 응답은 반드시 순서대로 받아야 합니다. 앞 요청이 느리면 뒤 요청도 기다려야 합니다. HTTP/2의 멀티플렉싱이 이 문제를 해결합니다.
연결을 종료할 때는 Connection: close 헤더를 사용합니다.
Connection: close
서버 또는 클라이언트가 이 헤더를 보내면 해당 응답 후 TCP 연결을 종료합니다.
서버는 동시에 유지할 수 있는 연결 수가 제한됩니다. 너무 긴 timeout을 설정하면 불필요한 연결이 자원을 점유합니다. 적절한 timeout과 max 값 설정이 중요합니다.