[기술 딥다이브] TCP 핸드셰이크는 왜 3단계인가


한 줄 요약: TCP 3-way handshake는 SYN→SYN-ACK→ACK 세 단계로 양방향 시퀀스 번호를 합의하는 절차이며, 클라이언트와 서버 양쪽의 시퀀스가 모두 확인돼야 하므로 2단계로는 부족하다.

TCP 연결을 맺을 때 SYN, SYN-ACK, ACK 세 단계를 거칩니다. 이것을 3-way handshake라고 부릅니다. ’왜 2단계가 아니라 3단계인가?’라는 질문을 풀어 설명하겠습니다.

SYN: 클라이언트가 ’연결을 원한다’고 전달하다

첫 번째 단계입니다. 클라이언트가 서버에 SYN(同期) 패킷을 전송합니다. ’연결하고 싶다’는 의미입니다. 이때 클라이언트는 자신의 시퀀스 번호(예: x)를 함께 보냅니다. 이 번호는 ’내 데이터가 여기부터 시작한다’는 기준점입니다.

SYN-ACK: 서버가 ’승인하며, 나도 준비되었다’고 응답하다

서버가 SYN을 수신하면, SYN-ACK 패킷으로 응답합니다. ’연결을 수락하며, 나도 준비되었다’는 의미입니다. 서버도 자신의 시퀀스 번호(예: y)를 함께 보냅니다. 그리고 클라이언트의 SYN(x)을 수신했다는 확인(ACK = x+1)도 포함합니다.

ACK: 클라이언트가 ’확인했다’고 마무리하다

클라이언트가 SYN-ACK를 수신하면, ACK 패킷을 전송합니다. 서버의 시퀀스 번호(y)를 수신했다는 확인(ACK = y+1)입니다. 이 ACK가 도착하면 양쪽 모두 연결이 성립됩니다. 이제 데이터를 주고받을 수 있습니다.

왜 2단계가 아니라 3단계인가

핵심 질문입니다. 2단계(SYN, SYN-ACK)만으로도 서로 ’연결을 원한다’는 의사를 교환하지 않느냐고 생각할 수 있습니다. 그러나 그렇지 않습니다. 2단계는 클라이언트에서 서버 방향만 동기화됩니다. 서버의 시퀀스 번호(y)가 클라이언트에게 무사히 도달했는지 확인되지 않습니다.

세 번째 ACK가 필요한 이유는 서버에서 클라이언트 방향의 동기화를 확인하기 위해서입니다. 세 단계를 거쳐야 양방향 모두 시퀀스 번호가 합의되고, 양쪽 모두 데이터를 수신할 준비가 완료되었음을 확신할 수 있습니다.

시퀀스 번호: 각 단계가 수행하는 실질적인 역할

3-way handshake의 실질적인 목적은 ’인사’가 아니라 시퀀스 번호 교환입니다. TCP는 신뢰성(재전송, 순서 보장)을 시퀀스 번호로 구현합니다. 각 패킷에 번호를 부여하여, 손실되면 재전송하고 순서가 바뀌면 정렬합니다. 이 번호의 시작점을 양쪽이 합의하는 것이 handshake의 본질입니다.

어떻게 연결되는가

한 줄로 요약하면: SYN, SYN-ACK, ACK(클라이언트 시퀀스 전송, 서버 시퀀스 전송 및 확인, 클라이언트 확인)으로로 양방향 시퀀스 번호를 합의하고, 양쪽 모두 데이터를 수신할 준비가 완료되었음을 확정하는 과정입니다. 3단계가 필요한 이유는 양방향 동기화이기 때문입니다. 2단계로는 서버의 준비가 확인되지 않습니다.

출처: 위키백과: Transmission Control Protocol · RFC 9293: TCP

이미지: Fleshgrinder, Wikimedia Commons (Public Domain) — 원본