프로그래밍/Network

HTTP 연결과 커넥션 관리

Lou Park 2022. 2. 13. 00:09

연결 수립

클라이언트와 서버가 HTTP 요청/응답으로 교환하기 전 , TCP 커넥션을 설정해야한다. HTTP/1.0의 기본 동작은 각 요청/응답에 대해 별도의 TCP 커넥션을 여는 것이다. TCP를 이용할 경우, 컴퓨터 상의 HTTP 서버를 위한 기본 포트는 80이다. 요청을 위한 페이지 URL은 도메인 이름과 포트번호 둘 다를 포함하는데, 포트 번호가 80일 경우 생략가능하다.

 

HTTP 흐름

1. TCP 커넥션을 연다. TCP 커넥션은 요청을 보내거나 응답을 받는데 사용된다. 클라이언트는 새로운 커넥션을 열거나, 기존 커넥션을 재사용하거나, 서버에 대한 여러 TCP 커넥션을 열 수 있다.

 

2. HTTP 메세지를 전송한다. HTTP/2 이전의 메세지는 사람이 읽을 수 있을 정도다. 

GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr

 

3. 서버는 요청에 대해 처리하고, 그에 대한 응답을 상태 코드, 요청에 부합하는 데이터와 함께 돌려준다. 클라이언트는 서버에 의해 전송된 응답을 읽어들인다.

HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html

<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)

HTTP/1.1 부터는 3번째 과정 이후 클라이언트가 또 다른 요청을 보낼 수 있도록 연결을 더 이상 닫지 않는다. 그래서 2~3번 과정이 반복될 수 있다.

 

 

 

HTTP/1.X의 커넥션 관리

HTTP/1.0에서는 한 번의 요청이 끝나면 TCP 커넥션을 닫았다. (short-lived connection)그래서 매번 요청이 있을때마다 TCP 커넥션을 열어주어야했는데, 이는 선천적인 성능상 제약을 발생시킨다. 그래서 HTTP/1.1이후에는 Persistent connection, HTTP Pipelining 모델이 추가되었다. 

 

단기 커넥션 (Short-lived conenction)

HTTP/1.0에서 사용된 기본 모델이다. HTTP/1.1에서는 헤더가 Connection: close으로 설정된 경우에만 사용된다. 각 HTTP 요청 전 마다 TCP Handshake가 필요하여 매번 새로운 연결을 함으로서 성능이 저하된다.

 

영속적인 커넥션 (Persistent connection)

Keep-alive 커넥션이라고도 불린다. 영속적인 커넥션은 얼마간 연결을 열어놓고 여러 요청에 재사용함으로써, TCP Handshake비용을 아끼고 TCP 성능 향상을 도모할 수 있다. 유휴 커넥션들은 얼마후에 닫히는데, 서버가 Keep-Alive 헤더를 사용하여 연결이 최소한 얼마나 열려있어야할지를 설정할 수 있다.

 

하지만 영속적인 커넥션 역시 단점을 가지고 있다. 유휴 상태일떄도 서버 리소스를 소비하며, 과부하 상태에서는 Dos attack을 당할 수 있다. (이럴경우에는 단기 커넥션으로 돌리는게 더 낫다.) HTTP/1.1는 기본적으로 영속적이며, 헤더도 필요하지 않다.

 

HTTP 파이프라이닝 (HTTP Pipelining)

파이프라이닝이란 영속적인 커넥션을 통해서, 응답을 기다리지 않고 요청을 연속적으로 보내는 기능이다. 이것은 현재 요청에 대한 응답을 받고나서야 다음 요청을 실시하는 순차적인 HTTP 요청에 대한 커넥션 지연을 회피하고자 하는 법이다. 요청에 실패가 발생할 경우, 파이프라인의 컨텐츠를 다시 반복하여 보내기 때문에 동일한 요청을 한 번 보내는 것과 여러번 보내는 것이 같은 효과를 지니는 멱등성(idempotent)이 있는 메서드(GET, HEAD, PUT, DELETE)만 가능하다.

 

https://developer.mozilla.org/ko/docs/Web/HTTP/Connection_management_in_HTTP_1.x