[네트워크] HTTP Keep-Alive 란?

calis_ws·2024년 3월 12일
0
post-custom-banner

HTTP 는 Connectionless 방식으로 연결을 매번 끊고 새로 생성하는 구조이다. 이는 Network 비용 측면에서 최초 연결을 하기 위해 많은 비용을 소비한다.

HTTP 프로토콜의 Keep-Alive 기능은 클라이언트와 서버 간 요청 및 응답 과정을 효율적으로 유지하기 위해 사용된다. Keep-alive 를 활성화하면 하나의 TCP 연결을 여러 번 재사용하며 응답과 요청을 수행할 수 있다.

Keep-Alive

HTTP 프로토콜에서 클라이언트와 서버 간 여러 요청을 단일 TCP 연결을 재사용하는 방식으로 처리하는 기능을 말한다. HTTP/1.1 프로토콜부터 도입됐다. 이 기능을 활성화하면 여러 HTTP 요청 및 응답 과정에서 발생하는 네트워크 오버헤드를 줄일 수 있다.

keep-alive를 사용하는 경우 HTTP 요청 헤더에 Connection: Keep-Alive 라는 값을 포함시킨다.

HTTP/1.1 200 OK
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Thu, 11 Aug 2016 15:23:13 GMT
Keep-Alive: timeout=5, max=1000
Last-Modified: Mon, 25 Jul 2016 04:32:39 GMT
Server: Apache

(body)

사용 이점

keep-alive가 없으면 클라이언트와 서버는 각 요청과 응답에 대해 매번 새로운 TCP 연결을 생성하고 닫아야 한다. 이 방식은 네트워크 리소스가 비효율적으로 사용된다. 반면 keep-alive를 사용하면 단일 TCP 연결에서 여러 요청과 응답이 이루어지기 때문에 네트워크 지연 시간이 줄어들고 웹 사이트 성능이 좋아진다.

초기 HTTP/1.0 프로토콜에서는 각 HTTP 요청에 대해 매번 TCP 연결을 새로 생성해야 했기 때문에 위에서 언급한 문제들이 존재했다. 이를 해결하기 위해 HTTP/1.1 프로토콜에 해당 기능이 도입됐다.

위 이미지는 4개의 트랜잭션에 대해 연속적으로 4개의 커넥션을 생성하여 처리하는 방식과 하나의 지속 커넥션으로만 처리하는 방식을 비교한 이미지이다.

후자에서는 커넥션을 맺고 끊는 데 작업이 없어졌기 때문에 시간이 단축되었다.

keep-alive 의 상황을 비유하자면, 전화 통화하는 상황을 떠올릴 수 있다. 
한 고객이 고객센터에 전화를 걸어 제품에 대해 궁금한 정보를 하나씩 묻는다고 해보자. 
이때 하나의 질문을 할 때마다 대답을 듣고 전화가 끊어진다고 생각해 보자. 
전화를 걸고 다시 물어보는 과정이 반복된다면 매우 피곤할 것이다. 
한번 연결된 전화를 통해 모든 궁금증을 해결할 수 있는 편이 훨씬 효율적이다.

예시

  1. Image를 4개를 보여주어야 한다.

  2. Client는 동시에 2개의 Image만 받아올 수 있다.

  3. Image는 받아오는데 2초가 걸린다.

  4. Port를 여는데 1초가 걸린다.

keep-alive 비활성화

처음 Server에 2개의 Port를 열고 Image를 받고 Client Socket의 닫는다. ( 3초 ) 
다시 Server에 2개의 Port를 열고 Image를 받고 Client Socket의 닫는다. ( 3초 ) 
총 6초가 걸린다.

keep-alive 활성화

처음 Server에 2개의 Port를 열고 Image를 받는다. ( 3초 ) 
재요청 시 기존에 열어 둔 Port로 Image를 받아온다. ( 2초 )
총 5초가 걸린다.

정리

HTTP 프로토콜은 클라이언트가 서버에 요청을 보내고 서버가 응답을 보내는 동안에만 연결을 유지한다. 이후에는 연결이 종료되고 다시 연결을 맺어야 한다.

하지만 Keep Alive 를 사용하면 클라이언트와 서버 간의 연결을 유지할 수 있다. 이는 웹 페이지를 로드하는 데 필요한 추가 연결 설정 시간을 줄여 성능을 향상시킬 수 있다.

출처

https://change-words.tistory.com/entry/HTTP-Keep-Alive
https://goodgid.github.io/HTTP-Keep-Alive/

profile
반갑습니다람지
post-custom-banner

0개의 댓글