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 통신을 시작하기 전에 서로 연결할 준비가 되어 있는지 확인하는 과정이라고 생각하면 된다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

글쓴이

rjsan46@koreabites.com

관련 게시물

웹 브라우저에 주소를 입력하면 일어나는 일

웹 브라우저 주소창에 웹사이트 주소를 입력하고 엔터를 누르면 바로 화면이 나타나는 것처럼 보인다. 하지만 실제로는 그 짧은 순간에 꽤 많은 일이 일어난다....

모두 읽어보기

소켓이란 무엇일까? 프로그램과 네트워크를 연결하는 통로

네트워크를 공부하다 보면 IP 주소와 포트 번호라는 말을 계속 만나게 된다. IP 주소는 어떤 컴퓨터와 통신할 것인지 구분하고, 포트 번호는 그 컴퓨터에서...

모두 읽어보기

쿠키와 세션은 어떻게 다를까?

웹사이트를 이용하다 보면 한 번 로그인한 뒤 다른 페이지로 이동해도 로그인 상태가 계속 유지되는 것을 볼 수 있다. 예를 들어 쇼핑몰에 로그인한...

모두 읽어보기

SSL과 TLS는 어떤 역할을 할까?

앞에서 HTTPS가 HTTP보다 안전한 이유를 살펴봤다. HTTPS는 단순히 HTTP 자체가 더 안전하게 만들어진 프로토콜이 아니라, HTTP 통신에 TLS라는 보안 계층을 적용한 것이라고...

모두 읽어보기

포트 번호로 네트워크 서비스를 구분하는 방법

컴퓨터가 네트워크를 통해 다른 컴퓨터와 통신할 때 가장 먼저 떠오르는 것이 IP 주소다. 예를 들어 어떤 서버의 IP 주소가 192.168.0.10이라고 해보자. 그런데...

모두 읽어보기

HTTPS는 HTTP보다 무엇이 안전할까?

인터넷에서 웹사이트에 접속하다 보면 주소창에 http://가 붙어 있는 경우도 있고 https://가 붙어 있는 경우도 있다. 요즘은 대부분의 웹사이트가 HTTPS를 사용하기 때문에 사실상...

모두 읽어보기