티스토리 뷰
1. HTTP/2 개요
- HTTP/2는 Google에서 개발한 SPDY에서 파생되었다.
- 대부분의 브라우저에서 표준화 노력을 하였고, 15년 말 HTTP/2 지원을 추가.
- W3Techs(웹기술조사사이트)에 따르면 17년 11월 HTTP/2를 사용하는 사이트는 20.5%
- HTTP/2의 기본 프로토콜 단위는 프레임
- 요청에 대한 멀티플렉싱은 각각의 HTTP 요청/응답 교환이 자체 스트림과 연결되도록 수행
- 스트림은 대체로 서로 독립적이므로, 요청 또는 응답이 차단되거나 지연 되어도 다른 스트림을 방해하지 않음.
- 흐름 제어 및 우선 순위 지정을 통해 다중화 된 스트림을 효율적으로 사용 할 수 있음.
- HTTP/2는 서버가 클라이언트에 응답을 보낼 수 있는 새로운 상호 작용 모드를 추가함.
- 연결에 사용되는 HTTP 헤더 필드에는 많은 양의 중복 데이터가 포함될 수 있으므로 이를 포함하는 프레임이 압축됨.
2. HTTP/2의 목표
- Client or Server가 HTTP1.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.x의 Head-of-Line Blocking 문제를 피하기 위해 요청 및 응답의 멀티플렉싱, 헤더 압축, 요청의 우선 순위를 사용함.
- HTTP/2는 Chunked를 지원하지 않음.
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.1로 HTTP/2 시작하기
- 아래 그림과 같이 헤더에 h2c토큰과 함께 업그레이드헤더 필드를 포함하는 HTTP1.1 요청으로 HTTP/2를 시작할 수 있음. 이러한 HTTP1.1요청은 정확히 하나의 HTTP2-Setting 헤더필드를 포함해야 함
- HTTP / 2를 지원하지 않는 서버는 업그레이드 헤더 필드가 없는 것처럼 요청에 응답 할 수 있음
- h2는 TLS를 사용하기 때문에 암호화되지 않은 업그레이드 헤더에서 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 |