<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Http2 on IT Comparison</title><link>https://comparison.metacog.co.kr/tags/http2/</link><description>Recent content in Http2 on IT Comparison</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 01 Aug 2026 20:02:00 +0900</lastBuildDate><atom:link href="https://comparison.metacog.co.kr/tags/http2/index.xml" rel="self" type="application/rss+xml"/><item><title>HTTP/2 vs HTTP/3: Multiplexing Over TCP vs QUIC</title><link>https://comparison.metacog.co.kr/posts/2026-08-03-http-2-vs-http-3-multiplexing-over-tcp-vs-quic/</link><pubDate>Sat, 01 Aug 2026 20:02:00 +0900</pubDate><guid>https://comparison.metacog.co.kr/posts/2026-08-03-http-2-vs-http-3-multiplexing-over-tcp-vs-quic/</guid><description>&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;HTTP/2 and HTTP/3 both let a browser send many requests over one logical connection, but they diverge at the transport layer. HTTP/2 rides on &lt;strong class="kw"&gt;TCP&lt;/strong&gt;, inheriting its single ordered byte stream and its packet-loss stalls; HTTP/3 replaces that with &lt;strong class="kw"&gt;QUIC over UDP&lt;/strong&gt;, giving each stream independent loss recovery and letting connections survive network changes.&lt;/p&gt;
&lt;h2 id="comparison-diagram"&gt;Comparison Diagram&lt;/h2&gt;
&lt;div class="compare-diagram"&gt;
&lt;svg viewBox="0 0 640 360" xmlns="http://www.w3.org/2000/svg"&gt;&lt;text x="160" y="28" text-anchor="middle" font-size="18" font-weight="700" style="fill:var(--primary)"&gt;HTTP/2 (TCP)&lt;/text&gt;&lt;text x="480" y="28" text-anchor="middle" font-size="18" font-weight="700" style="fill:var(--primary)"&gt;HTTP/3 (QUIC/UDP)&lt;/text&gt;&lt;line x1="320" y1="15" x2="320" y2="345" stroke-dasharray="4 4" style="stroke:var(--border)" stroke-width="1"/&gt;&lt;rect x="30" y="55" width="242" height="220" rx="12" fill="none" stroke-dasharray="5 4" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="150" y="82" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Stream A&lt;/text&gt;&lt;text x="150" y="152" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Stream B&lt;/text&gt;&lt;text x="150" y="222" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Stream C&lt;/text&gt;&lt;rect x="45" y="90" width="30" height="26" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;rect x="81" y="90" width="30" height="26" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;rect x="117" y="90" width="30" height="26" rx="4" fill="none" style="stroke:var(--primary)" stroke-width="2"/&gt;&lt;line x1="120" y1="93" x2="144" y2="113" style="stroke:var(--primary)" stroke-width="2"/&gt;&lt;line x1="144" y1="93" x2="120" y2="113" style="stroke:var(--primary)" stroke-width="2"/&gt;&lt;rect x="153" y="90" width="30" height="26" rx="4" fill="none" stroke-dasharray="3 3" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="189" y="90" width="30" height="26" rx="4" fill="none" stroke-dasharray="3 3" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="225" y="90" width="30" height="26" rx="4" fill="none" stroke-dasharray="3 3" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="45" y="160" width="30" height="26" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;rect x="81" y="160" width="30" height="26" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;rect x="117" y="160" width="30" height="26" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;rect x="153" y="160" width="30" height="26" rx="4" fill="none" stroke-dasharray="3 3" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="189" y="160" width="30" height="26" rx="4" fill="none" stroke-dasharray="3 3" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="225" y="160" width="30" height="26" rx="4" fill="none" stroke-dasharray="3 3" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="45" y="230" width="30" height="26" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;rect x="81" y="230" width="30" height="26" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;rect x="117" y="230" width="30" height="26" rx="4" style="fill:var(--compare-a-soft);stroke:var(--compare-a)" stroke-width="1.5"/&gt;&lt;rect x="153" y="230" width="30" height="26" rx="4" fill="none" stroke-dasharray="3 3" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="189" y="230" width="30" height="26" rx="4" fill="none" stroke-dasharray="3 3" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="225" y="230" width="30" height="26" rx="4" fill="none" stroke-dasharray="3 3" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="365" y="84" width="232" height="38" rx="8" fill="none" stroke-dasharray="5 4" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="365" y="154" width="232" height="38" rx="8" fill="none" stroke-dasharray="5 4" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="365" y="224" width="232" height="38" rx="8" fill="none" stroke-dasharray="5 4" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;text x="480" y="82" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Stream A&lt;/text&gt;&lt;text x="480" y="152" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Stream B&lt;/text&gt;&lt;text x="480" y="222" text-anchor="middle" font-size="12" style="fill:var(--content)"&gt;Stream C&lt;/text&gt;&lt;rect x="375" y="90" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="411" y="90" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="447" y="90" width="30" height="26" rx="4" fill="none" style="stroke:var(--primary)" stroke-width="2"/&gt;&lt;line x1="450" y1="93" x2="474" y2="113" style="stroke:var(--primary)" stroke-width="2"/&gt;&lt;line x1="474" y1="93" x2="450" y2="113" style="stroke:var(--primary)" stroke-width="2"/&gt;&lt;rect x="483" y="90" width="30" height="26" rx="4" fill="none" stroke-dasharray="3 3" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="519" y="90" width="30" height="26" rx="4" fill="none" stroke-dasharray="3 3" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="555" y="90" width="30" height="26" rx="4" fill="none" stroke-dasharray="3 3" style="stroke:var(--border)" stroke-width="1.5"/&gt;&lt;rect x="375" y="160" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="411" y="160" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="447" y="160" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="483" y="160" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="519" y="160" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="555" y="160" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="375" y="230" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="411" y="230" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="447" y="230" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="483" y="230" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="519" y="230" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;rect x="555" y="230" width="30" height="26" rx="4" style="fill:var(--compare-b-soft);stroke:var(--compare-b)" stroke-width="1.5"/&gt;&lt;text x="150" y="296" text-anchor="middle" font-size="12" style="fill:var(--secondary)"&gt;Single TCP connection&lt;/text&gt;&lt;text x="150" y="313" text-anchor="middle" font-size="12" style="fill:var(--secondary)"&gt;One lost packet stalls every stream&lt;/text&gt;&lt;text x="480" y="296" text-anchor="middle" font-size="12" style="fill:var(--secondary)"&gt;Independent QUIC streams&lt;/text&gt;&lt;text x="480" y="313" text-anchor="middle" font-size="12" style="fill:var(--secondary)"&gt;Loss stalls only its own stream&lt;/text&gt;&lt;text x="320" y="340" text-anchor="middle" font-size="11" style="fill:var(--secondary)"&gt;X = lost packet dashed = blocked/waiting&lt;/text&gt;&lt;/svg&gt;
&lt;/div&gt;
&lt;h2 id="comparison-table"&gt;Comparison Table&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;HTTP/2&lt;/th&gt;
&lt;th&gt;HTTP/3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Transport protocol&lt;/td&gt;
&lt;td&gt;Runs over TCP&lt;/td&gt;
&lt;td&gt;Runs over QUIC (built on UDP)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connection handshake&lt;/td&gt;
&lt;td&gt;Separate TCP handshake, then TLS handshake (1-2 RTT)&lt;/td&gt;
&lt;td&gt;TLS 1.3 is integrated into the QUIC handshake, often 1-RTT or 0-RTT on resumption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stream multiplexing&lt;/td&gt;
&lt;td&gt;Multiple streams share one ordered TCP byte stream&lt;/td&gt;
&lt;td&gt;Each stream is a distinct, independently-sequenced QUIC stream&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Head-of-line blocking&lt;/td&gt;
&lt;td&gt;A single lost TCP segment stalls delivery of every stream until it&amp;rsquo;s retransmitted&lt;/td&gt;
&lt;td&gt;Loss on one stream only stalls that stream; others keep flowing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Header compression&lt;/td&gt;
&lt;td&gt;HPACK&lt;/td&gt;
&lt;td&gt;QPACK&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Connection identity and migration&lt;/td&gt;
&lt;td&gt;Bound to the source/destination IP and port 4-tuple; changing networks breaks it&lt;/td&gt;
&lt;td&gt;Bound to a connection ID; survives IP or network changes, e.g. Wi-Fi to cellular&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Congestion control and loss recovery&lt;/td&gt;
&lt;td&gt;Implemented in the OS kernel&amp;rsquo;s TCP stack&lt;/td&gt;
&lt;td&gt;Implemented in user-space by the QUIC library, easier to iterate on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network and middlebox support&lt;/td&gt;
&lt;td&gt;Ubiquitous; TCP port 443 is rarely blocked&lt;/td&gt;
&lt;td&gt;UDP is sometimes blocked or throttled by firewalls, requiring a TCP fallback&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="key-differences"&gt;Key Differences&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;HTTP/2 multiplexes streams inside a single &lt;strong class="kw"&gt;TCP&lt;/strong&gt; connection, while HTTP/3 gives each stream its own loss-recovery in &lt;strong class="kw"&gt;QUIC&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;TCP&amp;rsquo;s in-order delivery means one dropped packet causes &lt;strong class="kw"&gt;head-of-line blocking&lt;/strong&gt; across all HTTP/2 streams; HTTP/3 avoids this by design&lt;/li&gt;
&lt;li&gt;HTTP/3 folds the transport and TLS handshakes together for faster &lt;strong class="kw"&gt;0-RTT&lt;/strong&gt; setup on reconnection&lt;/li&gt;
&lt;li&gt;QUIC&amp;rsquo;s &lt;strong class="kw"&gt;connection ID&lt;/strong&gt; lets HTTP/3 sessions survive a client&amp;rsquo;s IP or network change without reconnecting&lt;/li&gt;
&lt;li&gt;HTTP/3 depends on UDP reaching the server, so restrictive &lt;strong class="kw"&gt;middleboxes&lt;/strong&gt; can force a fallback to HTTP/2&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="when-to-use-each"&gt;When to Use Each&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;HTTP/2&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>