2019. 12. 8. 21:49ㆍNetwork
HTTP/2(HTTP/2.0) 은 HTTP 2의 major revision이다. 이는 구글의 SPDY protol 로부터 유래되었다.
http2 는 2015년 5월에 공개되었다.
내 생각에 http2 에서 가장 주안해서 보아야할 점은 latency 의 개선이다.
( speeding up page loads and reducing round-trip time (RTT), especially on resource-heavy web pages)
기존의 http1.0 에서는 선요청에 대한 응답을 받은 후에 다른 요청이 처리될 수 있는 구조였다.
이에 매 request 에 대해
-establish connection
-processing
-close connection
가 끊임없이 반복되었다. 그런데 이는 비효율적이기 때문에 1.1 에서 persistent connection 이라는 개념과 http pipelining 이라는 개념이 추가되었다. 이로 인해 connection 은 재사용될 수 있고 다수의 request 를 server 에 날릴 수 있게 되었다. 하지만 그렇다고 하더라도, request 를 보낸 순서에 따라 response를 받을 수 있다는 지점에서 문제가 발생하였다.
즉 server side blocking 이 발생하게 되는데 먼저 요청을 보낸 request 의 응답이 지연된다면 그 후 응답역시도 같이 지연된다는 문제점이 있다. (Head of Line Blocking)
domain sharding 등의 방법을 통해 성능 개선을 꾀했지만, 브라우저 별 도메인 커넥션 수 재한이 있어서 근본 해결책은 되지 못했다.
-Multiplexing
http2 에서는 데이터를 전송할때 바이너리로 인코딩하여 전송한다.
http1.1 에서는 http 요청과 응답은 메세지(header, body)등의 데이터로 구성되어 있다 . 이에 반해 http2에서는 frame과 stream 이라는 개념이 추가되었다. n frames -> message, n message -> stream
http1 에서는 request 와 response 가 구분되어 있었던 것에 비해 http2 에서는 stream 이라는 단위로 요청과 응답이 묶일수 있는 구조이다. 하나의 스트림이 다수개의 요청과 응답을 요청순서에 관게없이 처리할 수 있다. -> 중간에 응답이 블러킹되더라도 다른 response 들까지 blocking되는 head of blocking 이슈에서 벗어날 수 있다.
-Binary protocols - text 기반 대신 binary 기반으로 데이터 통신을 진행한다. 대소문자 핸들링이나 whitespace 핸들링에 유리할 뿐더러 bandwidth 를 덜 소모하고 더 효율적이며 에러가 덜 발생하는 형태로 파싱된다.
- server push
- 자주 사용하는 리소스들을 케싱한다.
- websocket 과는 다름
- 캐싱되지 않은 리소스를 받아오는 경우
- 페이지에서 필요한 리소스가 페이지를 내려주는 서버에 있는 경우 유용.
- 헤더 압축으로 인한 성능 향상
- 보안 향상 : 웹 브라우저는 맺는 커넥션에 대한 encryption을 http/2 에서만 지원한다.