티스토리 뷰

1. HTTP/2 개요

- HTTP/2Google에서 개발한 SPDY에서 파생되었다.

- 대부분의 브라우저에서 표준화 노력을 하였고, 15년 말 HTTP/2 지원을 추가.

- W3Techs(웹기술조사사이트)에 따르면 1711HTTP/2를 사용하는 사이트는 20.5%

- HTTP/2의 기본 프로토콜 단위는 프레임

- 요청에 대한 멀티플렉싱은 각각의 HTTP 요청/응답 교환이 자체 스트림과 연결되도록 수행

- 스트림은 대체로 서로 독립적이므로, 요청 또는 응답이 차단되거나 지연 되어도 다른 스트림을 방해하지 않음.

- 흐름 제어 및 우선 순위 지정을 통해 다중화 된 스트림을 효율적으로 사용 할 수 있음.

- HTTP/2는 서버가 클라이언트에 응답을 보낼 수 있는 새로운 상호 작용 모드를 추가함.

- 연결에 사용되는 HTTP 헤더 필드에는 많은 양의 중복 데이터가 포함될 수 있으므로 이를 포함하는 프레임이 압축됨.

2. HTTP/2의 목표

- Client or ServerHTTP1.1, 2.0 or non HTTP를 선택해서 사용할 수 있는 메커니즘

- HTTP1.1과 높은 호환성 유지(ex) method, status code, URI, Header field)

- 아래를 개선하여 웹 브라우저의 페이지 로드 속도 향상

  1) Data Compression of HTTP Headers

  2) HTTP/2 Server Push

  3) PipeLining of requests

  4) HTTP1.x에서 Head-of-line blocking 문제 수정

  5) 하나 이상의 TCP 다중 요청 연결

3. HTTP1.1과의 차이

    - HTTP/2는 대부분의 HTTP1.1의 구문을 그대로 유지. C-S간에 데이터가 프레임되고 전송되는 것이 새로워 짐.

  - HTTP/2에서는 서버가 컨텐트를 push가 가능해지고, 클라이언트가 요청한 것보다 많은 쿼리에 대한 데이터로 응답 할 수 있음.

  - HTTP1.xHead-of-Line Blocking 문제를 피하기 위해 요청 및 응답의 멀티플렉싱, 헤더 압축, 요청의 우선 순위를 사용함.

  - HTTP/2Chunked를 지원하지 않음.

4. HTTP/2 버전 식별

  - 문자열 “h2”TLS를 사용하는 HTTP/2 프로토콜 식별. 이 식별자는 TLS앱 계층 프로토콜 협상 확장 필드 및 TLS를 통한 HTTP/2가 식별되는 모든 위치에서 사용 {0x68, 0x32}

 

  - 문자열 “h2c”HTTP 2.0이 일반 텍스트 TCP를 통해 실행되는 프로토콜 식별. 이 식별자는 HTTP1.1 업그레이드 헤더 필드 및 TCP를 통한 HTTP/2가 식별되는 모든 위치에서 사용

 

5. HTTP1.1HTTP/2 시작하기

- 아래 그림과 같이 헤더에 h2c토큰과 함께 업그레이드헤더 필드를 포함하는 HTTP1.1 요청으로 HTTP/2를 시작할 수 있음. 이러한 HTTP1.1요청은 정확히 하나의 HTTP2-Setting 헤더필드를 포함해야 함

- HTTP / 2를 지원하지 않는 서버는 업그레이드 헤더 필드가 없는 것처럼 요청에 응답 할 수 있음

- h2TLS를 사용하기 때문에 암호화되지 않은 업그레이드 헤더에서 h2 토큰은 무시해야 함

- 아래와 같이 프레임에는 업그레이드를 시작한 요청에 대한 응답이 포함 되어야 함

- 서버가 보내는 첫 HTTP/2 프레임은 설정 프레임으로 구성된 서버 연결 서문 이어야 함.

6. HTTP/2 설정 헤더 필드

  - 서버는 이 헤더 필드가 없거나 두 개 이상 존재할 경우 HTTP/2로의 연결을 업그레이드 해서는 안됨.

  - HTTP2-Settings 헤더 필드의 내용은 설정 프레임의 페이로드이며 base64url 문자열로 인코딩 됨.

  - 업그레이드가 직접 연결에만 적용되기 때문에 HTTP2-Settings 헤더 필드를 보내는 클라이언트는 Connection 헤더 필드에서 연결 옵션으로 "HTTP2-Settings"을 넣어 보내지 않도록 해야 함.

7. HTTP / 2 연결 서문

  - HTTP / 2에서 각 종점은 사용중인 프로토콜의 최종 확인으로 연결 서문을 보내고 HTTP / 2 연결에 대한 초기 설정을 지정 해야 함.클라이언트와 서버는 각각 다른 연결 서문을 보냄. 클라이언트 연결 서문은 16진법으로 24옥텟 시퀀스로 시작 함.

ex) 0x505249202a20485454502f322e300d0a0d0a534d0d0a0d0a 

     = "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n"

 - 위 시퀀스는 SETTINGS 프레임을 따라야 하며, 반드시 비어 있어야 함. 클라이언트는 101의 수신 즉시 클라이언트 연결 서문을 보냄.

  - 불필요한 대기 시간을 피하기 위해 클라이언트는 서버 연결 서문수신 대기 없이 클라이언트연결 서문을 보낸 직후 서버에 추가 프레임을 보낼 수 있음.

- 서버 연결 서문 설정 프레임에는 클라이언트와 서버간의 통신 방법을 변경 하는 매개 변수가 포함될 수 있음.

- 설정 프레임을 수신하면 클라이언트는 설정된 모든 매개 변수를 존중 해야 함. 일부 구성에서는 클라이언트가 보내기 전에 서버가 설정을 전송할 수 있음.

- 추가 프레임으로 이 문제를 피할 수 있는 기회를 제공함. 클라이언트와 서버는 유효하지 않은 연결 서문을 PROTOCOL_ERROR 유형 의 연결 오류로 처리 해야 함.

- 유효하지 않은 서문은 피어가 HTTP / 2를 사용하고 있지 않음을 나타내기 때문에 GOAWAY 프레임을 생략 할 수 있음.


참고 : RFC7540 https://tools.ietf.org/html/rfc7540

'찾아 본 자료' 카테고리의 다른 글

MySQL 컴파일 설치  (0) 2018.03.19
상위 디렉토리에서 하위 디렉토리 Makefile 한번에 하기  (0) 2018.02.27
vscode 단축키 모음  (0) 2018.01.10
OS감지 전처리기  (0) 2018.01.09
vscode 관련 내용  (0) 2018.01.09
공지사항
최근에 올라온 글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31