TCP 3-way handshake는 데이터를 주고받기 전에 연결을 수립하는 절차입니다. 양쪽의 초기 시퀀스 번호를 교환하고, 상대의 번호를 받았다는 사실을 확인합니다.
SYN과 ACK
SYN: 시퀀스 번호를 동기화하기 위한 플래그입니다.ACK: 확인 응답 번호가 유효함을 나타내는 플래그입니다.seq: 해당 세그먼트의 시퀀스 번호입니다.ack: 다음에 받기를 기대하는 시퀀스 번호입니다.
아래에서는 클라이언트의 초기 번호를 100, 서버의 초기 번호를 500으로 가정합니다. 실제 초기 번호는 이렇게 고정해서 사용하지 않습니다.
세 단계
| 단계 | 방향 | 플래그 | seq | ack |
|---|---|---|---|---|
| 1 | 클라이언트 → 서버 | SYN | 100 | 의미 없음 |
| 2 | 서버 → 클라이언트 | SYN, ACK | 500 | 101 |
| 3 | 클라이언트 → 서버 | ACK | 101 | 501 |
1. 연결 요청
클라이언트는 SYN과 자신의 초기 시퀀스 번호를 보내고 SYN-SENT 상태로 기다립니다.
2. 서버의 응답
연결을 수락하는 서버는 자신의 SYN과 클라이언트에 대한 ACK를 함께 보내고 SYN-RECEIVED 상태가 됩니다. SYN은 시퀀스 번호 하나를 소비하므로 확인 응답은 100 + 1입니다.
3. 클라이언트의 확인
클라이언트는 서버의 초기 번호를 확인하는 ACK를 보냅니다. 서버가 이 응답을 받으면 서버 측 연결도 ESTABLISHED 상태가 됩니다. 데이터 없는 순수 ACK는 시퀀스 번호를 소비하지 않습니다.
왜 세 번 필요한가?
두 번째 메시지까지는 서버가 자신의 초기 번호를 클라이언트가 받았는지 확인하지 못했습니다. 세 번째 메시지가 서버의 시퀀스 번호 수신을 확인하면서 양쪽의 번호 교환이 완료됩니다. 오래 지연된 연결 요청을 새 연결로 잘못 처리하는 문제를 줄이는 데에도 중요합니다.
TCP 연결과 보안 연결은 다르다
이 절차는 전송 연결을 설정하는 과정이며 암호화나 서버 신원 인증을 제공하지 않습니다. HTTPS를 TCP 위에서 사용한다면 별도의 TLS 핸드셰이크가 필요합니다.
참고