개발 지식/HTTP 지식

🌐 HTTP 0.9 ~ HTTP 1.1 κΉŒμ§€ μ•Œμ•„λ³΄λŠ” 톡신 기술

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

http-protocol-history

HTTP / 0.9

http-0.9

HTTP의 μ‹œμž‘μ€ 1989λ…„ νŒ€ λ²„λ„ˆ 리(Tim Berners-LEE)에 μ˜ν•΄ μ œμ•ˆλœ μΈν„°λ„·μ˜ ν•˜μ΄νΌ ν…μŠ€νŠΈ μ‹œμŠ€ν…œμ΄λ‹€.

초기 버전인 HTTP/0.9λŠ” 맀우 λ‹¨μˆœν•œ ν”„λ‘œν† μ½œμ΄μ—ˆλ‹€.

κ°€λŠ₯ν•œ λ©”μ„œλ“œλŠ” ν•˜μ΄νΌν…μŠ€νŠΈ λ¬Έμ„œ(html)λ₯Ό κ°€μ Έμ˜€κΈ°λ§Œ ν•˜λŠ” GET λ™μž‘μ΄ μœ μΌν–ˆμœΌλ©°, 헀더(header)도 μ—†μ–΄ μš”μ²­κ³Ό 응닡이 극히 λ‹¨μˆœ λͺ…λ£Œ ν•˜μ˜€λ‹€. λ˜ν•œ μƒνƒœ μ½”λ“œ(status code)도 μ—†μ—ˆκΈ° λ•Œλ¬Έμ— λ¬Έμ œκ°€ λ°œμƒν•œ 경우 νŠΉμ • html νŒŒμΌμ„ 였λ₯˜μ— λŒ€ν•œ μ„€λͺ…κ³Ό ν•¨κ»˜ λ³΄λ‚΄μ‘Œλ‹€.

http-0.9

<HTML>
A very simple HTML page
</HTML>

HTTP 0.9 μŠ€νŽ™μ„ μš”μ•½ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • TCP/IP 링크 μœ„μ—μ„œ λ™μž‘ν•˜λŠ” ASCII ν”„λ‘œν† μ½œ
  • Get λ©”μ„œλ“œλ§Œ 지원
  • HTTP 헀더 X, μƒνƒœ μ½”λ“œ X
  • 응닡도 HTML 파일 자체만 λ³΄λ‚΄μ€Œ
  • μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ κ°„μ˜ 연결은 λͺ¨λ“  μš”μ²­ 후에 λ‹«νž˜(closed)

사싀 μ΄ˆκΈ°μ—λŠ” 버전 λ²ˆν˜Έκ°€ μ‘΄μž¬ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ, 이후에 λ‹€λ₯Έ http 버전듀과 κ΅¬λΆ„ν•˜κΈ° μœ„ν•΄μ„œ 0.9λΌλŠ” 버전을 λΆ™μ΄κ²Œ λ˜μ—ˆλ‹€κ³  ν•œλ‹€.

HTTPλŠ” μ΄λŸ¬ν•œ 비ꡐ적 λ‹¨μˆœν•œ ν˜•νƒœλ‘œ 1991년에 μ‹œμž‘λ˜μ–΄, 이후 λΉ λ₯΄κ²Œ μ§„ν™”ν•˜κ³  λ°œμ „ν•˜κ²Œ λ˜μ–΄μ§€κΈ° μ‹œμž‘ ν–ˆλ‹€.


HTTP / 1.0

μΈν„°λ„·μ˜ μ„±μž₯이 날이 갈수둝 κ±°λŒ€ν•΄μ§€λ©΄μ„œ, 1994λ…„ W3Cκ°€ λ§Œλ“€μ–΄μ§€λ©° HTML의 λ°œμ „을 λ„λͺ¨ν•˜κ²Œ λ˜μ—ˆκ³ , μ΄μ™€ λΉ„μŠ·ν•˜κ²Œ HTTP ν”„λ‘œν† μ½œ κ°œμ„ μ— μ΄ˆμ μ„ λ§žμΆ”κΈ° μœ„ν•΄ HTTP-WG(HTTP Working Group)κ°€ μ„€λ¦½λ˜μ—ˆλ‹€.

μ›Ή λΈŒλΌμš°μ €, 인터넷 인프라가 λΉ λ₯΄κ²Œ μ§„ν™”ν•˜λ©° μ΄μ œλŠ” λ‹¨μˆœνžˆ ν•˜μ΄νΌν…μŠ€νŠΈ λ¬Έμ„œ 뿐만 μ•„λ‹ˆλΌ λ©€ν‹°λ―Έλ””μ–΄ λ°μ΄ν„°λ‚˜ 메타데이터 λ“± λ‹€μ–‘ν•˜κ³  μƒμ„Έν•œ 컨텐츠가 ν•„μš”ν•΄μ§μœΌλ‘œμ¨, 기쑴의 HTTP 0.9λ‘œλŠ” λ‹€μ–‘ν•œ μš”κ΅¬μ‚¬ν•­λ“€μ„ μ±„μšΈμˆ˜ μ—†λŠ” ν•œκ³„μ— λ΄‰μ°©ν•˜κ²Œ λ˜μ—ˆλ‹€.

κ·ΈλŸ¬λ‹€ 1996λ…„ HTTP-WGλŠ” HTTP/1.0 κ΅¬ν˜„μ˜ 일반적인 μ‚¬μš©μ„ λ¬Έμ„œν™”ν•œ RFC 1945λ₯Ό λ°œν‘œν•˜κ²Œ λœλ‹€.

RFC 1945λŠ” μ–΄λ ΅κ²Œ 생각할 ν•„μš”μ—†μ΄ HTTP 1.0 ν”„λ‘œν† μ½œ 톡신 μŠ€νŽ™μ— κ΄€ν•œ 기술 λ¬Έμ„œ μ •λ„λ‘œ μƒκ°ν•˜λ©΄ λœλ‹€.
컨텐츠 인코딩, λ‹€μ–‘ν•œ κΈ€μž 지원, λ©€ν‹°νŒŒνŠΈ νƒ€μž…, 인가, 캐싱, ν”„λ‘μ‹œ, λ‚ μ§œ ν˜•μ‹ 등을 λ¬Έμ„œν™” ν•˜μ˜€λ‹€.

μ΄λŠ” λ‹€μŒκ³Ό 같은 μ΅μˆ™ν•œ ν˜•νƒœμ˜ μš”μ²­κ³Ό 응닡 포맷으둜 κ΅¬μ„±λ˜μ—ˆλ‹€.

Request λ©”μ„Έμ§€μ—λŠ” GET μš”μ²­μ΄ μ‹œμž‘λ˜λŠ” 쀄에 PATH와 HTTP 버젼 그리고 λ‹€μŒ μ€„λ‘œ μ΄μ–΄μ§€λŠ” 헀더값을 가지며, Response λ©”μ„Έμ§€μ—λŠ” 200 OK 이후 응닡 μƒνƒœλ‘œ μ΄μ–΄μ§€λŠ” 응닡 헀더값을 κ°€μ§€λŠ” κ±Έ λ³Ό 수 μžˆλ‹€.

http-1.0
http-1.0

이λ₯Έλ°” HTTP 포맷 ν˜•νƒœμ˜ μ‹œμ΄ˆλΌκ³  보면 λœλ‹€.

μ΄λ ‡κ²Œ λ°œν‘œλœ HTTP 1.0 μŠ€νŽ™μ„ μš”μ•½ν•˜λ©΄ λ‹€μŒκ³Ό κ°™λ‹€.

  • 기본적인 HTTP λ©”μ„œλ“œμ™€ μš”μ²­/응닡 헀더 μΆ”κ°€
  • HTTP 버전 정보가 각 μš”μ²­ μ‚¬μ΄λ‚΄λ‘œ μ „μ†‘λ˜κΈ° μ‹œμž‘ (HTTP/1.0 이 GET 라인에 뢙은 ν˜•νƒœλ‘œ)
  • μƒνƒœ μ½”λ“œ(status code)κ°€  μ‘λ‹΅μ˜ μ‹œμž‘ 뢀뢄에 λΆ™μ–΄ μ „μ†‘λ˜μ–΄, λΈŒλΌμš°μ €κ°€ μš”μ²­μ— λŒ€ν•œ 성곡과 μ‹€νŒ¨λ₯Ό μ•Œ 수 있고 κ·Έ 결과에 λŒ€ν•œ λ™μž‘μ„ ν•  수 있게 λ˜μ—ˆλ‹€. (νŠΉμ • λ°©λ²•μœΌλ‘œ 둜컬 μΊμ‹œλ₯Ό κ°±μ‹ ν•˜κ±°λ‚˜ ..λ“±)
  • 응닡 ν—€λ”μ˜ Content-Type 덕뢄에 HTML 파일 ν˜•μ‹ 외에 λ‹€λ₯Έ λ¬Έμ„œλ“€μ„ μ „μ†‘ν•˜λŠ” κΈ°λŠ₯이 μΆ”κ°€λ˜μ—ˆλ‹€.
  • 단기컀λ„₯μ…˜ : connection ν•˜λ‚˜λ‹Ή 1 Request & 1 Response 처리 κ°€λŠ₯

HTTP 1.0 문제점

 

Short-lived Connection

HTTP 1.0의 λ¬Έμ œμ μ€ λΉ„μ—°κ²°μ„±(connectionless)둜 μΈν•œ 단기 컀λ„₯μ…˜(Short-lived connenction) νŠΉμ§•μ΄λ‹€.

즉, 컀λ„₯μ…˜ ν•˜λ‚˜λ‹Ή ν•˜λ‚˜μ˜ μš”μ²­ ν•˜λ‚˜μ˜ 응닡 μ²˜λ¦¬κ°€ κ°€λŠ₯ν•œ 것을 λ§ν•˜λŠ”λ°, μ„œλ²„μ— μžμ›μ„ μš”μ²­ν• λ•Œλ§ˆλ‹€ 맀번 μƒˆλ‘œμš΄ 연결을 ν•΄μ£Όμ–΄μ•Ό ν–ˆλ‹€.

  • 1 Request & 1 response
  • 맀번 μƒˆλ‘œμš΄ μ—°κ²°λ‘œ μ„±λŠ₯ μ €ν•˜
  • 맀번 μƒˆλ‘œμš΄ μ—°κ²°λ‘œ μ„œλ²„ λΆ€ν•˜ λΉ„μš© 증가

단기컀λ„₯μ…˜

예λ₯Όλ“€μ–΄ μ›ΉνŽ˜μ΄μ§€λ₯Ό μš”μ²­ν•˜λ©΄ htmlκ³Ό 그에 λ”Έλ¦° cssλ‚˜ js 및 이미지 λ“±λ“± 수 λ§Žμ€ μžμ›λ“€μ΄ λ‹€μš΄λ‘œλ“œλ˜μ–΄ 화면에 λ„μšΈ 텐데, 각 μžμ›λ“€μ„ λ”°λ‘œ λ”°λ‘œ 맀번 TCP μ—°κ²°ν•˜κ³  λ‹€μš΄λ°›κ³  μ—°κ²° 끊고 λ‹€μ‹œ μ—°κ²°ν•˜κ³  λ‹€μš΄ λ°›κ³  μ—°κ²° λŠλŠ” 것이닀.

κ·Έλž˜μ„œ HTTP μ΄ˆκΈ°μ—λŠ” λͺ¨λ“  μžλ£Œμ— λŒ€ν•΄μ„œ λΉ„μ—°κ²°μ„±μœΌλ‘œ 각각의 μžμ›μ— λŒ€ν•΄ μ—°κ²°/응닡/μ’…λ£Œλ₯Ό λ°˜λ³΅ν•˜λ‹€λ³΄λ‹ˆ λŠλ Έλ‹€.


HTTP / 1.1

HTTP 1.0의 λͺ‡κ°€μ§€ 단점을 μ»€λ²„ν•˜κΈ° μœ„ν•΄ HTTP 1.0이 μΆœμ‹œλœμ§€ 6κ°œμ›” λ§Œμ— 1997λ…„ 1월에 κ³΅μ‹μ μœΌλ‘œ HTTP/1.1이 릴리즈 되게 λœλ‹€. 

HTTP 1.1은 ν˜„μž¬ κ°€μž₯ 많이 μ“°μ΄λŠ” ν”„λ‘œν† μ½œ 버젼이며, μš°λ¦¬κ°€ HTTPλ₯Ό ν•™μŠ΅ν• λ•Œ λ°°μš°λŠ” κΈ°λ³Έ 베이슀 지식이기도 ν•˜λ‹€.

HTTP 1.1 ν‘œμ€€μ€ 이전 λ²„μ „μ—μ„œ 발견 된 λ§Žμ€ ν”„λ‘œν† μ½œ λͺ¨ν˜Έμ„±μ„ ν•΄κ²°ν•˜κ³  λͺ‡ 가지 ν¬λ¦¬ν‹°μ»¬ν•œ μ„±λŠ₯ κ°œμ„ μ„ λ„μž…ν–ˆλ‹€.

쒀더 λ³΄μ™„λœ νŠΉμ§•μ€ λ‹€μŒκ³Ό κ°™λ‹€.

  • 지속 μ—°κ²°(Persistent connection) : μ§€μ •ν•œ timeout λ™μ•ˆ 연속적인 μš”μ²­ 사이에 컀λ„₯μ…˜μ„ 닫지 μ•ŠμŒ. κΈ°μ‘΄ 연결에 λŒ€ν•΄μ„œ handshake μƒλž΅ κ°€λŠ₯
  • νŒŒμ΄ν”„ 라이닝(pipelining) : 이전 μš”μ²­μ— λŒ€ν•œ 응닡이 μ™„μ „νžˆ μ „μ†‘λ˜κΈ° 전에 λ‹€μŒ 전솑을 κ°€λŠ₯ν•˜κ²Œ ν•˜μ—¬,  μ—¬λŸ¬ μš”μ²­μ„ μ—°μ†μ μœΌλ‘œ 보내 κ·Έ μˆœμ„œμ— 맞좰 응닡을 λ°›λŠ” λ°©μ‹μœΌλ‘œ 지연 μ‹œκ°„μ„ μ€„μ΄λŠ” 방식 (λΆˆμ•ˆμ •ν•˜μ—¬ 사μž₯됨)
  • HOST 헀더 μΆ”κ°€ : 동일 IP μ£Όμ†Œμ— λ‹€λ₯Έ 도메인을 ν˜ΈμŠ€νŠΈν•˜λŠ” κΈ°λŠ₯ κ°€λŠ₯
  • Chunk Encoding 전솑 : 응닡 쑰각
  • λ°”μ΄νŠΈ λ²”μœ„ μš”μ²­
  • μΊμ‹œ μ œμ–΄ λ©”μ»€λ‹ˆμ¦˜ λ„μž…

Persistent Connection (keep-alive)

HTTPλŠ” TCP μ—°κ²° 기반 μœ„μ—μ„œ λ™μž‘ν•˜λŠ” ν”„λ‘œν† μ½œλ‘œ μ‹ λ’°μ„± 확보λ₯Ό μœ„ν•΄ 연결을 λ§Ίκ³  λŠλŠ” 데 μžˆμ–΄μ„œ 3 way Handshake κ°€ 이루어진닀. 그런데 HTTPλŠ” 기본적으둜 λΉ„μ—°κ²°μ„±(connecitonless) ν”„λ‘œν† μ½œμ΄κΈ° λ•Œλ¬Έμ— ν•œ 번의 μš”μ²­κ³Ό 응닡을 ν•˜κ³  응닡이 λλ‚˜λ©΄ 연결을 λŠμ–΄ λ²„λ¦¬λŠ”λ°, μžμ›μ„ μš”μ²­ν• λ•Œ λ§ˆλ‹€ 연결을 λ§Ίκ³  λŠμ–΄λ²„λ € μ˜€λ²„ν—€λ“œ(overhead)κ°€ μƒκΈ°κ²Œ λœλ‹€.

κ·Έλž˜μ„œ HTTP/1.1μ—μ„œ Persistent Connection κΈ°λŠ₯이 μΆ”κ°€λ¨μœΌλ‘œμ¨, ν•œ 번 λ§Ίμ–΄μ‘Œλ˜ 연결을 λŠμ§€ μ•Šκ³  μ§€μ†μ μœΌλ‘œ μœ μ§€ν•˜μ—¬ λΆˆν•„μš”ν•œ Handshakeλ₯Ό 쀄여 μ„±λŠ₯을 κ°œμ„ ν•˜μ˜€λ‹€.

  • 연결을 μœ μ§€ν•¨μœΌλ‘œμ¨ Handshake 과정을 μƒλž΅ν•΄ λΉ λ₯΄κ²Œ μžμ›μ„ λ°›μ•„μ˜¬ 수 μžˆλ‹€.
  • λΆˆν•„μš”ν•œ μ—°κ²°μ˜ λ§Ίκ³  λŠμŒμ„ μ΅œμ†Œν™”μ‹œμΌœ λ„€νŠΈμ›Œν¬ λΆ€ν•˜λ₯Ό 쀄 일 수 μžˆλ‹€.
  • ν΄λΌμ΄μ–ΈνŠΈ μΈ‘μ—μ„œ μš”μ²­μ— keep-alive 헀더λ₯Ό λ‹΄μ•„ 보내야 ν•œλ‹€. 
  • μ •ν™•ν•œ Content-length 헀더λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€. ν•˜λ‚˜μ˜ connection을 κ³„μ†ν•΄μ„œ μž¬μ‚¬μš©ν•΄μ•Ό ν•˜λŠ”λ°, νŠΉμ • μš”μ²­μ˜ μ’…λ£Œλ₯Ό νŒλ‹¨ν•  수 μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.
  • Connection 헀더λ₯Ό μ§€μ›ν•˜μ§€ μ•ŠλŠ” proxyμ—λŠ” μ‚¬μš©ν•  수 μ—†λ‹€.

Persistent Connection

가끔 HTTP 지속 연결을 persistent connection ν˜Ήμ€ keep-alive connection 으둜 μš©μ–΄λ₯Ό ν˜Όμž¬ν•˜λŠ”λ°, μ •ν™•νžˆλŠ” persistent connection이 λ§žλ‹€.
keep-aliveλŠ” HTTP 1.0+이 persistent connection을 μ—°κ²°ν•˜κΈ° μœ„ν•΄, 헀더에 λͺ…μ‹œν•΄ μ‚¬μš©ν•˜λŠ” 단어라고 보면 λœλ‹€.

 

keep-alive λ™μž‘ κ³Όμ •

Keep-AliveλŠ” μ›λ¦¬λŠ” λ‹¨μˆœν•˜λ‹€.

μ§€μ •ν•œ timeoutλ™μ•ˆ 연결을 λŠμ§€ μ•Šκ²Œ μ§€μ •ν•΄μ„œ, HTTP μš”μ²­κ³Ό 응닡 μ‹œ λ‹€μˆ˜μ˜ TCP μ—°κ²° handshakeλ₯Ό μ€„μ΄λŠ” 것에 μ΄ˆμ μ„ λ‘”λ‹€.

HTTP/1.1λΆ€ν„°λŠ” keep-aliveκ°€ 기본으둜 μ„ΈνŒ…λ˜μ–΄ μžλ™μœΌλ‘œ Persistent Connection 연결이 λœλ‹€. ν•˜μ§€λ§Œ 기본적으둜 HTTP/1.0 connection은 ν•˜λ‚˜μ˜ request에 응닡할 λ•Œλ§ˆλ‹€ connection을 closeν•˜λ„λ‘ μ„€μ •λΌμžˆλ‹€.

keep-alive

λ”°λΌμ„œ HTTP/1.0+ κΈ°λ°˜μ—μ„œ TCP μ—°κ²°μ˜ μž¬μ‚¬μš©μ„ μ›ν• λ•Œ μ•„λž˜μ²˜λŸΌ μš”μ²­ 헀더 Connection 속성에 keep-aliveλ₯Ό μ„ΈνŒ…ν•΄μ•Ό ν•œλ‹€λŠ” νŠΉμ§•μ΄ μžˆλ‹€.

keep-alive
request header

λ§Œμ•½ μ„œλ²„μ—μ„œ keep-alive connection을 μ§€μ›ν•˜λŠ” κ²½μš°μ—λŠ” λ™μΌν•œ 헀더λ₯Ό response에 λ‹΄μ•„ 보내주고, μ§€μ›ν•˜μ§€ μ•ŠμœΌλ©΄ 헀더에 λ‹΄μ•„ 보내주지 μ•ŠλŠ”λ‹€. λ§Œμ•½ μ„œλ²„μ˜ 응닡에 ν•΄λ‹Ή 헀더가 없을 경우 clientλŠ” μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  κ°€μ •ν•˜κ³  connection을 μž¬μ‚¬μš©ν•˜μ§€ μ•Šκ²Œ λœλ‹€.

keep-alive

  • max : keep-alive을 ν†΅ν•΄μ„œ 주고받을 수 μžˆλŠ” request의 μ΅œλŒ€ 갯수. 이 μˆ˜λ³΄λ‹€ 더 λ§Žμ€ μš”μ²­μ„ μ£Όκ³  받을 κ²½μš°μ—λŠ” connection은 closeλœλ‹€.
  • timeout : keep-aliveκ°€ μ–Όλ§ˆλ™μ•ˆ μœ μ§€λ  것인가λ₯Ό μ˜λ―Έν•œλ‹€. 이 μ‹œκ°„μ΄ 지날 λ™μ•ˆ requestκ°€ 없을 κ²½μš°μ— connection은 closeλœλ‹€

keep-aliveλ₯Ό μ΄μš©ν•œ 톡신은 μœ„μ˜ 섀정에 따라 ν΄λΌμ΄μ–ΈνŠΈλ‚˜ μ„œλ²„ 쀑 ν•œμͺ½μ΄ λ‹€μŒ 헀더λ₯Ό λΆ€μ—¬ν•΄ 접속을 λŠκ±°λ‚˜ νƒ€μž„μ•„μ›ƒλ  λ•ŒκΉŒμ§€ 연결이 μœ μ§€λœλ‹€. κ·Έλž˜μ„œ 만일 ν•„μš”ν•œ μžμ›μ„ λͺ¨λ‘ ν• λ‹Ήλ°›κ³  더이상 keep-alive 연결을 μœ μ§€ν•  ν•„μš”κ°€ 없을 경우 μš”μ²­ ν—€λ”μ—μ„œ Connection 속성을 close둜 μ„€μ •ν•΄ μ„œλ²„λ‘œ λ³΄λ‚΄κ²Œ 되면, TCP 지속 연결을 끊게 λœλ‹€.

keep-alive

 

keep-alive 메세지 톡신

λ‹€μŒμ€ λ‘κ°œμ˜ μš”μ²­μ— λŒ€ν•œ HTTP 메세지 μ˜ˆμ‹œμ΄λ‹€.

λ¨Όμ € HTML νŽ˜μ΄μ§€μ— λŒ€ν•œ μš”μ²­μ„ ν•˜κ³  κ·Έλ‹€μŒ μ•„μ΄μ½˜ 이미지에 λŒ€ν•œ μš”μ²­μ„ ν•œλ‹€. 이 2가지 μš”μ²­μ€ λͺ¨λ‘ ν•œ 개의 keep-alive 연결을 톡해 μ „λ‹¬λœλ‹€.

 

1. HTML 파일 μš”μ²­ (인코딩, charsetκ³Ό μΏ ν‚€ 메타데이터와 ν•¨κ»˜)

keep-alive

 

2. HTML μš”μ²­μ— λŒ€ν•œ 응닡

keep-alive

 

3. λ™μΌν•œ TCP 연결에 λ°œμƒν•œ icon 파일 μš”μ²­ (icon νŒŒμΌμ„ λ°›κ³ λ‚˜λ©΄ μ„œλ²„μ—κ²Œ ν•΄λ‹Ή 연결이 μž¬μ‚¬μš©λ˜μ§€ μ•Šμ„ κ²ƒμž„μ„ μ•Œλ¦¬κΈ° μœ„μ— Connection 헀더값을 close둜 μ„€μ •)

keep-alive

 

4. icon 응닡과 μ—°κ²° μ’…λ£Œ

keep-alive


Pipelining

νŒŒμ΄ν”„ 라이닝은 μ—¬λŸ¬κ°œμ˜ μš”μ²­μ„ λ³΄λ‚Όλ•Œ 처음 μš”μ²­μ΄ 응닡될 λ•ŒκΉŒμ§€ 기닀리지 μ•Šκ³  λ°”λ‘œ μš”μ²­μ„ ν•œκΊΌλ²ˆμ— λ³΄λ‚΄λŠ” 것을 μ˜λ―Έν•œλ‹€. 즉, μ—¬λŸ¬κ°œμ˜ μš”μ²­μ„ ν•œκΊΌλ²ˆμ— λ³΄λ‚΄μ„œ 응닡을 λ°›μŒμœΌλ‘œμ„œ λŒ€κΈ°μ‹œκ°„μ„ μ€„μ΄λŠ” κΈ°μˆ μ΄λ‹€.

  • keep-aliveλ₯Ό μ „μ œλ‘œ ν•˜λ©°, μ„œλ²„ κ°„ μš”μ²­μ˜ 응닡속도λ₯Ό κ°œμ„ μ‹œν‚€κΈ° μœ„ν•΄ 적용
  • μ„œλ²„λŠ” μš”μ²­μ΄ λ“€μ–΄μ˜¨ μˆœμ„œλŒ€λ‘œ(FIFO) 응닡을 λ°˜ν™˜ν•œλ‹€.
  • ν•˜μ§€λ§Œ 응닡 μˆœμ„œλ₯Ό 지킀기 μœ„ν•΄ 응닡 처리λ₯Ό 미루기 λ•Œλ¬Έμ— Head Of Line Blocking λ¬Έμ œκ°€ λ°œμƒν•˜μ—¬, κ·Έλž˜μ„œ λͺ¨λ˜ λΈŒλΌμš°μ €λ“€μ€ λŒ€λΆ€λΆ„ νŒŒμ΄ν”„λΌμ΄λ‹μ„ μ‚¬μš©ν•˜μ§€ λͺ»ν•˜λ„둝 막아 λ†“μ•˜λ‹€.
  • HTTP 2μ—μ„œλŠ” λ©€ν‹°ν”Œλ ‰μ‹± μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ λŒ€μ²΄λ˜μ—ˆλ‹€.

Pipelining


Domain Sharding

νŒŒμ΄ν”„λΌμ΄λ‹μ„ λŒ€μ²΄ν•˜κΈ° μœ„ν•œ μ°¨μ„ μ±…μœΌλ‘œ λ‚˜μ˜¨ 기술이며, λΈŒλΌμš°μ €λ“€μ€ ν•˜λ‚˜μ˜ 도메인에 λŒ€ν•΄ μ—¬λŸ¬ 개의 Connection을 μƒμ„±ν•΄μ„œ λ³‘λ ¬λ‘œ μš”μ²­μ„ 보내고 λ°›λŠ” λ°©μ‹μœΌλ‘œ μ„±λŠ₯을 κ°œμ„ ν–ˆλ‹€.

ν•œ 도메인당 6~13개의 TCP 연결듀을 λ™μ‹œ 생성해 μ—¬λŸ¬ λ¦¬μ†ŒμŠ€λ₯Ό ν•œ λ²ˆμ— λ‹€μš΄λ‘œλ“œ ν•˜λŠ” 것이닀. 이λ₯Ό Domain Sharding이라고 λΆ€λ₯Έλ‹€. 

Domain Sharding

ν•˜μ§€λ§Œ λ„λ©”μΈμ˜ μ£Όμ†Œλ₯Ό μ°ΎκΈ° μœ„ν•΄ DNS Lookup κ³Όμ •μ—μ„œ μ‹œκ°„μ„ μž‘μ•„λ¨Ήμ„μˆ˜λ„ 있으며, λΈŒλΌμš°μ €λ³„λ‘œ Domainλ‹Ή Connection 개수의 μ œν•œμ΄ μ‘΄μž¬ν•˜μ—¬ 근본적인 해결책은 μ•„λ‹ˆμ—ˆλ‹€.

Domain Sharding


HTTP/1.1 문제점

 

HOLB (Head Of Line Blocking)

Head Of Line Blocking

μœ„μ—μ„œ μ†Œκ°œν•œ νŒŒμ΄ν”„ 라이닝은 μ–΄μ°Œλ³΄λ©΄ 정말 ν˜μ‹ μ μΈ κΈ°μˆ μ΄μ§€λ§Œ, 보낸 μš”μ²­ μˆœμ„œλŒ€λ‘œ 응닡을 λ°›μ•„μ•Όν•˜λŠ” κ·œμΉ™ λΆ€λΆ„μ—μ„œ λ¬Έμ œκ°€ μƒκΈ°κ²Œ λœλ‹€.

마치 FIFO(μ„ μž…μ„ μΆœ) 처럼 μƒκ°ν•˜λ©΄ λ˜λŠ”λ°, λ¬Έμ œλŠ” μš”μ²­ν•˜λŠ” λ°μ΄ν„°μ˜ ν¬κΈ°λŠ” 제각각 이기 λ•Œλ¬Έμ—, 첫번째둜 μš”μ²­ν•œ 데이터가 μš©λŸ‰μ΄ 큰 데이터라면, λ‘λ²ˆμ§Έ, μ„Έλ²ˆμ§Έ 데이터가 아무리 빨리 μ²˜λ¦¬λ˜μ–΄λ„ μš°μ„ μˆœμœ„ 원칙에 따라 첫번째 λ°μ΄ν„°μ˜ 응닡 속도가 λŠ¦μ–΄μ§€λ©΄ ν›„ μˆœμœ„μ— μžˆλŠ” 데이터 응닡속도도 덩달아 λŠ¦μ–΄μ§€κ²Œ λ˜λŠ” 것이닀.

 

이해가 잘 λ˜μ§€ μ•ŠλŠ”λ‹€λ©΄ μ•„λž˜ 그림을 μ‚΄νŽ΄λ³΄μž.

첫번째 http requestμ—μ„œλŠ” ν•˜λ‚˜μ˜ μš”μ²­λ‹Ή 응닡을 λ°›μ•„μ•Ό λ‹€μŒ μš”μ²­μ„ λ³΄λ‚΄λŠ” 였래된 λ°©λ²•μœΌλ‘œ time 길이λ₯Ό 보면 였래 κ±Έλ € κΈΈλ‹€. κ·Έλž˜μ„œ pipelining을 톡해 λ™μ‹œ μš”μ²­μ„ 톡해 time을 κ°μ†Œ μ‹œμΌ°μ§€λ§Œ, λ¬Έμ œλŠ” 첫번째 μš”μ²­μ— λŒ€ν•œ 응닡이 였래걸릴 경우 κ·Έ λ’€μ˜ 응닡도 같이 늦게 λ˜μ„œ 결과적으둜 총 time이 κΈΈμ–΄μ§€κ²Œ λ˜λŠ” λΉ„νš¨μœ¨μ μΈ 상황이 λ°œμƒν•˜κ²Œ λ˜λŠ” 것이닀.

Head Of Line Blocking

λ”°λΌμ„œ μœ„μ˜ 문제점과 λ”λΆˆμ–΄ κ΅¬ν˜„ λ³΅μž‘μ„±μ— μ˜ν•΄ νŒŒμ΄ν”„ 라이닝은 ν™œμš©μ΄ 맀우 μ œν•œμ μ΄μ—ˆμœΌλ©°, λŒ€λΆ€λΆ„μ˜ λΈŒλΌμš°μ €μ—μ„œλŠ” μ—¬λŸ¬κ°œμ˜ tcp 연결을 λ§Œλ“€μ–΄ λ³‘λ ¬μ μœΌλ‘œ μ΄μš©ν•˜λŠ” 방식을 많이 μ‚¬μš©ν•˜μ˜€μ§€λ§Œ 이 μ—­μ‹œ μΆ”κ°€ λ©”λͺ¨λ¦¬μ™€ λ¦¬μ†ŒμŠ€λ₯Ό λ‚­λΉ„ν•˜λŠ” 단점이 μžˆμ—ˆλ‹€.


RTT (Round Trip Time)

RTT(Round Trip Time)λž€, μš”μ²­(SYN)을 보낼 λ•ŒλΆ€ν„° μš”μ²­μ— λŒ€ν•œ 응닡(SYN+ACK)을 받을 λ•ŒκΉŒμ§€μ˜ 왕볡 μ‹œκ°„μ„ μ˜λ―Έν•œλ‹€.

즉, 아무리 keep-alive 라고 ν•˜μ§€λ§Œ κ²°κ΅­ TCPμƒμ—μ„œ λ™μž‘ν•˜λŠ” HTTP의 νŠΉμ„±μƒ Handshake κ°€ 반볡적으둜 μΌμ–΄λ‚˜κ²Œ λ˜μ–΄ λΆˆν•„μš”ν•œ RTTμ¦κ°€λ‘œ 인해 λ„€νŠΈμ›Œν¬ 지연을 μ΄ˆλž˜ν•˜μ—¬ μ„±λŠ₯이 μ €ν•˜λ˜κ²Œ λœλ‹€.

μ˜ˆμ „μ—λŠ” 컨텐츠가 μ§€κΈˆμ²˜λŸΌ λ§Žμ§€ μ•Šμ•˜κΈ°μ— 큰 뢀담은 μ•„λ‹ˆμ—ˆμ§€λ§Œ, 점점 컨텐츠가 μ¦κ°€ν•˜λ©΄μ„œ μ΄λŸ¬ν•œ λ ˆμ΄ν„΄μ‹œλ„ λΆ€λ‹΄μŠ€λŸ¬μ›Œ μ‘Œλ‹€.

RTT


무거운 헀더 ꡬ쑰와 쀑볡

http/1.1의 ν—€λ”μ—λŠ” λ§Žμ€ 메타정보듀이 μ €μž₯λ˜μ–΄μ Έ μžˆλ‹€. λ˜ν•œ ν•΄λ‹Ή 도메인에 μ„€μ •λœ cookie정보도 맀 μš”μ²­μ‹œ λ§ˆλ‹€ 헀더에 ν¬ν•¨λ˜μ–΄ μ „μ†‘λ˜κΈ° λ•Œλ¬Έμ— 였히렀 μ „μ†‘ν•˜λ €λŠ” 값보닀 헀더 값이 더 큰 κ²½μš°κ°€ λΉ„μΌλΉ„μž¬ ν•˜μ˜€λ‹€.

그리고 지속 컀λ„₯μ…˜ μ†μ—μ„œ μ£Όκ³  λ°›λŠ” μ—°μ†λœ μš”μ²­ 데이터가 μ€‘λ³΅λœ 헀더값λ₯Ό 가지고 μžˆλŠ” κ²½μš°κ°€ λ§Žμ•„ μ“Έλ°μ—†λŠ” λ©”λͺ¨λ¦¬ μžμ›λ„ λ‚­λΉ„ν•˜κ²Œ λ˜λŠ” 꼴이 λ˜μ—ˆλ‹€.

header-http


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

HTTP 2.0은 κΈ°μ‘΄ HTTP 1.1 λ²„μ „μ˜ μ„±λŠ₯ ν–₯상에 μ΄ˆμ μ„ 맞좘 ν”„λ‘œν† μ½œμ΄λ‹€.

기쑴의 HTTP 1.1의 내뢀적인 톡신 ꡬ쑰λ₯Ό λ‹€λ₯Έ κ°œλ…μœΌλ‘œ 솑두리째 λ°”κΏ”λ²„λ ΈλŠ”λ°, μ›Ή 응닡 속도가 HTTP/1/1에 λΉ„ν•΄ 15~50% ν–₯상 λ˜μ—ˆλ‹€.

μ•„λž˜ 그림을 보면 κ³ μš©λŸ‰ 이미지에 λŒ€ν•΄μ„œ 응닡속도 비ꡐλ₯Ό ν•œλˆˆμ— λ³Ό 수 μžˆλ‹€.

HTTP/2

 

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

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

inpa.tistory.com


# 참고자료

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

https://kyun2da.dev/cs/http%EC%9D%98-%EC%97%AD%EC%82%AC%EC%99%80-http2%EC%9D%98-%EB%93%B1%EC%9E%A5/

https://www.imperva.com/learn/performance/http-keep-alive/