λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Network

HTTP/1.0 → HTTP/1.1 → HTTP/2.0 → HTTP/3.0 버전별 차이λ₯Ό μ΄ν•΄ν•˜κΈ°

HTTP λ²„μ „λ§ˆλ‹€ μ–΄λ–€ 단점이 μžˆμ—ˆκ³ , λ‹€μŒ λ²„μ „μ—μ„œ κ·Έ 단점을 μ–΄λ–»κ²Œ ν•΄κ²°ν–ˆλŠ”μ§€λ₯Ό μ†Œκ°œν•˜κ³ μž ν•©λ‹ˆλ‹€.

HTTP/1.0

HTTP/1.0 은 μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°„μ— Connection 을 μ§€μ†ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

즉, ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ™€ Connection 을 λ§ΊκΈ° μœ„ν•΄ DNS 쑰회, TCP 3-way handshake, SSL/TLS handshake 같이 λ„€νŠΈμ›Œν¬ 지연 μ‹œκ°„μ„ λŠ˜λ¦¬λŠ” ν–‰μœ„λ₯Ό 1개의 μš”μ²­ λ§ˆλ‹€ 반볡적으둜 ν–ˆλ‹€λŠ” κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€. 

μ΄λŠ” 맀우 λΆˆν•„μš”ν•œ ν–‰μœ„μ΄κΈ° λ•Œλ¬Έμ—, HTTP/1.1 은 이λ₯Ό μ΅œμ ν™” ν•˜κ²Œ λ©λ‹ˆλ‹€.

 

HTTP/1.1

β–Ά HTTP/1.1 의 κΈ°λŠ₯ : Keep-Alive

 

κ·Έλž˜μ„œ, HTTP/1.1 λΆ€ν„° 맀 μš”μ²­λ§ˆλ‹€ Connection 을 맺지 μ•ŠκΈ° μœ„ν•΄ μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°„μ˜ Connection 을 Keep-Alive ν•˜κ²Œ μœ μ§€ν•©λ‹ˆλ‹€.

* Keep - Alive : ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„κ°„μ˜ 연결을 μœ μ§€ν•˜μ—¬ ν•˜λ‚˜μ˜ TCP μ—°κ²°λ‘œ μ—¬λŸ¬ 개의 μš”μ²­/응닡을 μ²˜λ¦¬ν•  수 μžˆλŠ” μƒνƒœ

 

이 덕뢄에 ν•˜λ‚˜μ˜ TCP Connection 을 톡해 μ—¬λŸ¬ 개의 μš”μ²­/응닡을 μ²˜λ¦¬ν•  수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

κ·Έλ ‡κ²Œ Keep-Alive λŠ” HTTP/1.1 λΆ€ν„° κΈ°λ³Έ λ™μž‘μœΌλ‘œ ν¬ν•¨λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ§Œμ•½, ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„μ™€μ˜ 연결을 끊고 μ‹Άλ‹€λ©΄ Connection: close λ₯Ό 헀더에 ν¬ν•¨μ‹œμΌœ μ„œλ²„μ— λͺ…μ‹œμ μœΌλ‘œ μš”μ²­ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

β–Ά HTTP/1.1 의 κΈ°λŠ₯ : νŒŒμ΄ν”„λΌμ΄λ‹

 

λ˜ν•œ, HTTP/1.1 은 νŒŒμ΄ν”„λΌμ΄λ‹ κΈ°λŠ₯도 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

νŒŒμ΄ν”„λΌμ΄λ‹μ΄λž€ ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ— λŒ€ν•œ 응닡을 기닀리지 μ•Šκ³ λ„ 단일 TCP 연결을 톡해 μ—¬λŸ¬ HTTP μš”μ²­μ„ λ³΄λ‚΄λŠ” κ²ƒμž…λ‹ˆλ‹€.

사진1. 좜처 : ByteByteGo (https://www.youtube.com/watch?v=a-sBfyiXysI)

 

β–Ά HTTP/1.1 의 κΈ°λŠ₯ : νŒŒμ΄ν”„λΌμ΄λ‹μ˜ 단점

 

κ·ΈλŸ¬λ‚˜, νŒŒμ΄ν”„λΌμ΄λ‹μ€ μš”μ²­ μˆœμ„œμ— 맞게 응닡을 λ°›μ•„μ•Ό ν•˜λŠ” 치λͺ…적인 단점이 μžˆμŠ΅λ‹ˆλ‹€.

 

예λ₯Ό λ“€μ–΄, ν΄λΌμ΄μ–ΈνŠΈκ°€ [μš”μ²­1, μš”μ²­2, μš”μ²­3] 순으둜 μš”μ²­ν•˜λ©΄ [응닡1, 응닡2, 응닡3] 순으둜 응닡을 λ°›μ•„μ•Ό ν•©λ‹ˆλ‹€.

λ§Œμ•½, 응닡2κ°€ κ°€μž₯ λ¨Όμ € ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ™”λ‹€λ©΄, 응닡2λŠ” 응닡1이 였기 μ „κΉŒμ§€ μ²˜λ¦¬λ˜μ§€ μ•Šκ³  κΈ°λ‹€λ¦¬κ²Œ λ©λ‹ˆλ‹€.

 

μ΄λ ‡κ²Œ λ™μΌν•œ Connection μ—μ„œ νŠΉμ • μš”μ²­μ— λŒ€ν•΄ 후속 μš”μ²­μ΄ 영ν–₯을 λ°›λŠ” 것을 Head of Line Blocking(HOL Blocking)이라 ν•©λ‹ˆλ‹€. κ·Έλž˜μ„œ, HTTP/2.0 μ—μ„œλŠ” HOL Blocking 을 ν•΄κ²°ν•˜κ³ μž ν•©λ‹ˆλ‹€.

 

μΆ”κ°€λ‘œ, νŒŒμ΄ν”„λΌμ΄λ‹μ€ κ΅¬ν˜„μ΄ μ–΄λ €μ› κ³ , ν”„λ‘μ‹œ(쀑계) μ„œλ²„κ°€ νŒŒμ΄ν”„λΌμ΄λ‹μ„ μ œλŒ€λ‘œ μ²˜λ¦¬ν•˜μ§€λͺ»ν•΄μ„œ 크둬, νŒŒμ΄μ–΄ν­μŠ€ 같은 λΈŒλΌμš°μ €λŠ” κ²°κ΅­ 이 νŒŒμ΄ν”„λΌμ΄λ‹μ„ μ§€μ›ν•˜μ§€ μ•Šκ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

HTTP/2.0

β–Ά HTTP/2.0 의 κΈ°λŠ₯ : frame κ³Ό Stream μ†Œκ°œ

 

μš°μ„  HTTP/1.1 μ—μ„œ λ©”μ‹œμ§€λ₯Ό text 둜 λ³΄λƒˆλ‹€λ©΄, HTTP/2.0 은 textλ₯Ό binary ν™” ν•˜μ—¬ header λ‘œλŠ” header frame, body λŠ” body frame μ΄λž€ 데이터 λ‹¨μœ„λ₯Ό λ§Œλ“­λ‹ˆλ‹€(사진 좜처: 링크

사진2. text λ₯Ό frame 으둜 λ³€ν™˜

 

μ΄λ ‡κ²Œ 1개의 λ©”μ‹œμ§€λŠ” 1 or 2개의 HEADER frame κ³Ό 0개 μ΄μƒμ˜  DATA frame 으둜 λ‚˜λ‰˜μ–΄μ„œ μ „μ†‘λ˜μ–΄μ§‘λ‹ˆλ‹€.

좜처 : https://stackoverflow.com/questions/44460062/http-2-headers-and-data-frames

 

 

그리고, μ΄λ ‡κ²Œ λ‚˜λ‰œ frame 듀은 TCPλ‚΄μ—μ„œ header frame, data frame 순으둜 μ „μ†‘λ˜μ•Ό ν•˜κΈ° λ•Œλ¬Έμ— 각 frame 듀을 κ΅¬λΆ„ν•˜κ³ μž Stream Sequence λž€ 번호λ₯Ό frame 에 λΆ™μž…λ‹ˆλ‹€.

μ΄λ ‡κ²Œ 같은 번호인 frame 듀을 Stream μ΄λž€ κ°œλ…μœΌλ‘œ κ΅¬λΆ„μ§“κ²Œ λ©λ‹ˆλ‹€.

ex) 1번 header frame + 1번 data frame + 1번 data frame 을 1번 Stream 으둜 λΆ€λ¦…λ‹ˆλ‹€.

사진3. 좜처 : ByteByteGo (https://www.youtube.com/watch?v=a-sBfyiXysI)

 

β–Ά HTTP/2.0 의 κΈ°λŠ₯ : multiplexing (λ©€ν‹°ν”Œλ ‰μ‹±)

 

μ΄λ ‡κ²Œ, 1개의 λ©”μ‹œμ§€λ₯Ό μ—¬λŸ¬ 개의 frame 으둜 λ‚˜λˆ„μ–΄μ„œ μ „μ†‘ν•˜κ²Œ λ˜λ‹ˆ μœ„ μ‚¬μ§„μ²˜λŸΌ μš”μ²­3의 header frame 이 μš”μ²­2의 header frame 보닀 λ¨Όμ € 올 수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.(응닡이 μš”μ²­ μˆœμ„œμ— 따라 μ²˜λ¦¬λ˜μ§€ μ•Šμ•„λ„ 됨)

HTTP/1.1 의 λ¬Έμ œμ˜€λ˜ 응닡이 μˆœμ„œλŒ€λ‘œ μ™€μ•Όν•΄μ„œ 후속 μš”μ²­λ“€μ΄ 영ν–₯을 λ°›λŠ” 문제인 HOL Blocking을 Application Layer μ—μ„œ ν•΄κ²°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

HTTP/2.0 은 μŠ€νŠΈλ¦Όμ΄λΌλŠ” κ°œλ…μ„ λ„μž…ν•΄μ„œ νŒŒμ΄ν”„λΌμ΄λ‹μ˜ 단점을 λ©€ν‹°ν”Œλ ‰μ‹±(multiplexing) 으둜 κ·Ήλ³΅ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

 

β–Ά multiplexing (λ©€ν‹°ν”Œλ ‰μ‹±) 의 단점

 

ν•˜μ§€λ§Œ, μ—¬μ „νžˆ TCP Connection μ—μ„œ frame 듀을 μ£Όκ³  λ°›μ•˜κΈ° λ•Œλ¬Έμ—, TCP μ—μ„œ λ°œμƒν•˜λŠ” HOL Blocking 을 ν•΄κ²°ν•  순 μ—†μ—ˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 사진3 μ—μ„œ stream2 header 의 νŒ¨ν‚·μ΄ 손싀이 λ˜μ—ˆλ‹€λ©΄ ν•΄λ‹Ή stream2 header λŠ” μ†μ‹€λœ νŒ¨ν‚·μ΄ 올 λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬κ²Œ 되고, κ·Έ λ’€μ—μžˆλŠ” stream 1 data, 3 data, 2data λŠ” μ—¬μ „νžˆ κΈ°λ‹€λ¦¬κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

즉, multiplexing 은 Application Layer μ—μ„œμ˜ HOL Blocking 은 ν•΄κ²°ν–ˆμ§€λ§Œ Transport Layer μ—μ„œμ˜ HOL Blocking 은 μ—¬μ „νžˆ λ¬Έμ œκ°€ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 후에 HTTP/3.0 인 QUIC 이 λ‚˜μ˜€λ©΄μ„œ ν•΄κ²°λ˜μ—ˆκ³ , QUIC 을 μ„€λͺ…ν•  λ•Œ λ‹€μ‹œ μ–ΈκΈ‰ν•˜κ² μŠ΅λ‹ˆλ‹€.

 

β–Ά HTTP/2.0 의 κΈ°λŠ₯ : Server push

 

HTTP/2.0 의 κΈ°λŠ₯으둜 Server Push κ°€ μžˆμŠ΅λ‹ˆλ‹€.

Server Push λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μš”μ²­ν•˜κΈ° 전에 μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ— λ¦¬μ†ŒμŠ€λ₯Ό λ³΄λ‚΄λŠ” κ²ƒμœΌλ‘œ 미리 λ¦¬μ†ŒμŠ€λ₯Ό λ³΄λ‚Έλ‹€λŠ” μ μ—μ„œ λ„€νŠΈμ›Œν¬ μš”μ²­μ„ μ€„μΈλ‹€λŠ” 이점이 μžˆμ„ 것이라 μƒκ°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

 

ν•˜μ§€λ§Œ, ν΄λΌμ΄μ–ΈνŠΈκ°€ μ„œλ²„κ°€ 보낸 λ¦¬μ†ŒμŠ€λ₯Ό μ•Œμ§€ λͺ»ν•˜κ³ , λ¦¬μ†ŒμŠ€λ₯Ό λ‹€μ‹œ μš”μ²­ν•œλ‹€λŠ” μ μ—μ„œ 22λ…„ 10μ›” Google 은 Chrome μ—μ„œ Server push κΈ°λŠ₯을 μ œκ±°ν•˜μ˜€μŠ΅λ‹ˆλ‹€.(좜처 : wikipeidia - HTTP/2.0)

 

HTTP/3.0

β–Ά TCP λ ˆλ²¨μ—μ„œμ˜ HOL Blocking ν•΄κ²°

 

HTTP/2.0 의 TCP HOL Blocking 은 TCP ν”„λ‘œν† μ½œ νŠΉμ„±μƒ λ°œμƒν–ˆκΈ° λ•Œλ¬Έμ—, 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ HTTP/3.0 은 TCP 에 μ˜μ‘΄ν•˜μ§€ μ•Šκ³ , UDP 에 κΈ°λ°˜ν•œ QUIC ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜κ²Œ λ©λ‹ˆλ‹€.

사진4. TCP 기반 ν”„λ‘œν† μ½œ, UDP 기반의 ν”„λ‘œν† μ½œ 차이

 

이 덕에, TCP 에 κΈ°λ°˜ν•œ Stream 듀이 UDP 에 κΈ°λ°˜ν•œ QUIC ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜κ²Œ λ˜λ©΄μ„œ 각 μŠ€νŠΈλ¦Όλ“€μ€ λ…λ¦½μ μ΄κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 사진5μ—μ„œ 1번 νŒ¨ν‚·μ΄ μ†μ‹€λ˜μ—ˆλ‹€λ©΄, TCP κΈ°λ°˜μ—μ„œλŠ” 2~8λ²ˆκΉŒμ§€μ˜ νŒ¨ν‚·μ΄ λͺ¨λ‘ Blocking λ˜μ§€λ§Œ UDP 기반의 QUIC ν”„λ‘œν† μ½œμ—μ„œλŠ” 2,3 번의 νŒ¨ν‚·λ§Œ Blocking 되게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

사진5. HTTP/2.0 κ³Ό QUIC 이 νŒ¨ν‚·μ„ λ³΄λ‚΄λŠ” 방식 차이

 

β–Ά HTTP/3.0 의 κΈ°λŠ₯ : zero RTT Connection 달성

 

λ˜ν•œ, HTTP/3.0 은 μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈκ°„μ˜ Connection 을 λ§ΊλŠ”λ° 0 RTT(Round-Trip Time, λ‹¨μœ„ : ms)λ₯Ό λ‹¬μ„±ν•©λ‹ˆλ‹€.

TCP 연결은 1 RTT(100ms) , TCP + TLS 연결은 2~3 RTT(200~300ms) 이 κ±Έλ¦¬λŠ” λ°˜λ©΄μ— HTTP/3.0 의 QUIC 은 0 RTT λ₯Ό λ‹¬μ„±ν•˜μ—¬ μ—°κ²°ν•˜λ©΄μ„œ 데이터λ₯Ό 전솑할 수 있게 λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

사진6. TCP / TCP + TLS / QUIC 의 Connection λ§ΊλŠ” μ‹œκ°„ 차이

 

 

좜처