- 0
- 70 words
TCP를 공부하다 보면 3-Way Handshake라는 말이 나온다.
처음에는 이름부터 조금 거창해 보였는데, 막상 과정을 보면 생각보다 단순하다. TCP는 데이터를 바로 보내는 것이 아니라, 먼저 상대방과 통신할 준비가 되어 있는지 확인한 다음 데이터를 주고받는다.
이때 사용하는 과정이 바로 3-Way Handshake다.
왜 연결을 먼저 만들까?
TCP는 데이터를 정확한 순서로 전달하고, 문제가 생기면 다시 보내는 방식으로 동작한다.
그러려면 데이터를 보내기 전에 서로 통신할 준비가 되어 있어야 한다.
예를 들어 내가 어떤 서버에 접속한다고 해보자.
내 컴퓨터 서버
연결할게요 ─────────→
준비됐어요 ←─────────
확인했습니다 ─────────→
이렇게 세 번의 통신이 이루어진다.
그래서 이름도 3-Way Handshake다.
첫 번째는 SYN
처음에는 클라이언트가 서버에게 연결을 요청한다.
이때 사용하는 것이 SYN이라는 플래그다.
Client ───── SYN ─────→ Server
쉽게 생각하면 “TCP 연결을 시작하고 싶습니다”라고 먼저 말을 거는 과정이다.
이때는 단순히 연결 요청만 보내는 것이 아니라, TCP 통신에 사용할 초기 시퀀스 번호도 함께 전달한다.
시퀀스 번호는 이후에 데이터를 어떤 순서로 관리할지와 관련이 있다.
두 번째는 SYN + ACK
서버가 SYN을 받으면 서버도 응답을 보낸다.
Client ←── SYN + ACK ── Server
여기에는 두 가지 의미가 들어 있다.
SYN은 서버 역시 TCP 연결을 시작할 준비가 되었다는 의미이고, ACK는 클라이언트가 보낸 SYN을 정상적으로 받았다는 의미다.
즉 서버가
“연결 요청 받았습니다. 저도 준비됐습니다.”
라고 답하는 셈이다.
마지막은 ACK
마지막으로 클라이언트가 ACK를 다시 보낸다.
Client ───── ACK ─────→ Server
이제 양쪽에서 연결이 준비됐다는 것을 확인했다.
그 이후부터 실제 데이터를 주고받을 수 있다.
전체 과정을 보면 이렇게 된다.
Client Server
SYN ─────────────────────→
←──────────────── SYN + ACK
ACK ─────────────────────→
TCP 연결 완료
생각보다 간단하지 않나 싶다.
왜 두 번이 아니라 세 번일까?
여기서 처음 공부할 때 많이 궁금했던 부분이 이거다.
“연결할게” 하고 “알겠어”라고 답하면 끝나는 것 아닌가?
TCP 입장에서는 양쪽이 서로 데이터를 주고받을 준비가 됐다는 것을 확인하는 과정이 필요하다.
첫 번째 SYN으로 클라이언트가 연결 의사를 전달하고, 두 번째 SYN+ACK로 서버가 그 요청을 받았다는 것과 자신의 연결 정보를 전달한다. 마지막 ACK에서 클라이언트가 서버의 응답까지 확인하면서 양쪽의 상태가 맞춰진다.
그래서 세 단계가 필요한 것이다.
웹사이트에 접속할 때도 일어난다
브라우저에서 웹사이트 주소를 입력하면 여러 네트워크 과정이 순서대로 진행된다.
TCP를 사용하는 경우에는 서버와 연결을 만들기 위해 3-Way Handshake가 먼저 이루어진다.
주소 입력
↓
DNS 조회
↓
TCP 3-Way Handshake
↓
데이터 통신
↓
웹페이지 응답
HTTPS라면 TCP 연결 이후 TLS 과정도 이어진다.
그래서 웹페이지 하나를 여는 것도 생각보다 여러 단계가 들어간다.
패킷을 직접 보면 더 이해하기 쉽다
Wireshark 같은 패킷 분석 프로그램으로 TCP 통신을 캡처해보면 SYN, SYN/ACK, ACK가 실제 패킷으로 표시된다.
처음에는 패킷 정보가 너무 많아서 복잡해 보이는데, TCP 패킷에서 SYN이나 ACK를 찾아보면 위에서 본 과정이 실제 네트워크에서도 그대로 이루어지는 것을 확인할 수 있다.
TCP를 공부하면서 3-Way Handshake를 이해해두면 이후에 TCP 연결 종료 과정이나 재전송, 시퀀스 번호 같은 내용을 볼 때도 훨씬 이해하기 편하다.
결국 3-Way Handshake는 어려운 기술이라기보다는 TCP 통신을 시작하기 전에 서로 연결할 준비가 되어 있는지 확인하는 과정이라고 생각하면 된다.