개발 지식/HTTP 지식

🌐 HTTP 2.0 μ†Œκ°œ & 톡신 기술 μ•Œμ•„λ³΄κΈ°

인파_ 2023. 1. 21. 12:37

http-protocol-history

HTTP / 2.0

HTTP 2.0은 κΈ°μ‘΄ HTTP 1.1 λ²„μ „μ˜ μ„±λŠ₯ ν–₯상에 μ΄ˆμ μ„ 맞좘 ν”„λ‘œν† μ½œμ΄λ‹€. 인터넷 ν”„λ‘œν† μ½œ ν‘œμ€€μ˜ λŒ€μ²΄κ°€ μ•„λ‹Œ ν™•μž₯으둜써, HTTP 1.1의 μ„±λŠ₯ μ €ν•˜ λΆ€λΆ„κ³Ό λΉ„νš¨μœ¨μ μΈ 것듀을 κ°œμ„ λ˜μ–΄ νƒ„μƒν•œ 것이 HTTP 2.0라고 μƒκ°ν•˜λ©΄ λœλ‹€. 

HTTP 1.1κΉŒμ§€λŠ” ν•œλ²ˆμ— ν•˜λ‚˜μ˜ 파일만 전솑이 κ°€λŠ₯ν–ˆλ‹€. 비둝 νŒŒμ΄ν”„λΌμ΄λ‹ 기술이 μžˆμ—ˆμ§€λ§Œ, μ—¬λŸ¬ νŒŒμΌμ„ 전솑할 경우 μ„ ν–‰ν•˜λŠ” 파일의 전솑이 λŠ¦μ–΄μ§€λ©΄ HOLB(Head Of Line Blocking)이 λ°œμƒν•˜μ˜€λ‹€.

λ”°λΌμ„œ HTTP 2.0μ—μ„œλŠ” 이 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ μ—¬λŸ¬ νŒŒμΌμ„ ν•œλ²ˆμ— λ³‘λ ¬λ‘œ μ „μ†‘ν•œλ‹€.

http-protocol-history

κ·Έλž˜μ„œ 일반적으둜 HTTP/2λ₯Ό μ‚¬μš©λ§Œν•΄λ„ μ›Ή 응닡 속도가 HTTP/1/1에 λΉ„ν•΄ 15~50% ν–₯상 λœλ‹€κ³  ν•œλ‹€.

μ•„λž˜λŠ” 동일 이미지λ₯Ό μ›Ήμ‚¬μ΄νŠΈμ— λ‘œλ”©μ‹œμΌœ HTTP/1.1κ³Ό HTTP/2의 속도λ₯Ό λΉ„κ΅ν•œ 결과이닀.

http-2.0

μ΄λŸ¬ν•œ ν˜μ‹ μ μΈ 속도에 λŒ€λΆ€λΆ„μ˜ μ‚¬μ΄νŠΈλ“€μ€ HTTP 2λ₯Ό μ§€μ›ν•œλ‹€.

크둬 개발자 도ꡬ λ„€νŠΈμ›Œν¬ νƒ­μ—μ„œ 우츑 ν΄λ¦­ν•˜κ³  Protocol 탭을 ν™œμ„±ν™” μ‹œν‚€λ©΄ 각 μš”μ²­μ— λŒ€ν•œ ν”„λ‘œν† μ½œμ„ λ³Ό 수 μžˆλ‹€.

http-protocol-history
http-protocol-history
h2 κ°€ http/2.0 μ•½μžλΌκ³  보면 λœλ‹€


SPDY ν”„λ‘œν† μ½œ

사싀 HTTP/2.0의 μ›μ‘°λŠ” ꡬ글이 λ§Œλ“  μƒˆλ‘œμš΄ ν”„λ‘œν† μ½œμΈ 2009λ…„ μ€‘λ°˜μ— λ°œν‘œλœ SPDY(μŠ€ν”Όλ””) 이닀.

HTTP/1.1의 λ©”μ‹œμ§€ 포맷은 κ΅¬ν˜„μ˜ λ‹¨μˆœμ„±κ³Ό 접근성에 μ£Όμ•ˆμ μ„ 두고 μ΅œμ ν™” 된 ν”„λ‘œν† μ½œμ΄λ‹€ λ³΄λ‹ˆ μ„±λŠ₯은 μ–΄λŠ 정도 ν¬μƒμ‹œν‚€μ§€ μ•Šμ„ 수 μ—†μ—ˆλ‹€. λ•Œλ¬Έμ— 더 효율적이고 λΉ λ₯Έ HTTPκ°€ ν•„μš”ν–ˆκ³ , μ΄λŸ¬ν•œ μš”κ΅¬μ— λ§Œλ“€μ–΄μ§„ 것이 κ΅¬κΈ€μ˜ SPDY ν”„λ‘œν† μ½œμ΄λ‹€. 

SPDYλŠ” HTTPλ₯Ό λŒ€μ²΄ν•˜λŠ” ν”„λ‘œν† μ½œμ΄ μ•„λ‹ˆκ³  HTTPλ₯Ό ν†΅ν•œ 전솑을 재 μ •μ˜ν•˜λŠ” ν˜•νƒœλ‘œ κ΅¬ν˜„ λ˜μ—ˆλ‹€. κ·Έλž˜μ„œ 전솑 κ³„μΈ΅μ˜ κ΅¬ν˜„λ§Œ λ³€κ²½ν•˜λ©΄ κΈ°μ‘΄ HTTP μ„œλ²„ ν”„λ‘œκ·Έλž¨μ„ κ·ΈλŒ€λ‘œ SPDYμ—μ„œ μ‚¬μš©ν•  수 μžˆμ—ˆλ‹€.

SPDY

ν˜μ‹ μ μΈ μ„±λŠ₯ ν–₯상에 νž˜μž…μ–΄ SPDYλ₯Ό μ‚¬μš©ν•˜λŠ” μ‚¬μ΄νŠΈκ°€ λŠ˜μ–΄λ‚˜κ²Œ λ˜μ—ˆκ³ , μ΄λŸ¬ν•œ 상황을 μ£Όμ‹œν•˜κ³  있던 HTTP-WG(HTTP working group)λŠ” HTTP/2 ν‘œμ€€μ„ μ„ λ³΄μ΄λ €λŠ” λ…Έλ ₯을 ν–ˆκ³  이 ν”„λ‘œν† μ½œμ˜ μ΄ˆμ•ˆμ„ SPDY ν”„λ‘œν† μ½œμ„ μ±„νƒν•˜μ˜€λ‹€.

μ΄λ ‡κ²Œ 2012λ…„λΆ€ν„° 2015λ…„κΉŒμ§€ 3λ…„κ°„μ˜ λ…Έλ ₯으둜 HTTP/2 ν‘œμ€€μ΄ λ°œν–‰λ˜κ²Œ λ˜μ—ˆλ‹€. 그리고 λͺ‡λ…„κ°„ ν•¨κ»˜ λ°œμ „ν•΄μ˜¨ SPDYλŠ” 지원을 μ€‘λ‹¨ν•˜λ©°, HTTP2κ°€ 널리 μ±„νƒλœλ‹€λŠ” 말을 남기고 μ‚¬λΌμ§€κ²Œ λ˜μ—ˆλ‹€.

SPDY


HTTP 2.0 κ°œμ„ μ 

 

Binay Framing Layer

HTTP 1.1κ³Ό HTTP 2.0의 μ£Όμš”ν•œ 차이점은 HTTP 메세지가 1.1μ—μ„œλŠ” text둜 μ „μ†‘λ˜μ—ˆλ˜ 것과 달리, 2.0μ—μ„œλŠ” binary frame둜 μΈμ½”λ”©λ˜μ–΄ μ „μ†‘λœλ‹€λŠ” 점이닀.

κΈ°μ‘΄ text λ°©μ‹μœΌλ‘œ HTTP 메세지λ₯Ό λ³΄λ‚΄λŠ” 방식은, 본문은 압좕이 λ˜μ§€λ§Œ ν—€λ”λŠ” 압좕이 λ˜μ§€ μ•ŠμœΌλ©° 헀더 쀑볡값이 μžˆλ‹€λŠ” 문제 λ•Œλ¬Έμ— HTTP 2.0μ—μ„œλŠ” λ°”μ΄λ„ˆλ¦¬λ‘œ λ³€κ²½ λ˜μ—ˆλ‹€.

λ˜ν•œ HTTP 헀더에 λŒ€ν•΄μ„œ λ°°μ› μ„λ•Œ 헀더와 λ°”λ””λ₯Ό \r μ΄λ‚˜ \n κ³Ό 같은 κ°œν–‰ 문자둜 κ΅¬λΆ„ν•œλ‹€κ³  ν•˜μ˜€λŠ”λ°, HTTP/2.0μ—μ„œ λΆ€ν„°λŠ” 헀더와 λ°”λ””κ°€ layer둜 κ΅¬λΆ„λœλ‹€.

μ΄λ‘œμΈν•΄ 데이터 νŒŒμ‹± 및 전솑 속도가 μ¦κ°€ν•˜μ˜€κ³  였λ₯˜ λ°œμƒ κ°€λŠ₯성이 μ€„μ–΄λ“€μ—ˆλ‹€.

http-2.0

 

Stream κ³Ό Frame λ‹¨μœ„

HTTP/1.1μ—μ„œλŠ” HTTP μš”μ²­μ™€ 응닡은 ν†΅μ§œ ν…μŠ€νŠΈ Message λ‹¨μœ„λ‘œ κ΅¬μ„±λ˜μ–΄ μžˆμ—ˆλ‹€.

HTTP/2 둜 μ˜€λ©΄μ„œ MessageλΌλŠ” λ‹¨μœ„ 외에 Frame, Streamμ΄λΌλŠ” λ‹¨μœ„κ°€ μΆ”κ°€λ˜μ—ˆλ‹€.

  • Frame : HTTP/2μ—μ„œ ν†΅μ‹ μ˜ μ΅œμ†Œ λ‹¨μœ„μ΄λ©°, Header ν˜Ήμ€ Data κ°€ λ“€μ–΄μžˆλ‹€. 
  • Message : HTTP/1.1κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μš”μ²­ ν˜Ήμ€ μ‘λ‹΅μ˜ λ‹¨μœ„μ΄λ©° λ‹€μˆ˜μ˜ Frame으둜 이루어진 λ°°μ—΄ 라인
  • Stream : μ—°κ²°λœ Connection λ‚΄μ—μ„œ μ–‘λ°©ν–₯으둜 Messageλ₯Ό μ£Όκ³  λ°›λŠ” ν•˜λ‚˜μ˜ 흐름

즉, HTTP/2 λŠ” HTTP μš”μ²­μ„ μ—¬λŸ¬κ°œμ˜ Frameλ“€λ‘œ λ‚˜λˆ„κ³ , 이 frame듀이 λͺ¨μ—¬ μš”μ²­/응닡 Messageκ°€ 되고, 그리고 MessageλŠ” νŠΉμ • Stream에 μ†ν•˜κ²Œ 되고, μ—¬λŸ¬κ°œμ˜ Stream은 ν•˜λ‚˜μ˜ Connection에 μ†ν•˜κ²Œ λ˜λŠ” ꡬ쑰이닀.

http-2.0
frame - message - stream - connection

이 처럼 ν”„λ ˆμž„ λ‹¨μœ„λ‘œ 이루어진 μš”μ²­κ³Ό 응닡 λ©”μ„Έμ§€λŠ” ν•˜λ‚˜μ˜ μŠ€νŠΈλ¦Όμ„ 톡해 이루어지며, μ΄λŸ¬ν•œ μŠ€νŠΈλ¦Όλ“€μ΄ ν•˜λ‚˜μ˜ 컀λ„₯μ…˜ λ‚΄μ—μ„œ λ³‘λ ¬μ λ‘œ μ²˜λ¦¬λœλ‹€. ν•˜λ‚˜μ˜ 컀λ„₯μ…˜μ—μ„œ μ—¬λŸ¬κ°œμ˜ 슀트림이 λ™μ‹œμ— μ—΄λ¦¬λ‹ˆ 속도가 λΉ λ₯Όμˆ˜λ°–에 μ—†λ‹€.

쒀더 Stream 톡신 방식에 λŒ€ν•΄ 깊이 파보자면, λͺ¨λ“  μŠ€νŠΈλ¦Όμ€ 31λΉ„νŠΈμ˜ λ¬΄λΆ€ν˜Έ μ •μˆ˜λ‘œ 된 κ³ μœ ν•œ μ‹λ³„μžλ₯Ό κ°–λŠ”λ°, 슀트림이 ν΄λΌμ΄μ–ΈνŠΈμ— μ˜ν•΄ μ΄ˆκΈ°ν™”λ˜μ—ˆλ‹€λ©΄ 이 μ‹λ³„μžλŠ” λ°˜λ“œμ‹œ ν™€μˆ˜μ—¬μ•Ό ν•˜λ©° μ„œλ²„λΌλ©΄ 짝수λ₯Ό κ°–λŠ” μ‹μœΌλ‘œ μš”μ²­ μŠ€νŠΈλ¦ΌμΈμ§€ 응닡 μŠ€νŠΈλ¦ΌμΈμ§€ ꡬ뢄을 λ‘”λ‹€.
μƒˆλ‘œ λ§Œλ“€μ–΄μ§€λŠ” 슀트림의 μ‹λ³„μžλŠ” 이전에 λ§Œλ“€μ–΄μ‘Œκ±°λ‚˜ μ˜ˆμ•½λœ μŠ€νŠΈλ¦Όλ“€μ˜ μ‹λ³„μžλ³΄λ‹€ 컀야 ν•œλ‹€. ν•œλ²ˆ μ‚¬μš©ν•œ 슀트림 μ‹λ³„μžλŠ” λ‹€μ‹œ μ‚¬μš©ν•  수 μ—†λ‹€.
ν•˜λ‚˜μ˜ 컀λ„₯μ…˜μ—μ„œ 였래 μŠ€νŠΈλ¦Όμ„ μ‚¬μš©ν•˜λ‹€λ³΄λ©΄ μŠ€νŠΈλ¦Όμ— 할당될 수 μžˆλŠ” μ‹λ³„μžκ°€ κ³ κ°ˆλ˜κΈ°λ„ ν•˜λŠ”λ°, 그런 경우 컀λ„₯μ…˜μ„ λ‹€μ‹œ λ§ΊλŠ” μ‹μœΌλ‘œ μ²˜λ¦¬ν•œλ‹€.

Multiplexing

Multiplexing

λ°”λ‘œ μœ„μ—μ„œ frame - message - stream - connection κ·Έλ¦Όμ—μ„œ 봀듯이, HTTP 헀더 메세지λ₯Ό λ°”μ΄λ„ˆλ¦¬ ν˜•νƒœμ˜ ν”„λ ˆμž„μœΌλ‘œ λ‚˜λˆ„κ³  ν•˜λ‚˜μ˜ 컀λ„₯μ…˜μœΌλ‘œ λ™μ‹œμ— μ—¬λŸ¬κ°œμ˜ 메세지 μŠ€νŠΈλ¦Όμ„ 응닡 μˆœμ„œμ— 상관없이 μ£Όκ³  λ°›λŠ” 것을 λ©€ν‹°ν”Œλ ‰μ‹±(multiplexing)이라고 ν•œλ‹€.

  • HTTP/1.1의 Connection Keep-Alive, Pipelining, Head Of Line Blocking을 κ°œμ„ ν–ˆλ‹€.
  • latency만 μ€„μ—¬μ£ΌλŠ”κ²Œ μ•„λ‹ˆλΌ κ²°κ΅­ λ„€νŠΈμ›Œν¬λ₯Ό 효율적으둜 μ‚¬μš©ν•  수 있게 ν•˜κ³  κ·Έ κ²°κ³Ό λ„€νŠΈμ›Œν¬ λΉ„μš©μ„ 쀄여쀀닀.
  • 특히 ν΄λΌμš°λ“œ μ‹œμŠ€ν…œμ„ μ΄μš©ν•œλ‹€λ©΄ λΉ„μš©κ³Ό μ§κ²°λœλ‹€.

 

HTTP 1.1 톡신 κ³Όμ •

HTTP 1.1μ—μ„œλŠ” ν•œ TCP 컀λ„₯μ…˜μ„ 톡해 μš”μ²­μ„ λ³΄λƒˆμ„ λ•Œ, 그에 λŒ€ν•œ 응닡이 λ„μ°©ν•˜κ³  λ‚˜μ„œμ•Ό 같은 TCP 컀λ„₯μ…˜μœΌλ‘œ λ‹€μ‹œ μš”μ²­μ„ 보낼 수 μžˆλ‹€. λ”°λΌμ„œ μ›ΉλΈŒλΌμš°μ €λ“€μ€ νšŒμ „ 지연을 쀄이기 μœ„ν•΄ μ—¬λŸ¬ 개의 TCP 컀λ„₯μ…˜μ„ λ§Œλ“€μ–΄ λ™μ‹œμ— μ—¬λŸ¬ 개의 μš”μ²­μ„ λ³΄λ‚΄λŠ” 방법을 μ‚¬μš©ν•˜μ˜€λ‹€. κ·ΈλŸ¬λ‚˜ κ·Έλ ‡λ‹€κ³  TCP 컀λ„₯μ…˜μ„ λ¬΄ν•œμ • λ§Œλ“€ μˆ˜λŠ” 없기에, ν•œ νŽ˜μ΄μ§€μ— 보내야 ν•  μš”μ²­μ΄ μˆ˜μ‹­κ°œμ—μ„œ μˆ˜λ°±κ°œμ— λ‹¬ν•˜λŠ” μš”μ¦˜ μ‹œλŒ€μ—λŠ” ν•œκ³„κ°€ μžˆμ—ˆλ‹€.

Multiplexing

  1. Request 1을 전솑 λ°›κΈ° μœ„ν•΄ ν•˜λ‚˜μ˜ TCP Connection 1 을 μ—΄κ³  μš”μ²­/μ‘λ‹΅ν•œλ‹€.
  2. λ‹€μŒμœΌλ‘œ Request 2, 3, 4을 μš”μ²­ν•˜λŠ”λ° λΉ λ₯΄κ²Œ 전솑받기 μœ„ν•΄ μ—¬λŸ¬κ°œμ˜ 컀λ„₯μ…˜ TCP Connection 2 와 TCP Connection 3을 λ§Œλ“€μ–΄ μš”μ²­/μ‘λ‹΅ν•œλ‹€.
  3. ν•˜μ§€λ§Œ 컀λ„₯μ…˜μ„ λ¬΄ν•œμ •μœΌλ‘œ λ§Œλ“€μˆ˜μ—†μ–΄ μ΄λŸ¬ν•œ 방식은 ν•œκ³„κ°€ μ‘΄μž¬ν•œλ‹€.

 

HTTP 2.0 톡신 κ³Όμ •

반면, HTTP 2μ—μ„œλŠ” ν•˜λ‚˜μ˜ 컀λ„₯μ…˜μ— μ—¬λŸ¬ 개의 슀트림이 λ™μ‹œμ— μš”μ²­/응닡 ν•œλ‹€.

HTTP 1.1은 μš”μ²­κ³Ό 응닡이 λ©”μ‹œμ§€λΌλŠ” λ‹¨μœ„λ‘œ κ΅¬λΆ„λ˜μ–΄ μžˆμ—ˆμ§€λ§Œ, HTTP 2λΆ€ν„°λŠ” Stream을 톡해 μš”μ²­κ³Ό 응닡이 묢일 수 μžˆμ–΄ λ‹€μˆ˜ 개의 μš”μ²­μ„ λ³‘λ ¬μ μœΌλ‘œ μ²˜λ¦¬κ°€ κ°€λŠ₯ν•΄μ‘Œλ‹€. λ”°λΌμ„œ 응닡 ν”„λ ˆμž„λ“€μ€ μš”μ²­ μˆœμ„œμ— 상관없이 λ¨Όμ € μ™„λ£Œλœ μˆœμ„œλŒ€λ‘œ ν΄λΌμ΄μ–ΈνŠΈμ— 전달이 κ°€λŠ₯ν•˜λ‹€.

Multiplexing

  1. Request 1을 전솑 λ°›κΈ° μœ„ν•΄, μš°μ„  Framing Layer을 톡해 λ°”μ΄λ„ˆλ¦¬ ν”„λ ˆμž„ λ‹¨μœ„λ‘œ μͺΌκ°œκ³  ν•˜λ‚˜μ˜ TCP Connection을 λ§Œλ“€κ³  ν†΅μ‹ ν•œλ‹€.
  2. λ‹€μŒμœΌλ‘œ Request 2, 3, 4을 μš”μ²­ν•˜λŠ”λ° 기쑴의 컀λ„₯μ…˜μ„ μ΄μš©ν•˜λ©°, μͺΌκ°œμ§„ ν”„λ ˆμž„λ“€μ€ 메세지 ν†΅λ‘œλ₯Ό 톡해 λ™μ‹œλ‹€λ°œμ μœΌλ‘œ μš”μ²­/응닡 λ°›λŠ”λ‹€.
  3. 컀λ„₯μ…˜ 낭비도 μ—†κ³  λ³‘λ ¬μ μœΌλ‘œ μžμ›μ΄ 전솑받기에 맀우 λΉ λ₯΄λ‹€.

Server Push 

PUSH_PROMISE

HTTP 2.0μ—μ„œλŠ” ν΄λΌμ΄μ–ΈνŠΈμ˜ μš”μ²­μ— λŒ€ν•΄ λ―Έλž˜μ— ν•„μš”ν• κ²ƒ 같은 λ¦¬μ†ŒμŠ€λ₯Ό λ˜‘λ˜‘ν•˜κ²Œ 미리 보낼 수 μžˆλ‹€. 

예λ₯Ό λ“€μ–΄ ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° HTML λ¬Έμ„œλ₯Ό μš”μ²­ν•˜λŠ” ν•˜λ‚˜μ˜ HTTP 메세지λ₯Ό 받은 μ„œλ²„λŠ” κ·Έ HTML λ¬Έμ„œκ°€ λ§ν¬ν•˜μ—¬ μ‚¬μš©ν•˜κ³  μžˆλŠ” 이미지, CSS 파일, JS 파일 λ“±μ˜ λ¦¬μ†ŒμŠ€λ₯Ό 슀슀둜 νŒŒμ•…ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 미리 pushν•΄μ„œ 미리 λΈŒλΌμš°μ €μ˜ μΊμ‹œμ— κ°€μ Έλ‹€ λ†“λŠ”λ‹€.

즉, μ„œλ²„λŠ” μš”μ²­ν•˜μ§€λ„ μ•Šμ€ λ¦¬μ†ŒμŠ€λ₯Ό 미리 보내어 κ°€κΉŒμš΄ λ―Έλž˜μ— νŠΉμ • κ°œμ²΄κ°€ ν•„μš”ν• λ•Œ λ°”λ‘œ μ‚¬μš© λ˜λ„λ‘ μ„±λŠ₯ ν–₯상을 μ΄λŒμ–΄ λ‚΄λŠ” 것이닀. κ·Έλž˜μ„œ ν΄λΌμ΄μ–ΈνŠΈκ°€ HTML λ¬Έμ„œλ₯Ό νŒŒμ‹±ν•΄μ„œ ν•„μš”ν•œ λ¦¬μ†ŒμŠ€λ₯Ό λ‹€μ‹œ μš”μ²­ν•˜μ—¬ λ°œμƒν•˜κ²Œ λ˜λŠ” νŠΈλž˜ν”½κ³Ό νšŒμ „ 지연을 μ€„μ—¬μ€€λ‹€λŠ” μž₯점이 μžˆλ‹€.

 

HTTP 2.0 + Push 톡신 κ³Όμ •

PUSH_PROMISE

  1. μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈλ‘œλΆ€ν„° Request 1을 전솑 λ°›μœΌλ©΄, index.html 에 μžˆλŠ” μžμ›λ“€μ„ νŒŒμ‹±ν•œλ‹€.
  2. ν΄λΌμ΄μ–ΈνŠΈκ°€ λ”°λ‘œ μš”μ²­ν•˜μ§€ μ•Šμ•„λ„, μ„œλ²„κ°€ μ•Œμ•„μ„œ 미리 μžμ›λ“€μ„ ν΄λΌμ΄μ–ΈνŠΈμ— 보낸닀.
  3. λ”°λΌμ„œ 총 λ‘œλ“œ μ‹œκ°„μ΄ μ€„μ–΄λ“œλŠ” 이점이 μžˆλ‹€.

Stream Prioritization

HTTP 1.1μ—μ„œ νŒŒμ΄ν”„λΌμ΄λ‹ μ΄λΌλŠ” ν˜μ‹ μ μΈ 기술이 μžˆμ—ˆμ§€λ§Œ, μš°μ„  μˆœμœ„ 문제 λ•Œλ¬Έμ— HOLB(Head Of Line Blocking)κ°€ λ°œμƒν•˜μ—¬ 사μž₯λ˜μ—ˆλ‹€κ³  HTTP 1.1 κΈ€μ—μ„œ μ†Œκ°œν–ˆμ—ˆλ‹€.

HTTP 2μ—μ„œλŠ” λ¦¬μ†ŒμŠ€κ°„ μ˜μ‘΄κ΄€κ³„(μš°μ„ μˆœμœ„)λ₯Ό μ„€μ •ν•˜μ—¬ 이런 문제λ₯Ό ν•΄κ²°ν•˜μ˜€λ‹€.

 

μœ„μ—μ„œ 봀던 것 처럼 HTTP 메세지가 κ°œλ³„ λ°”μ΄λ„ˆλ¦¬ ν”„λ ˆμž„μœΌλ‘œ λΆ„ν• λ˜κ³ , μ—¬λŸ¬ ν”„λ ˆμž„μ„ λ©€ν‹°ν”Œλ ‰μ‹± ν•  수 있게 λ˜λ©΄μ„œ μš”μ²­κ³Ό 응닡이 λ™μ‹œμ— 이루어져 비약적인 속도 ν–₯상이 λ˜μ—ˆλ‹€.

ν•˜μ§€λ§Œ ν•˜λ‚˜μ˜ 연결에 μ—¬λŸ¬ μš”μ²­κ³Ό 응닡이 λ’€μ„žμ—¬ 버렀 νŒ¨ν‚· μˆœμ„œκ°€ 엉망 징창이 λ˜μ—ˆλ‹€. λ”°λΌμ„œ μŠ€νŠΈλ¦Όλ“€μ˜ μš°μ„ μˆœμœ„λ₯Ό 지정할 ν•„μš”κ°€ μƒκ²ΌλŠ”λ°, ν΄λΌμ΄μ–ΈνŠΈλŠ” μš°μ„ μˆœμœ„ 지정 트리λ₯Ό μ‚¬μš©ν•˜μ—¬ μŠ€νŠΈλ¦Όμ— μ‹λ³„μžλ₯Ό μ„€μ •ν•¨μœΌλ‘œμ¨ ν•΄κ²° ν•˜μ˜€λ‹€.

  • 각각의 μŠ€νŠΈλ¦Όμ€ 1-256 κΉŒμ§€μ˜ κ°€μ€‘μΉ˜λ₯Ό κ°–μŒ
  • ν•˜λ‚˜μ˜ μŠ€νŠΈλ¦Όμ€ λ‹€λ₯Έ μŠ€νŠΈλ¦Όμ—κ²Œ λͺ…ν™•ν•œ μ˜μ‘΄μ„±μ„ κ°–μŒ

Stream Prioritization
μš°μ„ μˆœμœ„ 지정 트리

 

슀트림 μš°μ„ μˆœμœ„ 톡신 κ³Όμ •

Stream Prioritization

  1. ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„μ—κ²Œ μŠ€νŠΈλ¦Όμ„ λ³΄λ‚Όλ•Œ, 각 μš”μ²­ μžμ›μ— κ°€μ€‘μΉ˜ μš°μ„ μˆœμœ„λ₯Ό μ§€μ •ν•˜κ³  보낸닀.
  2. κ·Έλ ‡κ²Œ μš”μ²­ 받은 μ„œλ²„λŠ” μš°μ„ μˆœμœ„κ°€ 높은 응닡이 ν΄λΌμ΄μ–ΈνŠΈμ— μš°μ„ μ μœΌλ‘œ 전달될 수 μžˆλ„λ‘ λŒ€μ—­ν­μ„ μ„€μ •ν•œλ‹€.
  3. 응닡 받은 각 ν”„λ ˆμž„μ—λŠ” 이것이 μ–΄λ–€ μŠ€νŠΈλ¦ΌμΈμ§€μ— λŒ€ν•œ κ³ μœ ν•œ μ‹λ³„μžκ°€ μžˆμ–΄, ν΄λΌμ΄μ–ΈνŠΈλŠ” μ—¬λŸ¬κ°œμ˜ μŠ€νŠΈλ¦Όμ„ interleaving을 톡해 μ„œλ‘œ λΌμ›Œλ†“λŠ” μ‹μœΌλ‘œ μ‘°λ¦½ν•œλ‹€.
μ΅œμ‹  λΈŒλΌμš°μ €λ“€μ€ μžμ›μ˜ μ’…λ₯˜, νŽ˜μ΄μ§€κ°€ λ‘œλ“œλœ μœ„μΉ˜ 그리고 이전 νŽ˜μ΄μ§€ λ°©λ¬Έμ—μ„œ ν•™μŠ΅ν•œ 결과에 따라 μžμ› μš”μ²­μ˜ μš°μ„ μˆœμœ„λ₯Ό κ²°μ •ν•˜κΈ°λ„ ν•œλ‹€.

HTTP Header Data Compression

HTTP 1.1 μ—μ„œ ν—€λ”λŠ” μ•„λ¬΄λŸ° μ••μΆ• 없이 κ·ΈλŒ€λ‘œ μ „μ†‘λ˜μ—ˆλ‹€. 이λ₯Ό κ°œμ„ ν•˜κΈ° μœ„ν•΄ HTTP 2.0μ—μ„œλŠ” HTTP λ©”μ‹œμ§€μ˜ 헀더λ₯Ό μ••μΆ•ν•˜μ—¬ μ „μ†‘ν•œλ‹€.

λ˜ν•œ HTTP 1.1 μ—μ„œλŠ” μ—°μ†μ μœΌλ‘œ μš”μ²­λ˜λŠ” HTTP λ©”μ„Έμ§€λ“€μ—κ²Œμ„œ 헀더값이 μ€‘λ³΅λ˜λŠ” 뢀뢄이 λ§Žμ•„ μ—­μ‹œ λ©”λͺ¨λ¦¬κ°€ λ‚­λΉ„λ˜μ—ˆλŠ”λ°, HTTP 2.0 μ—μ„œλŠ” 이전 Message의 ν—€λ”μ˜ λ‚΄μš© 쀑 μ€‘λ³΅λ˜λŠ” ν•„λ“œλ₯Ό μž¬μ „μ†‘ν•˜μ§€ μ•Šλ„λ‘ν•˜μ—¬ 데이터λ₯Ό μ ˆμ•½ν•  수 있게 λ˜μ—ˆλ‹€. 

HTTP Header Data Compression

만일 메세지 헀더에 쀑볡값이 μ‘΄μž¬ν•˜λŠ” 경우, μœ„μ˜ κ·Έλ¦Όμ—μ„œ Static / Dynamic Header Table κ°œλ…μ„ μ‚¬μš©ν•˜μ—¬ 쀑볡 헀더λ₯Ό κ²€μΆœν•˜κ³ , μ€‘λ³΅λœ ν—€λ”λŠ” indexκ°’λ§Œ μ „μ†‘ν•˜κ³  μ€‘λ³΅λ˜μ§€ μ•Šμ€ Header μ •λ³΄μ˜ 값은 ν˜Έν”„λ§Œ 인코딩(Huffman Encoding) 기법을 μ‚¬μš©ν•˜λŠ” HPACK μ••μΆ• λ°©μ‹μœΌλ‘œ 인코딩 처리 ν•˜μ—¬ μ „μ†‘ν•˜μ—¬, 데이터 전솑 νš¨μœ¨μ„ λ†’μ˜€λ‹€κ³  보면 λœλ‹€.


HTTP 2.0 문제점

 

μ—¬μ „ν•œ RTT (Round Trip Time)

아무리 ν˜μ‹ μ μœΌλ‘œ κ°œμ„ λ˜μ—ˆλ‹€ ν•˜λ”λΌλ„, HTTP 1.1 μ΄λ‚˜ HTTP 2λŠ” μ—¬μ „νžˆ TCPλ₯Ό μ΄μš©ν•˜κΈ° λ•Œλ¬Έμ— Handshake의 RTT(Round Trip Time)λ‘œμΈν•œ 지연 μ‹œκ°„(Latency)이 λ°œμƒν•œλ‹€. κ²°κ΅­ μ›μ΄ˆμ μœΌλ‘œ TCP둜 ν†΅μ‹ ν•˜λŠ”κ²Œ 문제인 것이닀.

 

TCP 자체의 HOLB (Head Of Line Blocking)

λΆ„λͺ… HTTP 2μ—μ„œ HTTP 1.1의 νŒŒμ΄ν”„λΌμ΄λ‹ HOLB 문제λ₯Ό λ©€ν‹°ν”Œλ ‰μ‹±(Multiplexing)을 톡해 ν•΄κ²°ν–ˆλ‹€κ³  ν•˜μ˜€λ‹€.

ν•˜μ§€λ§Œ 기본적으둜 TCPλŠ” νŒ¨ν‚·μ΄ μœ μ‹€λ˜κ±°λ‚˜ 였λ₯˜κ°€ μžˆμ„λ•Œ μž¬μ „μ†‘ν•˜λŠ”λ°, 이 μž¬μ „μ†‘ κ³Όμ •μ—μ„œ νŒ¨ν‚·μ˜ 지연이 λ°œμƒν•˜λ©΄ κ²°κ΅­ HOLB λ¬Έμ œκ°€ λ°œμƒλœλ‹€. TCP/IP 4 계측을 보면, μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 계측(L4)μ—μ„œ HTTP HOLBλ₯Ό ν•΄κ²°ν•˜μ˜€λ‹€ ν•˜λ”λΌλ„, 전솑 계측(L3)μ—μ„œμ˜ TCP HOLB λ₯Ό ν•΄κ²°ν•œκ±΄ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ΄λ‹€.

HOLB

 

μ€‘κ°œμž μΊ‘μŠν™” 곡격

μœ„μ—μ„œ 배웠듯이 HTTP 2.0은 헀더 ν•„λ“œμ˜ 이름과 값을 λ°”μ΄λ„ˆλ¦¬λ‘œ μΈμ½”λ”©ν•œλ‹€. 이λ₯Ό λ‹€λ₯΄κ²Œ λ§ν•˜λ©΄ HTTP 2.0 이 헀더 ν•„λ“œλ‘œ μ–΄λ–€ λ¬Έμžμ—΄μ΄λ“  μ‚¬μš©ν•  수 있게 ν•΄μ€€λ‹€λŠ” λœ»μ΄λ‹€.

κ·Έλž˜μ„œ 이λ₯Ό μ•…μš©ν•˜λ©΄ HTTP 2.0 λ©”μ‹œμ§€λ₯Ό μ€‘κ°„μ˜ Proxy μ„œλ²„κ°€ HTTP 1.1 λ©”μ‹œμ§€λ‘œ λ³€ν™˜ν•  λ•Œ λ©”μ‹œμ§€λ₯Ό λΆˆλ²• μœ„μ‘°ν• μˆ˜ μžˆλ‹€λŠ” μœ„ν—˜μ„±μ΄ μžˆλ‹€. λ‹€ν–‰νžˆ 거꾸둜 HTTP/1.1 λ©”μ‹œμ§€λ₯Ό HTTP/2.0 λ©”μ‹œμ§€λ‘œ λ²ˆμ—­ν•˜λŠ” κ³Όμ •μ—μ„œλŠ” 이런 λ¬Έμ œκ°€ λ°œμƒν•˜μ§€ μ•ŠλŠ”λ‹€.

 

κΈΈλ‹€λž€ 컀λ„₯μ…˜ μœ μ§€λ‘œ μΈν•œ κ°œμΈμ •λ³΄ λˆ„μΆœ 우렀

HTTP 2.0은 기본적으둜 μ„±λŠ₯을 μœ„ν•΄ ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ μ‚¬μ΄μ˜ 컀λ„₯μ…˜μ„ 였래 μœ μ§€ν•˜λŠ” 것을 염두에 두고 μžˆλ‹€.

ν•˜μ§€λ§Œ 이것은 개인 μ •λ³΄μ˜ μœ μΆœμ— μ•…μš©λ  κ°€λŠ₯성이 μžˆλ‹€. μ΄λŠ” HTTP/1.1μ—μ„œμ˜ Keep-Alive도 가지고 μžˆλŠ” λ¬Έμ œμ΄κΈ°λ„ ν•˜λ‹€.


HTTP 2.0을 κ°œμ„ ν•œ HTTP 3.0

μœ„μ˜ HTTP 2.0의 λ¬Έμ œμ μ„ ν•œλ§ˆλ””λ‘œ μš”μ•½ν•˜μžλ©΄ TCPκ°€ λ¬Έμ œμ΄λ‹€. (HTTPλŠ” TCP 기반 μœ„μ—μ„œ λ™μž‘λœλ‹€)

μ΅œκ·Όμ— λ‚˜μ˜¨ HTTP 3.0 버전은 TCPλ₯Ό 버리고 UDPλ₯Ό μ±„νƒν•˜μ˜€λ‹€. μ •ν™•νžˆ λ§ν•˜λ©΄ UDPλ₯Ό κ°œμ‘°ν•œ QUIC λΌλŠ” ν”„λ‘œν† μ½œμ„ μƒˆλ‘œ λ§Œλ“€μ—ˆλ‹€.

κΈ°μ‘΄ TCPλŠ” ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„ 간에 μ„Έμ…˜μ„ μ„€μ •ν•˜κΈ° μœ„ν•΄ ν•Έλ“œμ‰μ΄ν¬κ°€ ν•„μš”ν•˜λ©°, μΈμ¦μ„œμΈ TLS도 μ„Έμ…˜μ΄ λ³΄ν˜Έλ˜λ„λ‘ 자체 ν•Έλ“œμ…°μ΄ν¬λ„ ν•„μš”ν•˜λ‹€. ν•˜μ§€λ§Œ QUICλŠ” λ³΄μ•ˆ μ„Έμ…˜μ„ μ„€μ •ν•˜κΈ° μœ„ν•΄ ν•œ 번의 ν•Έλ“œμ…°μ΄ν¬λ§Œ ν•„μš”ν•˜λ‹€. μ•„λž˜ 그림만 봐도 ν•œλ²ˆ ν†΅μ‹ ν•˜λŠ”λ° λ“œλŠ” μ‹œκ°„ μ„Έλ‘œμΆ• 차이가 μ–΄λ§ˆμ–΄λ§ˆν•˜κ²Œ λ‚œλ‹€λŠ” 것을 λ³Ό 수 μžˆλ‹€.

HTTP 3.0에 λŒ€ν•œ μžμ„Έν•œ μŠ€νŽ™μ„ 보렀면 μ•„λž˜ ν¬μŠ€νŒ…μ„ μ°Έκ³ ν•˜κΈΈ λ°”λž€λ‹€.

http-3.0

 

[WEB] 🌐 HTTP 3.0 톡신 기술 - μžμ‹ μžˆκ²Œ μ΄ν•΄ν•˜κΈ°

HTTP / 3.0 HTTP 2.0 의 λ“±μž₯κ³Ό ν•¨κ»˜ 기쑴의 ν”„λ‘œν† μ½œ 데이터 체계λ₯Ό ν”„λ ˆμž„κ³Ό 슀트림 κ°œλ…μœΌλ‘œ μž¬κ΅¬μΆ•ν•œ κ²°κ³Ό κΈ°μ‘΄ 보닀 ν˜μ‹ μ μœΌλ‘œ μ„±λŠ₯이 ν–₯μƒλ˜κ²Œ λ˜μ—ˆλ‹€. ν•˜μ§€λ§Œ μ—¬μ „νžˆ HTTPλŠ” TCP 기반 μœ„μ—μ„œ 동

inpa.tistory.com


# 참고자료

HTTP μ™„λ²½ κ°€μ΄λ“œ - Programming Insight

https://web.dev/performance-http2/

https://freecontent.manning.com/animation-http-1-1-vs-http-2-vs-http-2-with-push/ 

https://calendar.perfplanet.com/2018/http2-prioritization/ 

https://ssup2.github.io/theory_analysis/HTTP2/ 

https://m.mkexdev.net/354