HTTP Keep Alive
HTTP Keep Alive
HTTP Keep-Alive는 클라이언트(주로 브라우저)와 서버 간의 연결을 지속적으로 유지하여, 여러 요청을 하나의 TCP 연결을 통해 처리할 수 있도록 하는 기능입니다. 기본적으로 HTTP는 "요청-응답" 모델을 따르며, 각 요청에 대해 TCP 연결을 열고, 응답이 완료되면 연결을 닫는 방식으로 동작했습니다. 이 방식을 HTTP/1.0에서는 기본적으로 사용했죠. 하지만 이 방식은 매번 TCP 연결을 새로 생성하고 끊는 과정에서 성능적인 비용이 발생합니다.
Keep-Alive는 이러한 문제를 해결하기 위해 도입된 방식으로, 한 번 TCP 연결을 맺고 나면 이를 지속적으로 유지하여 여러 요청을 처리할 수 있도록 합니다. HTTP/1.1에서는 기본 동작으로 Keep-Alive가 활성화되어 있으며, HTTP/1.0에서는 명시적으로 이를 설정해야 합니다.
Keep-Alive의 동작 방식에 대한 내부적인 설명은 다음과 같습니다.
1. TCP 연결의 재사용
- 일반적인 HTTP/1.0의 동작은 클라이언트가 서버에 요청을 보내면, 서버는 응답을 보내고 나서 TCP 연결을 끊습니다. Keep-Alive는 이 연결을 끊지 않고 일정 시간 동안 유지합니다.
- 즉, 여러 개의 HTTP 요청이 있을 때, 매번 새로운 TCP 연결을 설정하는 대신 기존의 연결을 재사용하여 요청을 처리합니다.
2. Connection 헤더
Keep-Alive 기능은 HTTP 헤더를 통해 제어됩니다.
- HTTP/1.0에서는 Connection: Keep-Alive 헤더를 명시적으로 포함시켜야 Keep-Alive를 사용할 수 있습니다.
- HTTP/1.1에서는 Connection: close 헤더를 명시하지 않는 한 Keep-Alive가 기본으로 활성화됩니다. 즉, Connection 헤더가 없다면 Keep-Alive가 적용됩니다.
예를 들어:
- HTTP/1.0에서 Keep-Alive를 사용하는 경우:
- ET /index.html HTTP/1.0 Host: www.example.com Connection: Keep-Alive
- HTTP/1.1에서는 기본적으로 Keep-Alive가 적용됩니다:
- GET /index.html HTTP/1.1 Host: www.example.com
3. Keep-Alive의 옵션
Keep-Alive는 단순히 연결을 유지하는 것 이상의 설정이 가능합니다. 일반적으로 서버는 다음 두 가지 파라미터를 통해 Keep-Alive의 동작을 제어할 수 있습니다.
- timeout: 연결을 유지하는 최대 시간(초 단위). 클라이언트가 지정된 시간 내에 요청을 보내지 않으면 서버가 연결을 끊습니다.
- max: 유지할 수 있는 최대 요청 수. 지정된 요청 수가 초과되면 연결이 종료됩니다.
예를 들어 서버는 다음과 같은 응답을 보낼 수 있습니다:
HTTP/1.1 200 OK
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
- timeout=5: 클라이언트가 5초 이내에 새로운 요청을 보내지 않으면 연결을 끊습니다.
- max=100: 최대 100개의 요청이 처리되면 연결을 종료합니다.
4. 성능 향상 효과
Keep-Alive는 성능을 크게 향상시킬 수 있습니다. 그 이유는 다음과 같습니다.
- TCP 연결 설정 비용 절감: TCP 연결을 새로 맺을 때는 3-way 핸드셰이크(TCP SYN-ACK) 과정이 필요하며, 이 과정에서 시간이 소요됩니다. Keep-Alive를 사용하면 한 번의 핸드셰이크로 여러 요청을 처리할 수 있습니다.
- TCP 연결 해제 비용 절감: 연결을 해제할 때도 4-way 핸드셰이크(TCP FIN-ACK) 과정이 필요합니다. 이를 반복하는 대신, 하나의 연결로 여러 요청을 처리할 수 있기 때문에 자원 소비를 줄일 수 있습니다.
- 지연 시간 감소: HTTP 요청마다 새로운 연결을 맺고 끊는 것이 아니라, 하나의 연결을 통해 여러 개의 요청을 처리함으로써 네트워크 지연 시간이 줄어듭니다. 특히 작은 자원을 많이 요청하는 웹 페이지의 경우 큰 성능 향상을 보입니다.
5. Keep-Alive의 단점
Keep-Alive는 성능을 향상시키는 유용한 기술이지만, 모든 경우에 적합하지는 않습니다.
- 서버 자원 소모: 연결을 유지하기 위해 서버가 TCP 소켓을 오랜 시간 동안 열어 두어야 하므로, 대규모 트래픽을 처리하는 서버에서는 Keep-Alive가 오히려 성능 저하를 일으킬 수 있습니다. 이를 방지하기 위해 timeout이나 max 값을 통해 적절히 설정해야 합니다.
- 비효율적인 연결 점유: 클라이언트가 오랜 시간 동안 연결을 유지하지만 실제 요청을 보내지 않을 경우, 불필요하게 서버 자원을 점유할 수 있습니다.
6. HTTP Keep-Alive와 HTTP/2, HTTP/3
HTTP/1.x에서 Keep-Alive는 성능 향상을 위한 중요한 기술이었지만, HTTP/2와 HTTP/3에서는 더 나은 연결 관리 방법이 도입되었습니다.
- HTTP/2는 하나의 TCP 연결에서 여러 개의 스트림을 병렬로 처리할 수 있습니다. 이는 HTTP/1.x의 Keep-Alive보다 더 효율적인 방식입니다.
- HTTP/3는 TCP 대신 QUIC 프로토콜을 기반으로 하여, UDP를 사용한 빠른 연결 설정과 재사용을 지원합니다. HTTP/3는 Keep-Alive와 유사한 방식으로 연결을 유지하지만, 그 성능과 효율성은 훨씬 뛰어납니다.
결론
HTTP Keep-Alive는 HTTP/1.x에서 TCP 연결을 효율적으로 재사용하여 성능을 개선하는 기술입니다. HTTP 헤더(Connection: Keep-Alive)를 통해 클라이언트와 서버 간의 연결을 유지하고, TCP 연결 설정 및 해제에 따른 오버헤드를 줄입니다. Keep-Alive는 네트워크의 성능을 크게 향상시킬 수 있지만, 서버 자원의 소모가 증가할 수 있어 상황에 맞게 적절히 설정하는 것이 중요합니다.