HTTP (5) - Keep-alive

김지승·2025년 5월 14일

CS

목록 보기
13/22

Keep-Alive란?

HTTP Keep-Alive(또는 HTTP 지속 연결)는 클라이언트와 서버 간의 TCP 연결을 여러 HTTP 요청/응답에 걸쳐 재사용할 수 있게 해주는 기능입니다. 이를 통해 매 요청마다 새로운 연결을 설정하고 종료하는 오버헤드를 줄일 수 있습니다.

Keep-Alive 이전

전통적인 HTTP 통신에서는 다음과 같은 과정이 각 요청마다 반복됩니다:

  1. TCP 연결 수립 (3-way handshake)
  2. HTTP 요청 전송
  3. HTTP 응답 수신
  4. TCP 연결 종료 (4-way handshake)

이러한 방식은 다음과 같은 문제를 초래합니다:

  • 높은 지연 시간: 각 요청마다 TCP 연결 수립과 종료가 필요하여 지연 시간이 증가
  • 서버 부하 증가: 지속적인 연결 관리로 서버 리소스 소모 증가
  • 네트워크 트래픽 증가: 연결 수립과 종료를 위한 추가 패킷 발생

Keep-Alive 장점

Keep-Alive를 사용하면 다음과 같은 이점이 있습니다:

  • 지연 시간 감소: TCP 연결 수립/종료 시간 절약으로 웹 페이지 로딩 속도 향상
  • 서버 리소스 절약: 연결 관리에 필요한 CPU와 메모리 사용량 감소
  • 네트워크 효율성: 연결 관리를 위한 추가 패킷 감소로 네트워크 대역폭 절약
  • 웹 페이지 로딩 성능 개선: 특히 여러 리소스(이미지, CSS, JavaScript 등)를 가진 웹페이지에서 효과적

HTTP/1.0 vs HTTP/1.1

HTTP/1.0에서의 Keep-Alive

HTTP/1.0에서 Keep-Alive는 표준이 아닌 확장 기능으로 도입되었습니다:

  • 명시적 선언 필요: 클라이언트가 Connection: keep-alive 헤더를 요청에 포함해야 함
  • 서버 지원 필수: 서버가 Keep-Alive를 지원해야 하며, 응답에도 Connection: keep-alive 헤더를 포함해야 함
  • 불확실성: 서버가 Keep-Alive를 지원하지 않을 경우 연결이 즉시 종료될 수 있음
  • 추가 헤더: Keep-Alive: timeout=5, max=100와 같은 헤더로 연결 유지 시간과 최대 요청 수 설정 가능
GET /index.html HTTP/1.0
Host: example.com
Connection: keep-alive

HTTP/1.0 200 OK
Date: Wed, 14 May 2025 12:00:00 GMT
Content-Type: text/html
Connection: keep-alive

HTTP/1.1에서의 Keep-Alive

HTTP/1.1에서 Keep-Alive는 기본 동작으로 변경되었습니다:

  • 기본 활성화: 특별한 헤더 없이도 기본적으로 연결이 유지됨
  • 명시적 종료 필요: 연결을 종료하려면 Connection: close 헤더를 명시적으로 포함해야 함
  • 표준화: 정식 HTTP 표준의 일부로 포함되어 모든 HTTP/1.1 호환 서버에서 지원
  • 타임아웃 메커니즘: 서버는 일정 시간 동안 요청이 없으면 연결을 종료할 수 있음
GET /index.html HTTP/1.1
Host: example.com

HTTP/1.1 200 OK
Date: Wed, 14 May 2025 12:00:00 GMT
Content-Type: text/html

Connection: keep-alive vs. Connection: close

Connection 헤더의 역할

Connection 헤더는 현재 전송이 완료된 후 네트워크 연결을 어떻게 처리할지 제어합니다. 이 헤더는 다음 두 가지 주요 값을 가질 수 있습니다:

  • Connection: keep-alive

Connection: keep-alive
  • 연결 유지: HTTP 트랜잭션이 완료된 후에도 TCP 연결을 유지

  • 추가 요청 가능: 동일한 연결을 통해 추가 HTTP 요청을 보낼 수 있음

  • 타임아웃: 일정 시간 동안 활동이 없으면 연결이 종료될 수 있음

  • HTTP/1.0: 이 헤더가 필수

  • HTTP/1.1: 이 헤더가 없어도 기본적으로 keep-alive로 동작

  • Connection: close

Connection: close
  • 연결 종료: HTTP 트랜잭션이 완료된 후 TCP 연결을 즉시 종료
  • 단일 요청: 하나의 요청/응답 쌍 이후 연결이 닫힘
  • HTTP/1.0: 이 헤더가 없으면 기본적으로 동작하는 방식
  • HTTP/1.1: keep-alive를 비활성화하기 위해 명시적으로 사용

다음과 같은 상황에서는 Connection: close가 유용할 수 있습니다:

  • 서버 리소스 제한: 많은 동시 연결을 처리하기 어려운 서버 환경
  • 일회성 통신: 추가 요청이 예상되지 않는 경우
  • 부하 분산: 로드 밸런서를 통한 요청 분산이 필요한 경우
  • 장기 실행 요청: 응답 생성에 시간이 오래 걸려 연결 유지가 비효율적인 경우
  • 메모리 제약 환경: 지속 연결 유지에 필요한 리소스가 제한적인 경우

실제 사용 예시와 성능 영향

일반적인 웹 페이지 로딩 시나리오에서:

  • Keep-Alive 활성화: 한 페이지에 포함된 여러 이미지, CSS, JavaScript 파일을 동일한 연결로 요청하여 로딩 시간 단축
  • Keep-Alive 비활성화: 각 리소스마다 새로운 연결이 필요하여 로딩 시간 증가

성능 테스트에 따르면 Keep-Alive 활성화는 페이지 로딩 시간을 최대 50%까지 단축할 수 있습니다.

profile
디등

0개의 댓글