본문 바로가기

컴퓨터 과학(CS)

[컴퓨터 과학] HTTP의 진화 #3 [HTTP/1.1과 HTTP/2.0]

728x90

HTTP/1.1에서의 문제점

HTTP/1.1은 많은 부분 개선이 되었지만, 여전히 문제가 있습니다. 네트워크에서 같은 큐에 있는 패킷이 그 첫 번째 패킷에 의해 지연될 때 발생하는 성능 저하 현상 HOL Blocking 문제, HTTP/1.1 헤더에 쿠키 등 많은 메타데이터가 들어 있고 압축이 되지 않아 무거운 헤더 구조 문제와 같은 문제를 해결해서 나온 버전이 HTTP/2.0입니다.

HTTP/1.x와 HTTP/2.0 차이점

  1. HTTP 요청 응답 단위
  2. 멀티플렉싱
  3. 서버 푸시
  4. 헤더 압축

HTTP/2.0은 HTTP/1.x보다 지연 시간을 줄이고 응답 시간을 더 빠르게 할 수 있으며 멀티플렉싱, 헤더 압축, 서버 푸시, 요청의 우선순위 처리를 지원하는 프로토콜입니다.

HTTP 요청 응답 단위

HTTP/1.1에서는 HTTP 요청과 응답이 Message 단위로 구성되어 있고 HTTP/2.0에서는 Message 외에 Frame, Stream 단위로 구성되어 있습니다.

 

Frame

HTTP/2.0에서 통신의 최소 단위이며, Header 혹은 Data가 들어있습니다.

 

Message

HTTP/1.1과 마찬가지로 요청 혹은 응답의 단위이며 다수의 Frame으로 이루어져 있습니다.

 

Stream

Stream은 사전적 의미로 '흐르다'라는 의미를 갖고 있으며, 프로그래밍 관점에서 보면 하나의 데이터 흐름을 뜻합니다.

 

출처: https://web.dev/articles/performance-http2?hl=ko

 

HTTP/2.0은 프레임 단위로 이루어진 요청과 응답 메시지가 하나의 스트림을 통해 이루어지고, 여러 개의 스트림들이 하나의 tcp connection 내에서 병렬적으로 처리가 됩니다.

즉, HTTP/2는 HTTP 프로토콜 통신을 바이너리로 인코딩 된 프레임의 교환으로 분할한 다음 특정 스트림에 속하는 메시지에 매핑되어 주고받습니다.

멀티플렉싱

멀티플렉싱은 HTTP/1.1에서 파이프라이닝의 HOL Blocking 문제로 대체된 알고리즘입니다.

멀티플렉싱이란 하나의 커넥션으로 여러 개의 스트림을 사용하여 순서 상관없이 송수신한다는 것입니다.

 

출처: https://web.dev/articles/performance-http2?hl=ko

 

위의 이미지에서 하나의 tcp connection 내에서 여러 개의 스트림을 동시에 주고받습니다. 서버가 클라이언트에게 세분화된 프레임의 스트림 1과 스트림 3을 보내는 동안 클라이언트는 스트림 5를 서버로 전송하고 있습니다. 또한, 받은 쪽에서는 세분화된 프레임을 다시 조립하고 처리하게 됩니다.

이처럼 멀티플렉싱은 여러 개의 스트림을 병렬적으로 동시에 요청/응답합니다.

특징을 정리하면 아래와 같습니다.

  • 여러 요청을 하나도 차단하지 않고 병렬로 인터리브 처리합니다.
  • 여러 응답을 하나도 차단하지 않고 병렬로 인터리빙 할 수 있습니다.
  • 단일 연결을 사용하여 여러 요청과 응답을 동시에 전달합니다.
인터리브란?
인터리브 사전적인 의미로 ‘둘 이상의 것을 번갈아 가며 섞다’와 ‘더 빨리 읽고 처리할 수 있도록 컴퓨터 데이터를 배열하는 것’으로 나와 있습니다. 이 부분을 해석해 보면 여러 개의 데이터를 빨리 처리하기 위한 기법 정도로 알고 넘어가도 좋을 것 같습니다.

스트림 우선순위 지정

HTTP 메시지를 여러 개 프레임으로 분할할 수 있고 여러 스트림의 프레임을 멀티플렉싱할 수 있게 되면서, 클라이언트와 서버 모두에서 프레임이 전달되는 순서가 중요한 성능 고려사항이 됩니다. 이를 용이하게 하기 위해 HTTP/2 표준에서는 각 스트림에 연관된 가중치와 종속 항목을 지정할 수 있습니다.

  • 각 스트림에는 1에서 256 사이의 정수 가중치가 할당될 수 있습니다.
  • 각 스트림에는 다른 스트림에 대한 명시적 종속성이 부여될 수 있습니다.

스트림 종속 항목과 가중치의 조합을 통해 클라이언트는 선호하는 응답 수신 방식을 표현하는 '우선순위 지정 트리'를 구성하고 전달할 수 있습니다. 결과적으로 서버는 이 정보를 사용하여 CPU, 메모리 및 기타 리소스의 할당을 제어하여 스트림 처리의 우선순위를 정할 수 있으며, 응답 데이터가 사용 가능해지면 대역폭을 할당하여 클라이언트에 높은 우선순위 응답을 최적으로 전달할 수 있습니다.

서버 푸시

서버는 원래 요청에 대한 응답 외에도 클라이언트가 명시적으로 요청할 필요 없이 추가 리소스를 클라이언트에 푸시할 수 있습니다.

 

출처: https://web.dev/articles/performance-http2?hl=ko

 

예를 들어 클라이언트로부터 HTML 요청을 받으면 서버는 HTML에 필요한 이미지, CSS, JS 파일 등의 리소스를 스스로 파악하여 클라이언트에게 미리 push 해서 미리 브라우저 캐시에 저장해 놓습니다.

이는 클라이언트가 HTML 문서를 파싱 해서 필요한 리소스를 다시 요청하여 발생하게 되는 트래픽과 회전 지연을 줄여줍니다.

728x90