더 빠른 웹을 위해: http/2

59
HTTP/2 빠른 웹을 위해 14년 10월 21일 화요일

Upload: eungjun-yi

Post on 23-Jun-2015

12.521 views

Category:

Internet


1 download

DESCRIPTION

10월 17일 세종대에서 열린 한국 웹 20주년 컨퍼런스에서 발표한 "더 빠른 웹을 위해: HTTP/2" 발표자료입니다.

TRANSCRIPT

Page 1: 더 빠른 웹을 위해: HTTP/2

HTTP/2더 빠른 웹을 위해

14년 10월 21일 화요일

Page 2: 더 빠른 웹을 위해: HTTP/2

발표자 소개

•이응준

•NAVER LABS에서 서버사이드 웹 프로그래머로 근무중

•책 HTTP: The Definitive Guide 번역중

14년 10월 21일 화요일

Page 3: 더 빠른 웹을 위해: HTTP/2

오늘 이야기할 것

• HTTP/2는

•왜 만들었나

•왜 빠른가

14년 10월 21일 화요일

Page 4: 더 빠른 웹을 위해: HTTP/2

왜 만들었나

14년 10월 21일 화요일

Page 5: 더 빠른 웹을 위해: HTTP/2

왜 만들었나

• HTTP/1이 너무 느려서

14년 10월 21일 화요일

Page 6: 더 빠른 웹을 위해: HTTP/2

HTTP/1은 왜 느린가

• HTTP/1의 동작:

•클라이언트가 서버에 요청을 보낸다.

•서버가 클라이언트에게 그에 대한 응답을 보낸다.

•대역폭과 상관없이 round trip 때문에 느려짐

14년 10월 21일 화요일

Page 7: 더 빠른 웹을 위해: HTTP/2

HTTP/1은 왜 느린가

•요청이 갔다가 응답이 돌아오는데 걸리는 시간

•서울 <=> 춘천: 8ms

•서울 <=> 일본: 35ms

•서울 <=> 뉴욕: 200ms

•지구 <=> 화성: 8분 ~ 48분

14년 10월 21일 화요일

Page 8: 더 빠른 웹을 위해: HTTP/2

태초의 HTTP

HTML x 1PNG x 20

14년 10월 21일 화요일

Page 9: 더 빠른 웹을 위해: HTTP/2

태초의 HTTP

• TCP 커넥션 수립 (3-way handshake)

• HTML 파일 1개 가져옴

• TCP 커넥션 닫음

• TCP 커넥션 수립 (3-way handshake)

• PNG 파일 1개 가져옴

• TCP 커넥션 닫음

20번 반복

14년 10월 21일 화요일

Page 10: 더 빠른 웹을 위해: HTTP/2

태초의 HTTP

• TCP 커넥션 수립 (3-way handshake)

• HTML 파일 1개 가져옴

• TCP 커넥션 닫음

• TCP 커넥션 수립 (3-way handshake)

• PNG 파일 1개 가져옴

• TCP 커넥션 닫음

20번 반복

42 RTT

14년 10월 21일 화요일

Page 11: 더 빠른 웹을 위해: HTTP/2

HTTP/1.0+ (KEEP-ALIVE)

• TCP 커넥션 수립 (3-way handshake)

• HTML 파일 1개 가져옴

• PNG 파일 1개 가져옴 (20번 반복)

14년 10월 21일 화요일

Page 12: 더 빠른 웹을 위해: HTTP/2

HTTP/1.0+ (KEEP-ALIVE)

• TCP 커넥션 수립 (3-way handshake)

• HTML 파일 1개 가져옴

• PNG 파일 1개 가져옴 (20번 반복)

22 RTT

14년 10월 21일 화요일

Page 13: 더 빠른 웹을 위해: HTTP/2

PARALLEL CONNECTIONS

• TCP 커넥션 수립 (3-way handshake)

• HTML 파일 1개 가져옴

• TCP 커넥션 7개 더 수립 (3-way handshake)

• PNG 파일 8개 가져옴

• PNG 파일 8개 더 가져옴

• PNG 파일 4개 더 가져옴

14년 10월 21일 화요일

Page 14: 더 빠른 웹을 위해: HTTP/2

PARALLEL CONNECTIONS

• TCP 커넥션 수립 (3-way handshake)

• HTML 파일 1개 가져옴

• TCP 커넥션 7개 더 수립 (3-way handshake)

• PNG 파일 8개 가져옴

• PNG 파일 8개 더 가져옴

• PNG 파일 4개 더 가져옴

6 RTT

14년 10월 21일 화요일

Page 15: 더 빠른 웹을 위해: HTTP/2

PIPELINING

• TCP 커넥션 수립 (3-way handshake)

• HTML 파일 1개 가져옴

• PNG 파일 20개 가져옴

14년 10월 21일 화요일

Page 16: 더 빠른 웹을 위해: HTTP/2

PIPELINING

• TCP 커넥션 수립 (3-way handshake)

• HTML 파일 1개 가져옴

• PNG 파일 20개 가져옴

3 RTT

14년 10월 21일 화요일

Page 17: 더 빠른 웹을 위해: HTTP/2

PIPELINING

• TCP 커넥션 수립 (3-way handshake)

• HTML 파일 1개 가져옴

• PNG 파일 20개 가져옴

구현이 어려워서잘 안씀!

14년 10월 21일 화요일

Page 18: 더 빠른 웹을 위해: HTTP/2

HTTP/1은 왜 느린가 2

•헤더가 너무 큼 (특히 쿠키)

14년 10월 21일 화요일

Page 19: 더 빠른 웹을 위해: HTTP/2

성능 개선을 위한 많은 노력들

• HTTP-NG 프로젝트 (1997)

• Roy Fielding이 WAKA 제안

• S+M(Speedy+Mobility, 마이크로소프트)

• SPDY (구글, 2009)

14년 10월 21일 화요일

Page 20: 더 빠른 웹을 위해: HTTP/2

HTTP/2

• HTTP 작업그룹이 SPDY를 기반으로 HTTP/2 작업 시작 (2012년 10월)

14년 10월 21일 화요일

Page 21: 더 빠른 웹을 위해: HTTP/2

HTTP/2는 왜 빠른가

•Header Compression

•Multiplexed Streams

•Server Push

•Stream Priority

14년 10월 21일 화요일

Page 22: 더 빠른 웹을 위해: HTTP/2

HEADER COMPRESSION

•Huffman Coding

•Header Tables

14년 10월 21일 화요일

Page 23: 더 빠른 웹을 위해: HTTP/2

HEADER COMPRESSION

date:Mon, 21 Oct 2013 20:13:21 GMTC S

서버가 헤더 “date:Mon, 21 Oct 2013 20:13:21 GMT”를 클라이언트에게 전송

14년 10월 21일 화요일

Page 24: 더 빠른 웹을 위해: HTTP/2

HEADER COMPRESSION

헤더값에 Huffman Coding 적용: 34 => 29

C S서버가 헤더 “date:Mon, 21 Oct 2013 20:13:21 GMT”를 클라이언트에게 전송

..date..z...T.D. .....f...-..

14년 10월 21일 화요일

Page 25: 더 빠른 웹을 위해: HTTP/2

HEADER COMPRESSION

C S..date..z...T.D. .....f...-..

서버가 헤더 “date:Mon, 21 Oct 2013 20:13:21 GMT”를 클라이언트에게 전송

Index Header Name Header Value

1 :authority

... ... ...

33 date

... ... ...

61 www-authenticate

Static Table

Dynamic Table

Index Header Name Header Value

14년 10월 21일 화요일

Page 26: 더 빠른 웹을 위해: HTTP/2

HEADER COMPRESSION

C S....z...T.D. .....f...-..

서버가 헤더 “date:Mon, 21 Oct 2013 20:13:21 GMT”를 클라이언트에게 전송

Index Header Name Header Value

1 :authority

... ... ...

33 date

... ... ...

61 www-authenticate

Static Table

Dynamic Table

헤더 이름을 Static Table인덱스로 대체: 29 => 24

Index Header Name Header Value

14년 10월 21일 화요일

Page 27: 더 빠른 웹을 위해: HTTP/2

HEADER COMPRESSION

C S....z...T.D. .....f...-..

서버가 헤더 “date:Mon, 21 Oct 2013 20:13:21 GMT”를 클라이언트에게 전송

Index Header Name Header Value

1 :authority

... ... ...

33 date

... ... ...

61 www-authenticate

Static Table

Dynamic Table

Index Header Name Header Value

62 dateMon, 21 Oct 2013 20:13:21 GMT

14년 10월 21일 화요일

Page 28: 더 빠른 웹을 위해: HTTP/2

HEADER COMPRESSION

C S서버가 헤더 “date:Mon, 21 Oct 2013 20:13:21 GMT”를 클라이언트에게 “또” 전송

Index Header Name Header Value

1 :authority

... ... ...

33 date

... ... ...

61 www-authenticate

Static Table

Dynamic Table

Index Header Name Header Value

62 dateMon, 21 Oct 2013 20:13:21 GMT

14년 10월 21일 화요일

Page 29: 더 빠른 웹을 위해: HTTP/2

HEADER COMPRESSION

C S서버가 헤더 “date:Mon, 21 Oct 2013 20:13:21 GMT”를 클라이언트에게 “또” 전송

Index Header Name Header Value

1 :authority

... ... ...

33 date

... ... ...

61 www-authenticate

Static Table

Index Header Name Header Value

62 dateMon, 21 Oct 2013 20:13:21 GMT

Dynamic Table

.헤더 필드를 Dynamic Table 인덱스로 대체: 24 => 1

14년 10월 21일 화요일

Page 30: 더 빠른 웹을 위해: HTTP/2

MULTIPLEXED STREAMS

한 커넥션으로 동시에 여러 메시지를 주고 받을 수 있음

14년 10월 21일 화요일

Page 31: 더 빠른 웹을 위해: HTTP/2

MULTIPLEXED STREAMS

HTML x 1PNG x 20

Max Connections: 8

14년 10월 21일 화요일

Page 32: 더 빠른 웹을 위해: HTTP/2

MULTIPLEXED STREAMS• HTTP/1.1

• TCP 커넥션 1개를 열고

• HTML 문서 1개를 요청해서 받음

• TCP 커넥션 7개를 더 열고

• PNG 파일 8개를 요청해서 받음

• PNG 파일 8개를 더 요청해서 받음

• PNG 파일 4개를 더 요청해서 받음

14년 10월 21일 화요일

Page 33: 더 빠른 웹을 위해: HTTP/2

MULTIPLEXED STREAMS• HTTP/1.1

• TCP 커넥션 1개를 열고

• HTML 문서 1개를 요청해서 받음

• TCP 커넥션 7개를 더 열고

• PNG 파일 8개를 요청해서 받음

• PNG 파일 8개를 더 요청해서 받음

• PNG 파일 4개를 더 요청해서 받음

• HTTP/2

• TCP 커넥션 1개를 열고

• HTML 문서 1개를 요청해서 받음

• PNG 파일 20개를 요청해서 받음

14년 10월 21일 화요일

Page 34: 더 빠른 웹을 위해: HTTP/2

MULTIPLEXED STREAMS

C S14년 10월 21일 화요일

Page 35: 더 빠른 웹을 위해: HTTP/2

MULTIPLEXED STREAMS

C S

GET /a.pngGET /b.pngGET /c.png...

14년 10월 21일 화요일

Page 36: 더 빠른 웹을 위해: HTTP/2

MULTIPLEXED STREAMS

C S

1: GET /a.png3: GET /b.png5: GET /c.png...1 3 5 7 9 11 13 15 17 19

14년 10월 21일 화요일

Page 37: 더 빠른 웹을 위해: HTTP/2

MULTIPLEXED STREAMS

C S

1: GET /a.png3: GET /b.png5: GET /c.png...1 3 5 7 9 11 13 15 17 19

Frame

14년 10월 21일 화요일

Page 38: 더 빠른 웹을 위해: HTTP/2

MULTIPLEXED STREAMS

1 3 5 7 9 11 13 15 17 19

1 1 3 5 5 3 5 1 1 3C S1: a.png3: b.png5: c.png

...

Frame

1: GET /a.png3: GET /b.png5: GET /c.png...

14년 10월 21일 화요일

Page 39: 더 빠른 웹을 위해: HTTP/2

MULTIPLEXED STREAMS

1 3 5 7 9 11 13 15 17 19

1 1 3 5 5 3 5 1 1 3C S

Stream 1: GET /a.pngStream 3: GET /b.pngStream 5: GET /c.png ...

Stream 1: a.pngStream 3: b.pngStream 5: c.png

...

Frame

14년 10월 21일 화요일

Page 40: 더 빠른 웹을 위해: HTTP/2

SERVER PUSH

달라고 하지도 않은 리소스를 서버가 마음대로 보냄

14년 10월 21일 화요일

Page 41: 더 빠른 웹을 위해: HTTP/2

SERVER PUSH

HTML x 1PNG x 2

14년 10월 21일 화요일

Page 42: 더 빠른 웹을 위해: HTTP/2

SERVER PUSH• Server Push 안하면:

• TCP 커넥션 1개를 열고

• HTML 문서 1개를 요청해서 받음

• 그림 파일 2개를 요청해서 받음

14년 10월 21일 화요일

Page 43: 더 빠른 웹을 위해: HTTP/2

SERVER PUSH• Server Push 안하면:

• TCP 커넥션 1개를 열고

• HTML 문서 1개를 요청해서 받음

• 그림 파일 2개를 요청해서 받음

• Server Push 하면:

• TCP 커넥션 1개를 열고

• HTML 문서 1개를 요청해서 그림파일 2개와 함께 받음

14년 10월 21일 화요일

Page 44: 더 빠른 웹을 위해: HTTP/2

SERVER PUSH

1

1 1 1 1 2 1 2 4 1 4C S1: PUSH_PROMISE (2: a.png)1: PUSH_PROMISE (4: b.png)

1: a.html2: a.png4: b.png

1: GET /a.html

14년 10월 21일 화요일

Page 45: 더 빠른 웹을 위해: HTTP/2

SERVER PUSH

1

1 1 1 1 2 1 2 4 1 4C S1: PUSH_PROMISE (2: a.png)

1: PUSH_PROMISE (4: b.png)1: a.html2: a.png4: b.png

1: GET /a.html

a.png를 2번 스트림으로 보내줄 것이니 요청하지 말아라

14년 10월 21일 화요일

Page 46: 더 빠른 웹을 위해: HTTP/2

STREAM PRIORITY

요청에 의존성 관계를 지정할 수 있음

Html File designed by <a href="http://www.thenounproject.com/imicons">iconsmind.com</a>

from the <a href="http://www.thenounproject.com">Noun Project</a>

14년 10월 21일 화요일

Page 47: 더 빠른 웹을 위해: HTTP/2

STREAM PRIORITY

HTML x 1CSS x 1

PNG x 2

Html File designed by <a href="http://www.thenounproject.com/imicons">iconsmind.com</a>

from the <a href="http://www.thenounproject.com">Noun Project</a>

14년 10월 21일 화요일

Page 48: 더 빠른 웹을 위해: HTTP/2

STREAM PRIORITY• 의존성 지정 안하면:

• TCP 커넥션 1개를 열고

• HTML 문서 1개를 요청해서 받음

• CSS 문서 1개와 그림 파일 2개를 요청해서 받음

• CSS 문서가 늦게 와서 렌더링이 늦어짐

14년 10월 21일 화요일

Page 49: 더 빠른 웹을 위해: HTTP/2

STREAM PRIORITY• 의존성 지정 안하면:

• TCP 커넥션 1개를 열고

• HTML 문서 1개를 요청해서 받음

• CSS 문서 1개와 그림 파일 2개를 요청해서 받음

• CSS 문서가 늦게 와서 렌더링이 늦어짐

• 의존성 지정하면:

• TCP 커넥션 1개를 열고

• HTML 문서 1개를 요청해서 받음

• CSS 문서 1개와 그림 파일 2개를 요청해서 받음. 그림 파일이 CSS에 의존성이 있다고 알려줌.

• CSS 문서가 가장 먼저 순조롭게 렌더링

14년 10월 21일 화요일

Page 50: 더 빠른 웹을 위해: HTTP/2

STREAM PRIORITY

7 5 3

3 3 3 3 7 5 5 7 7 5C S3: a.css

5: 1.png7: 2.png

3: GET /a.css5: GET /1.png (3에 의존)7: GET /2.png (3에 의존)

14년 10월 21일 화요일

Page 51: 더 빠른 웹을 위해: HTTP/2

STREAM PRIORITY

7 5 3

3 3 3 3 7 5 5 7 7 5C S3: a.css

5: 1.png7: 2.png

3: GET /a.css5: GET /1.png (3에 의존)7: GET /2.png (3에 의존)

서버가 어떻게 줘야하는지에 대한 규칙은 전혀 없음

14년 10월 21일 화요일

Page 52: 더 빠른 웹을 위해: HTTP/2

FAQ

14년 10월 21일 화요일

Page 53: 더 빠른 웹을 위해: HTTP/2

HTTP/1에서 변하는 것

• HTTP 메시지 포맷

• HTTP 메시지 전송방법

• Connection 헤더 사라짐

• chunked 인코딩 사용 금지

14년 10월 21일 화요일

Page 54: 더 빠른 웹을 위해: HTTP/2

변하지 않는 것

• “HTTP's existing semantics remain unchanged.”

• RFC 7231, 7232, 7233, 7234, 7235 그대로 사용함

14년 10월 21일 화요일

Page 55: 더 빠른 웹을 위해: HTTP/2

SPDY와 다른 점

헤더 압축

SPDY

HTTP/2

zlib

HPACK

14년 10월 21일 화요일

Page 56: 더 빠른 웹을 위해: HTTP/2

SPDY와 다른 점

헤더 압축

SPDY

HTTP/2

zlib

HPACK

CRIME 취약점

14년 10월 21일 화요일

Page 57: 더 빠른 웹을 위해: HTTP/2

브라우저 지원

• IE 11 on Windows 8

• Firefox 34

• Chrome --enable-spdy4

14년 10월 21일 화요일

Page 58: 더 빠른 웹을 위해: HTTP/2

현재 HTTP/2 진행상황

•Working Group Last Call (마무리 단계)

• 2015년 2월 RFC로 출판될 “예정”

14년 10월 21일 화요일

Page 59: 더 빠른 웹을 위해: HTTP/2

HTTP/2에 기여하려면

• HTTP/2 혹은 HPACK 초안을 읽고,

[email protected] 로 의견을 보냅니다.

•오타 수정 같은 것은 https://github.com/http2/http2-spec 로 PullRequest를 보내도 좋습니다.

14년 10월 21일 화요일