HTTP/1.1 ๊ธฐ๋ณธ ๋์ ๋ฐฉ์
Connection๋น ํ๋์ ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ, ๋์ ์ ์ก ๋ถ๊ฐํ๋ฉฐ ์์ฒญ๊ณผ ์๋ต์ด ์์ฐจ์ ์ผ๋ก ์งํํ๋ค. ๊ทธ๋ ๋ค๋ณด๋ ๋ค์ ์ ์ก ๋์ด์ผํ ํ์ผ์ด ๊ธฐ๋ค๋ ค์ผํ๋ ๋ ์ดํด์๊ฐ ๋ฐ์ํ๋ค.
HTTP 1.1์ ๋จ์
HOLB
pipelining์ด๋?
ํ๋ฒ์ Connection์์ ์ฌ๋ฌ ์์ฒญ์ด ๊ฐ๋ฅํ ๊ธฐ๋ฒ
ํ์ดํ๋ผ์ด๋์ ๋จ์ ์ ํ ์์ฒญ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ฉด, ๋ค์ ์์ฒญ์ด ์ง์ฐ๋๋ค. ์ด๊ฒ์ Head of Line Blocking๋ผ๊ณ ํ๋ค.
RTT
์ผ๋ฐ์ ์ผ๋ก HTTP 1.1์ ํ๋ฒ์ ์ปค๋ฅ์ ์ ํ๋ฒ์ ์์ฒญ๊ณผ ์๋ต์ ์ฒ๋ฆฌํ๋ค๋ณด๋, HandShaking ๊ณผ์ ์ด ๋ฐ๋ณต๋๋ค. ๊ทธ๋ ๋ค๋ณด๋ ๋ถํ์ํ RTT๊ฐ ์ฆ๊ฐํ๊ฒ ๋์ด ์ฑ๋ฅ์ด ์ ํ๋๋ค.
RTT๋?
ํจํท์ด ๋ชฉ์ ์ง์ ๋๋ฌํ๊ณ ๋์ ํด๋น ํจํท์ ๋ํ ์๋ต์ด ์ถ๋ฐ์ง๋ก ๋ค์ ๋์์ค๊ธฐ๊น์ง์ ์๊ฐ. ์ฆ, RTT๋ ํจํท ์๋ณต ์๊ฐ์ ๋๋ค.
๋ฌด๊ฑฐ์ด Header
http/1.1์ ํค๋์๋ ๋ง์ ๋ฉํ์ ๋ณด๋ค์ด ์ ์ฅ๋์ด์ ธ ์๋ค. ์ฌ์ฉ์๊ฐ ๋ฐฉ๋ฌธํ ์นํ์ด์ง๋ ๋ค์์ http์์ฒญ์ด ๋ฐ์ํ๊ฒ ๋๋๋ฐ ์ด ๊ฒฝ์ฐ ๋งค ์์ฒญ์ ๋ง๋ค ์ค๋ณต๋ ํค๋๊ฐ์ ์ ์กํ๊ฒ ๋๋ฉฐ ๋ํ ํด๋น domain์ ์ค์ ๋ cookie ์ ๋ณด๋ ๋งค ์์ฒญ์ ๋ง๋ค ํค๋์ ํฌํจ๋์ด ์ด์ฉ๋ ์์ฒญ์ ํตํด์ ์ ์กํ๋ ค๋ ๊ฐ๋ณด๋ค ํค๋ ๊ฐ์ด ๋ ํฐ ๊ฒฝ์ฐ๋ ๋น์ผ๋น์ฌ ํ๋ค.
์์ ๋จ์ ์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ ธ๋ ฅ๋ค
Image Spriting
์์ด์ฝ์ ํ๋์ ํฐ ์ด๋ฏธ์ง ํ์ผ๋ก ๋ง๋ค์ด, ์์ด์ฝ ์ด๋ฏธ์ง ํ์ผ ์์ฒญ ํ์ ์์ฒด๋ฅผ ์ค์ด๋ ๋ฐฉ์์ด๋ค.
CSS์์ ํด๋น ์ด๋ฏธ์ง ํ์ผ์ ์์ด์ฝ ์ขํ ๊ฐ์ ์ด์ฉํ์ฌ ํํํ๋ค.
Domain Sharding
๋ค์์ Connection์ ์ฌ์ฉํ์ฌ ๋ณ๋ ฌ๋ก ์์ฒญํ๋ค. ๋ธ๋ผ์ฐ์ ๋ณ๋ก Connection ๊ฐ์ ์ ํ์ด ์กด์ฌํ๋ค.
Minify CSS/javascript
CSS, Javascript ์์ค์ฝ๋๋ฅผ ์ถ์ํ์ฌ ์ ๋ฌํ๋ค.
Data URI Scheme
Data URI Scheme์ HTML๋ฌธ์๋ด ์ด๋ฏธ์ง ๋ฆฌ์์ค๋ฅผ Base64๋ก ์ธ์ฝ๋ฉ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ก ์ง์ ๊ธฐ์ ํ๋ ๋ฐฉ์์ด๊ณ ์ด๋ฅผ ํตํด ์์ฒญ ์๋ฅผ ์ค์ด๊ธฐ๋ ํ๋ค.
Load Faster
์คํ์ผ์ํธ๋ฅผ HTML ๋ฌธ์ ์์์ ๋ฐฐ์น
์คํฌ๋ฆฝํธ๋ฅผ HTML๋ฌธ์ ํ๋จ์ ๋ฐฐ์น
SPDY์ ๋ฑ์ฅ
HTTP 1.1์ ๋จ์ ์ ๊ทน๋ณตํ๊ธฐ ์ํ ๋ ธ๋ ฅ๋ค์ ์์ฝ๊ฒ๋ ๊ทผ๋ณธ์ ์ธ ํด๊ฒฐ์ฑ ์ ์ ์ํ์ง๋ ๋ชปํ๋ค. Google์ Latency ๊ด์ ์์ HTTP๋ฅผ ๊ณ ์ํํ SPDY๋ผ๋ ์๋ก์ด ํ๋กํ ์ฝ์ ๊ตฌํํ๋ค. HTTP๋ฅผ ๋์นํ๋ ํ๋กํ ์ฝ์ด ์๋, HTTP๋ฅผ ํตํ ์ ์ก์ ์ฌ์ ์ํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋์๋ค. ๊ฒฐ๊ตญ HTTP2 ์ด์์ Google์ SPDY๋ฅผ ์ฐธ๊ณ ํ์ฌ ๋ง๋ค์ด์ง๊ฒ ๋๋ค.
HTTP 2์ ํ์
HTTP/2 is a replacement for how HTTP is expressed “on the wire.” It is not a ground-up rewrite of the protocol; HTTP methods, status codes and semantics are the same, and it should be possible to use the same APIs as HTTP/1.x (possibly with some small additions) to represent the protocol. The focus of the protocol is on performance; specifically, end-user perceived latency, network and server resource usage. One major goal is to allow the use of a single connection from browsers to a Web site.
์์ฝํ์๋ฉด, HTTP ๋ฉ์๋, ์ํ ์ฝ๋ ๋ฐ ์๋ฏธ๋ ๋์ผํ๋ฉฐ ํ๋กํ ์ฝ์ ๋ํ ๋ด๊ธฐ ์ํด HTTP/ 1.x์ ๋์ผํ API (์ผ๋ถ ์์ ์ถ๊ฐ ๊ธฐ๋ฅ ํฌํจ)๋ฅผ ์ฌ์ฉ ํ ์ ์์ด์ผ ํ๋ค. ํ๋กํ ์ฝ์ ์ค์ ์ ์ฑ๋ฅ, ํนํ ์ต์ข ์ฌ์ฉ์๊ฐ ์ธ์งํ๋ ๋๊ธฐ ์๊ฐ, ๋คํธ์ํฌ ๋ฐ ์๋ฒ ๋ฆฌ์์ค ์ฌ์ฉ๋์ ์๋ค.
HTTP2์ ๊ฐ์ ์
Multiplexed Streams
HTTP/2๋ Multiplexed Streams๋ฅผ ์ด์ฉํ์ฌ Connection ํ ๊ฐ๋ก ๋์์ ์ฌ๋ฌ ๊ฐ์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ผ๋ฉฐ ์๋ต์ ์์์ ์๊ด์์ด Stream์ผ๋ก ์ฃผ๊ณ ๋ฐ๋๋ค. HTTP/1.1์ Connection Keep-Alive, Pipelining์ ๊ฐ์ ๋ฒ์ ์ด๋ผ ๋ณด๋ฉด ๋๋ค.
Stream Prioritization
์์์ ์๊ด ์์ด Stream์ผ๋ก ์ฃผ๊ณ ๋ฐ๊ฒ ๋๋ฉด ๋ง์ฝ ๋น์ฅ ํ์ํ ํ์ผ์ ์์๊ฐ ๋ค๋ก ๋ฐ๋ ค๋๋ฉด ํ๋ฉด ๋ ๋๋ง์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์๋ ์๋ค. ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด์ HTTP/2์์๋ ๋ฆฌ์์ค์๊ฐ ์์กด๊ด๊ณ์ ๋ฐ๋ผ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํด ํด๋น ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ค.
Server Push
์๋ฒ๊ฐ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฒญํ์ง ์๋๋ผ๋ ์ฐ์ ํ์ํ ํ์ผ์ ์์ฒด์ ์ผ๋ก ์ ์กํ ์ ์๋ค. ์ด๋ฅผ PUSH_PROMISE ๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ PUSH_PROMISE๋ฅผ ํตํด์ ์๋ฒ๊ฐ ์ ์กํ ๋ฆฌ์์ค์ ๋ํด์ ํด๋ผ์ด์ธํธ๋ ์์ฒญ์ ํ์ง ์๋๋ค. ์ด๋ ๊ฒ ํ๊ฒ ๋๋ฉด ํ์ HTML ๋ฌธ์์์ ํน์ ํ์ผ์ด ํ์ํ๋๋ผ๋ ํด๋ผ์ด์ธํธ์์ ์์ฒด์ ์ผ๋ก ๋ค์ด๋ก๋๋ฅผ ๋ฐ๊ฒ ํจ์ผ๋ก์จ ์์ฒญ ํ์๋ฅผ ์ค์ผ ์ ์๋ค.
Header Compression
HTTP/2๋ Header ์ ๋ณด๋ฅผ ์์ถํ๊ธฐ ์ํด Header Table๊ณผ Huffman Encoding ๊ธฐ๋ฒ์ ์ฌ์ฉํ์ฌ ์ฒ๋ฆฌํ๋๋ฐ ์ด๋ฅผ HPACK ์์ถ๋ฐฉ์์ด๋ผ ๋ถ๋ฅด๋ฉฐ ๋ณ๋์ ๋ช ์ธ์(RFC 7531)๋ก ๊ด๋ฆฌํ๊ณ ์๋ค. ์ ๊ทธ๋ฆผ์ฒ๋ผ ํด๋ผ์ด์ธํธ๊ฐ ๋๋ฒ์ ์์ฒญ์ ๋ณด๋ธ๋ค๊ณ ๊ฐ์ ํ๋ฉด HTTP/1.x์ ๊ฒฝ์ฐ ๋๊ฐ์ ์์ฒญ Header์ ์ค๋ณต๊ฐ์ด ์กด์ฌํด๋ ๊ทธ๋ฅ ์ค๋ณต ์ ์กํ๋ค.
ํ์ง๋ง HTTP/2์์ Header์ ์ค๋ณต๊ฐ์ด ์กด์ฌํ๋ ๊ฒฝ์ฐ Static/Dynamic Header Table ๊ฐ๋ ์ ์ฌ์ฉํ์ฌ ์ค๋ณต Header๋ฅผ ๊ฒ์ถํ๊ณ ์ค๋ณต๋ Header๋ index๊ฐ๋ง ์ ์กํ๊ณ ์ค๋ณต๋์ง ์์ Header์ ๋ณด์ ๊ฐ์ Huffman Encoding ๊ธฐ๋ฒ์ผ๋ก ์ธ์ฝ๋ฉ ์ฒ๋ฆฌ ํ์ฌ ์ ์กํ๋ค.
REFERENCE
https://seokbeomkim.github.io/posts/http1-http2/
https://www.popit.kr/%EB%82%98%EB%A7%8C-%EB%AA%A8%EB%A5%B4%EA%B3%A0-%EC%9E%88%EB%8D%98-http2/