3-way 핸드셰이크
IT위키
더 많은 작업
3-way 핸드셰이크(Three-way handshake, 3WHS)는 TCP 에서 두 호스트가 SYN, SYN+ACK, ACK 세 개의 세그먼트를 주고받아 서로의 초기 순서 번호를 확인하고 연결을 수립하는 절차이다.
TCP 는 바이트마다 순서 번호(Sequence Number)를 붙여 순서와 손실을 관리한다. 그러려면 데이터를 보내기 전에 양쪽이 어느 번호부터 세기 시작하는지(초기 순서 번호, ISN)를 알려 주고 상대가 그것을 받았다고 확인해야 한다. 한쪽 방향마다 "내 번호는 이것" 과 "네 번호를 받았다" 가 필요하므로 네 번의 통보가 필요하지만, 가운데 두 통보를 한 세그먼트(SYN+ACK)에 합쳐 세 번으로 끝낸다. 옛 연결의 지연된 SYN 이 새 연결로 오인되는 것도 이 확인 과정으로 걸러 낸다.[1]
RFC 9293 의 기본 예(그림 6)를 따르면 다음과 같다.[1]
| 순서 | 방향 | 플래그 | Seq | Ack | 상태 변화 |
|---|---|---|---|---|---|
| 1 | 클라이언트 → 서버 | SYN | 100 | - | 클라이언트 SYN-SENT, 서버 LISTEN → SYN-RECEIVED |
| 2 | 서버 → 클라이언트 | SYN, ACK | 300 | 101 | 클라이언트 ESTABLISHED |
| 3 | 클라이언트 → 서버 | ACK | 101 | 301 | 서버 ESTABLISHED |
- SYN 과 FIN 은 순서 번호를 하나 차지한다. 데이터가 없어도 SYN 은 번호 1개를 쓴 것으로 치므로, SYN(Seq=100)에 대한 확인 응답 번호는 101 이다.
- 확인 응답 번호(Ack)는 "다음에 받기를 기대하는 바이트 번호" 이다. 그래서 서버는 클라이언트의 ISN + 1 을, 클라이언트는 서버의 ISN + 1 을 Ack 에 넣는다.
- 세 번째 ACK 의 Seq 는 클라이언트 ISN + 1 이다. 이 ACK 은 데이터가 없으면 번호를 차지하지 않으므로, 이어서 보내는 첫 데이터 세그먼트도 같은 Seq(101)로 시작한다.
클라이언트가 Seq=7 로 SYN 을 보내고 서버가 Seq=38 로 SYN+ACK 을 보냈다면,
- 서버 SYN+ACK 의 Ack = 7 + 1 = 8
- 클라이언트 마지막 ACK 의 Seq = 7 + 1 = 8, Ack = 38 + 1 = 39
- ↑ 1.0 1.1 「Transmission Control Protocol (TCP)」(RFC 9293), 3.5절 「Establishing a Connection」, IETF, https://www.rfc-editor.org/rfc/rfc9293, 확인일: 2026-11-04.
- ↑ James F. Kurose·Keith W. Ross, 『Computer Networking: A Top-Down Approach』 8판, Pearson, 2021, 3.5.6절 「TCP Connection Management」.