HTTP/2 멀티플렉싱

HTTP/2 multiplexing

한 연결에서 여러 요청의 프레임을 번갈아 보내 대기 줄을 줄입니다.

···
html
<div class="n-demo"><div class="n-head"><strong>ONE CONNECTION · THREE STREAMS</strong><span>LIVE TRACE</span></div><div class="n-stage"><div class="mux"><div class="mux-row"><span>A</span><i id="m0"></i></div><div class="mux-row"><span>B</span><i id="m1"></i></div><div class="mux-row"><span>C</span><i id="m2"></i></div><div class="mux-wire">shared TCP connection</div></div></div><div class="n-foot">tap to step · auto replay</div></div>
css
.n-demo{width:min(94vw,760px);height:min(88vh,324px);padding:clamp(9px,2.2vmin,18px);border:1px solid var(--line);border-radius:13px;background:var(--surface);display:flex;flex-direction:column;gap:clamp(5px,1.3vmin,10px);font:600 clamp(12px,2.4vmin,16px)/1.3 "Pretendard Variable",Pretendard,-apple-system,BlinkMacSystemFont,"Apple SD Gothic Neo",sans-serif;overflow:hidden}.n-head,.n-foot{display:flex;justify-content:space-between;align-items:center;color:var(--muted)}.n-head strong{color:var(--accent)}.n-head span,.n-foot{font-size:12px}.n-stage{flex:1;min-height:0;position:relative;display:flex;align-items:center;justify-content:center;gap:clamp(4px,1vmin,10px)}.mono{font-family:ui-monospace,SFMono-Regular,Consolas,monospace}.n-box{padding:clamp(5px,1.5vmin,11px);border:1px solid var(--line);border-radius:8px;background:var(--bg);text-align:center}.n-on{border-color:var(--accent)!important;color:var(--accent)!important;background:color-mix(in srgb,var(--accent) 12%,var(--surface))!important}.n-muted{color:var(--muted)}@media(max-width:400px){.n-head span{display:none}}.mux{width:92%;display:grid;gap:8px}.mux-row{display:flex;align-items:center;gap:8px}.mux-row span{width:17px}.mux-row i{display:block;height:17px;border-radius:4px;background:var(--accent);width:7%;transition:width .45s}.mux-row:nth-child(2) i{background:var(--accent-2)}.mux-row:nth-child(3) i{background:var(--accent-3)}.mux-wire{border-top:2px solid var(--line);text-align:center;padding-top:5px;color:var(--muted)}
js
let step=0;function advance(){const values=[[20,7,7],[20,34,7],[42,34,28],[65,56,50],[88,75,76]];values[step].forEach((v,i)=>document.getElementById('m'+i).style.width=v+'%');step=(step+1)%values.length}
const clickTarget=document.querySelector('.n-demo');if(clickTarget&&typeof advance==='function'){advance();const timer=setInterval(advance,1050);clickTarget.addEventListener('pointerdown',()=>{clearInterval(timer);advance()})}

HTTP/2는 하나의 연결 안에 여러 스트림을 열고 각 스트림의 프레임을 섞어 전송할 수 있습니다. 한 리소스의 응답이 끝나기 전에 다른 리소스의 프레임을 보낼 수 있습니다.

데모의 세 색상 행은 같은 연결 위에서 차례를 나눠 받습니다. TCP 패킷이 손실되면 연결 전체의 전달이 잠시 막힐 수 있다는 점은 HTTP/3와 다릅니다.

언제 쓰나

다수의 웹 자산이 동시에 내려올 때 연결 사용량과 프레임 흐름을 이해하는 데 씁니다.

페이지로 열기 ↗