HTTP2

배세훈·2022년 6월 8일
0

http

목록 보기
1/1

HTTP2 사용이유

  • HTTP/2는 기존의 HTTP/1.X에 비해 성능이 좋다.
  • HTTP/2는 기존의 HTTP/1.X 프로토콜의 모든 핵심 개념들을 그대로 유지하면서 큰 성능 개선을 보여줌. HTTP/2에 필요한 옵션과 기능들을 추가하는 것 만으로 많은 성능 개선을 할 수 있다.

HTTP/1.X

  • TCP 연결 기반 위에서 동작하는 프로토콜
  • 신뢰성 확보를 위해 연결을 맺고 끊는 핸드 셰이크가 이루어짐
  • 비연결성 프로토콜으로 한번의 연결로 한번의 요청과 응답을 하고 응답이 끝나면 연결을 끊어버림. 연결을 맺고 끊을 때마다 핸드 셰이크를 하기 때문에 비연결성 프로토콜에서 오버헤드가 발생
  • 요즘 웹서비스들은 하이퍼 텍스트보다 많은 정적 데이터로 이루어진 하이퍼 미디어로 발전하여 오버헤드가 커질 수 있다.
  • Keep-alive 기능의 추가로 한 번 맺어졌던 연결을 끊지 않고 지속적으로 유지하여 불필요한 핸드 셰이크를 줄여 성능 개선을 하였지만 웹페이지가 예전의 텍스트 위주와는 다르게 점점 미디어들이 추가되고 상태(쿠키, 세션 등)를 유지하려는 기술들이 요구되다 보니 성능 개선이 반드시 필요하게 되었고 이를 위해 부가적인 기능들이 추가되다가 HTTP/2 까지 발전
  • HTTP/1.1에서 성능 개선을 위해 파이프라이닝이라는 기술이 도입됨. 하나의 컬넥션에서 한 번에 순차적인 여러 요청을 연속적으로 하고 그 순서에 맞춰 응답을 받는 방식으로 지연 시간을 줄이는 방법. 순차적으로 데이터를 요청하고 받아야 하다 보니 먼저 받은 요청이 끝나지 않으면 그 뒤에 있는 요청의 처리가 아무리 빨리 끝나도 먼저 온 요청이 끝날 때까지 기다려야 함. 이를 HTTP의 HOL(Head Of Line) Blocking 문제라고 하고 파이프라이닝의 큰 문제. 그래서 모던 브라우저들은 대부분은 파이프라이닝을 사용하지 못하도록 막음. 그래서 H1으로 통신할 때 클라이언트(브라우저)가 요청을 병렬로 하기 위해서 6~8개(브라우저마다 다름)의 커넥션을 이용해 데이터를 가져오는 방식으로 성능을 개선하고 있음.

HTTP/2의 바이너리 프레임과 멀티플렉싱

  • H2의 핵심은 바이너리 프레이밍 계층을 사용해 요청과 응답의 멀티플렉싱을 지원
  • HTTP 메시지를 바이너리 형태의 프레임으로 나누고 이를 전송 후 받은 쪽에서 다시 조립함. 요청과 응답이 동시에 이루어지니 하나의 연결에 여러 요청과 응답이 뒤섞여 있음. 프레이밍 작업은 서버와 클라이언트(브라우저)에서 해주기 때문에 큰 변경사항을 고려하지 않아도 됨. 바이너리 프레이밍과 멀티플렑싱을 이용해 여러 개의 연결 없이 병렬 처리도 할 수 있고 파이프라인이과 달리 HOL문제를 해결
  • 요청 우선순위를 지정할 수 있고 헤더를 압축하여 헤더 오버헤드를 줄이고 클라이언트가 명시적 요청을 하지 않아도 필요한 리소스를 미리 푸시하여 응답시간을 줄이는 서버 푸시 기능이 추가됨.

용어 설명

  • 스트림: 구성된 연결 내에서 전달되는 바이트의 양방향 흐름이며 하나 이상의 메시지가 전달될 수 있습니다.
  • 메시지: 논리적 요청 또는 응답 메시지에 매핑되는 프레임의 전체 시퀀스
  • 프레임: HTTP/2에서 통신의 최소 단위이며 각 최소 단위에는 하나의 프레임 헤더가 포함됨. 이 프레임 헤더는 최소한으로 프레임이 속하는 스트림을 식별함.

톰캣으로 HTTP/2를 설정하여 HTTP/1.X와 단순 비교

  • 톰캣 8.5 이상부터 HTTP/2를 지원. 단 8.5에서는 APR(Tomcat Native)를 설치해야 HTTP/2가 작동함. 또한 HTTP/2로 통신하기 위해서는 TLS가 적용되어야 작동함. TLS 적용은 표준은 아니지만 대부분의 브라우저에서 TLS 설정이 안되어 있으면 H2로 통신이 불가능하도록 되어 있다.

  • TOMCAT 설정

<Connector port="443" protocol="org.apache.coyote.http11.Http11AprProtocol" maxThreads="150" SSLEnabled="true">
	<UpgradeProtocol className = "org.apache.coyote.http2.Http2Protocol" />
    <SSLHostConfig>
    	<Certificate certificateKeyFile=""
        	certificateFile=""
            certificateKeyPassword=""
            type="RSA" />
    </SSLHostConfig>
</Connector>
  • HTTP/2가 HTTP/1.X보다 약 2배에 가까운 성능 개선을 보여주고 있으며 이 성능 차이는 레이턴시가 나쁜 환경에서 더 명확해짐. 또한 전체 전송 데이터 크기도 줄어드니 네트워크 부하도 줄어듬.
profile
성장형 인간

0개의 댓글