TCP 3방향 핸드셰이크

TCP three-way handshake

클라이언트와 서버가 SYN, SYN-ACK, ACK를 주고받아 연결을 성립합니다.

···
html
<div class="demo"><div class="head"><b>TCP CONNECT</b><span id="state">SYN</span></div><div class="scene"><div class="endpoint">CLIENT</div><div class="packets"><div class="packet" id="syn">SYN <span>→</span></div><div class="packet" id="synack"><span>←</span> SYN-ACK</div><div class="packet" id="ack">ACK <span>→</span></div></div><div class="endpoint">SERVER</div></div><div class="foot"><span id="caption">1 / 3 · request connection</span><span>tap to step</span></div></div>
css
.demo{width:min(94vw,690px);height:min(86vh,310px);padding:clamp(10px,2.4vmin,20px);border:1px solid var(--line);border-radius:14px;background:var(--surface);display:flex;flex-direction:column;gap:clamp(7px,2vmin,14px);font:600 clamp(9px,2.5vmin,15px)/1.3 ui-monospace,monospace}.head,.foot{display:flex;justify-content:space-between;gap:8px}.head b,#state{color:var(--accent)}.foot{color:var(--muted);font-size:.82em}.scene{flex:1;min-height:0;display:flex;align-items:center;gap:clamp(5px,1.7vmin,15px)}.endpoint{border:1px solid var(--line);border-radius:8px;padding:.6em .5em;background:var(--bg);min-width:17%;text-align:center}.packets{flex:1;display:grid;gap:clamp(4px,1.2vmin,9px)}.packet{border:1px solid var(--line);border-radius:6px;color:var(--muted);padding:.28em .6em;opacity:.38;transition:opacity .3s,background .3s,transform .3s}.packet span{color:var(--accent)}.packet:nth-child(2){text-align:right}.packet.on{opacity:1;background:color-mix(in srgb,var(--accent) 14%,var(--surface));border-color:var(--accent);color:var(--fg);transform:scale(1.02)}
js
const ids=['syn','synack','ack'],captions=['request connection','accept and acknowledge','acknowledge server'];let step=0;function draw(){ids.forEach((id,i)=>document.getElementById(id).classList.toggle('on',i===step));document.getElementById('state').textContent=ids[step].toUpperCase().replace('SYNACK','SYN-ACK');document.getElementById('caption').textContent=(step+1)+' / 3 · '+captions[step];step=(step+1)%3}draw();const timer=setInterval(draw,700);document.querySelector('.demo').addEventListener('pointerdown',()=>{clearInterval(timer);draw()})

TCP 연결을 시작할 때 클라이언트는 SYN을 보내고, 서버는 SYN-ACK로 응답합니다. 클라이언트가 ACK를 보내면 양쪽은 상대가 보낸 초기 순서 번호를 확인한 상태가 됩니다.

데모의 세 화살표는 실제 전송 순서를 보여줍니다. 연결 수립은 데이터를 안정적으로 주고받기 위한 출발점이며, 이후 전송의 재전송·순서 보장까지 세 패킷만으로 끝나는 것은 아닙니다.

언제 쓰나

연결 지연을 분석하거나 패킷 캡처에서 TCP 연결 시작 구간을 읽을 때 유용합니다.

페이지로 열기 ↗