Keep-Alive 용어는 HTTP, TCP 연결에서 사용되지만, 둘은 목적과 동작 계층이 다르므로 구분해야 한다.
HTTP Keep-Alive
: 하나의 전송 연결을 여러 HTTP 요청/응답에 대해 재사용하기 위한 것.
TCP Keep-Alive
: 오랜 시간 유휴 상태인 TCP 연결에서 상대방이 여전히 살아있는지 확인하기 위한 것.
Connection을 유지하기 위한 수단으로, 하나의 TCP 연결을 재사용하여 여러 개의 HTTP 요청을 처리한다.
HTTP Reseponse header 중 하나로, 대략 아래와 같은 형태로 전송된다.
HTTP/1.1 200 OK
Server: Apache
Connection: Keep-Alive
Keep-Alive: timeout=5, max=1000
...
기본적으로 HTTP는 TCP 기반으로 동작하기 때문에, 하나의 TCP 연결에서 하나의 요청과 응답을 처리한 뒤 연결을 종료하는 비지속 연결 형태다. (HTTP/1.0 시절)
이렇게 매번 요청을 할 때마다 새로운 연결을 설정하고 끊는다면 자원 낭비가 심하다. 그래서 Keep-Alive를 보내 말그대로 그대여... 그 뭐냐 살아라... 하면서 연결을 계속 유지하라고 요청한다.
한마디로 하나의 TCP Connection을 활용하여 여러 개의 HTTP 요청/응답을 주고받을 수 있게 한다.

아마 I want style.css 즈음에서 client 답답해뒤져있음
timeout과 max를 지정하여 최소 timeout 시간 동안 최대 max개의 request 수를 연결 가능함을 알린다.
즉, 위의 경우에는 5초 동안 서버가 유휴 상태면 서버가 연결을 종료할 수 있으며, 하나의 연결에서 최대 1000개의 요청을 처리할 수 있다는 뜻이다.
위 옵션은 HTTP/1.0에서는 직접 지정해야 동작했지만, HTT로 동작한다. 야호! (근데 쓸 수는 있고 포함하여 응답하는 곳들이 많다)
반대로 Connection: Close를 헤더에 포함하여 전달하면 명시적으로 종료할 수 있다. HTTP/1.1에서는 Connection: Close 헤더가 없다면 서버가 응답 후에 해당 연결을 계속 재사용할 수 있다고 가정한다.
Q. 그럼 닫는다고 안 보내면 평생 열려있나요?
A. 겠냐?
서버나 프록시에 설정되어있는 timeout에 걸리거나, 최대 요청 수 초과, 자원 부족 등으로 연결을 닫을 수 있다.
Q. 왜 필요한가요?
A. 연결 재사용으로 인해 3-way-handshake를 매번 다시 맺지 않으므로 오버헤드 감소 및 지연 시간 감소. 즉, 성능 향상.
Q. 무족권 좋은 거네요?? 단점은 없는지?
A. Keep-Alive에 의해 너무 많은 연결을 유지하게 되면 서버의 리소스 사용량이 증가할 수 있다. 따라서 timeout 값을 적절히 제한해줘야 한다.
TCP 연결이 맺어진 이후, 서버와 클라이언트 간에 Keep-Alive Packet을 통해 지속적으로 연결이 되어있는지 확인한다.
OS에 의해 관리되며, 리눅스 기준 설정 옵션은 아래와 같다.
tcp_keepalive_time=120 : 최초 keep-alive를 보내는 시간
tcp_keepalive_probes=3 : 응답이 없으면 추가로 보내는 횟수
tcp_keepalive_intvl=10 : 추가로 보낼 때의 간격
위 설정에 따르면 120초 동안 연결이 유휴 상태인 경우, 10초 간격으로 3번의 Keep-Alive 패킷을 전송한다. 3회가 끝날 때까지 정상적으로 주고받지 못했다면 Connection을 종료한다.
Q. 왜 필요한가요?
A. 네트워크 문제나 상대의 비정상 종료를 감지할 수 있다. 또한, 방화벽이나 NAT 등 장비들은 유휴 연결을 자동으로 닫기 때문에 연결 확인 및 유지가 필요하다.