본문 바로가기
IT 공부/자바와 웹 애플리케이션

[HTTP] - Connectionless와 지속 연결 및 stateless와의 차이

by exdus3156 2024. 1. 5.

1. TCP 프로토콜의 연결 작업의 오버헤드

HTTP 프로토콜은 네트워크 5계층에서 가장 최상단인 애플리케이션 레이어(Application Layer)에 속하는 프로토콜로서, 웹(World Wide Web)이라 불리는 인터넷 정보 공유 시스템의 기반이 되는 프로토콜이다.

전송 레이어와 네트워크 레이어로는 각각 TCP와 IP 프로토콜 위에서 동작한다. 특히 TCP는 연결에 있어서 안전성이 UDP 프로토콜보다 좋기 때문에 TCP는 UDP에 비해 성능 저하를 감수하는 대신 제대로 된 연결(Connection)을 보장해준다.

three way handshake

TCP의 연결 과정에서 three way handshake 라고 불리는 방식은 알고 보면 어떻게든 해서라도 서로 연결이 되었는지 확인하겠다는 의도에서 구현된 기술이다. 딱 그만큼 연결을 보장할 수 있다.

문제는 이러한 의도 때문에 TCP 프로토콜은 연결을 맺고 끝내는 것이 꽤 부하(오버헤드)가 걸리는 작업이라는 점이다. TCP는 연결 끝내기에도 꽤 많은 시간이 걸리는 편이다. (4 way handshake)

 


2. 초기 HTTP 스펙과 웹의 발전

1996년에 등장한 HTTP/1.0(RFC1945) 초기 스펙은 클라이언트와 서버 간 연결을 Connectionless로 설계되었다. 이는 클라이언트와 서버가 서로 TCP 연결을 맺고 난 다음, HTTP request와 response 메시지를 주고 받고 바로 TCP 연결을 종료하는 방식이다.

실질적인 콘텐츠인 request와 response를 전달하고 난 다음에는 바로 연결을 끊어버린다. 이렇게 설계된 이유는 초창기 웹의 목적은 웹 문서(HTML)를 요청하고 받는 것이 전부였기 때문이었다.

world's first browser by Sir. Berners-Lee

아마 HTTP와 www 개발 초기에는 웹 발전 및 확장성에 대해 다소 과소평가를 하지 않았나 싶다.

그러나 만약 정말로 웹이 정적인 웹 문서를 요청하고 응답하는 것이 전부라고 가정한다면, 이렇게 커넥션을 불필요하게 지속하지 않는 것이 효율적인 것도 사실이다. 기본적으로 네트워크 연결은 커널이 스케쥴링 및 소켓 데이터 관리 등, 컴퓨팅 자원을 소모하는 일이다. 웹 문서 송신이 완료된 뒤에도 굳이 연결 대기 상태를 유지해야 한다면 서버는 쓸데 없이 자원을 소모할 것이다. 차라리 연결을 빠르게 해제해서 다른 사용자의 요청을 받는 것이 훨씬 더 효율적일 것이다.

문제는 웹 기술이 발전하면서 같은 클라이언트와 서버 간 데이터 송수신의 양이 많아졌다는 점이다. 예를 들어, 웹 문서에 포함된 이미지 파일의 경우, 웹 문서를 가져온 클라이언트가 문서를 해석한 후 필요한 이미지를 다시 서버에 요청해야 하지만, 이미 연결이 해제되어으므로 다시 TCP 연결 요청을 해야 한다. 이는 불필요한 작업이다.

그래서 HTTP/1.1에서 지속 연결(Persistent Connection) 표준 사양이 생겨났다. HTTP/1.1을 구현한 클라이언트와 서버는 서로 지속 연결을 통해 TCP 연결 및 해제 사이에 여러 번의 request와 response 메시지를 전송하 할 수 있게 되었다.

HTTP/1.0 스펙에서도 Header 메시지에 Conncetion: keep-alive 키워드를 붙여 지속 연결을 시도할 수는 있다. (만약 이 헤더 메시지가 없으면 연결을 해제할 것이다.) 그러나 HTTP/1.1 스펙은 디폴트 모드가 지속 연결이다.

물론 지속 시간(timeout)은 길어도 십 몇초에 불과하다. 하지만 TCP 연결/해제의 오버헤드를 줄인 것은 굉장한 효율을 가져온다. 현대의 웹 콘텐츠는 html 페이지 하나로는 절대 충분하지 않기 때문이다.

 


※ 파이프라이닝

파이프라이닝(pipelining)은 많은 맥락에서 사용되는 용어다. HTTP에서 파이프라인화라고 하면 지속 연결 상태에서 여러 개의 request를 response를 기다리지 않고 한 꺼번에 송신하는 것을 말한다.

예를 들어, 웹 문서를 렌더링하기 위해 이미지가 10개가 필요하다면 굳이 하나씩 request를 보내지 않고 한 꺼번에 request를 전송해 이미지를 빠르게 받는 것이 효율적이다.

 


4. stateless와의 차이

지속 연결이든 바로 연결을 해제하든, HTTP의 Connection 개념은 HTTP의 상태(state)와는 전혀 별개의 개념이다.

HTTP가 stateless하다는 말의 의미는, 한 번의 request & response 시퀀스들이 서로 독립이라는 뜻에 불과하다. 따라서 지속 연결에서 동일한 커넥션 자워을 활용해 여러 번의 request&response 를 주고받는다고 해도 여전히 stateless하다. 같은 커넥션인지는 상관 없다. request&response는 서로 독립이다. 

Connection과 관련된 논의는 TCP 연결의 오버헤드를 줄이는 주제와 관련이 있을 뿐, HTTP는 상태를 보관하지 않는다.