3-way handshake [ 크래프톤 정글 53일차 ]

jinsung·2025년 7월 4일

크래프톤 정글 9기

목록 보기
48/59

지금 크래프톤 정글에서는 직접 웹서버와 프록시 서버를 만들어보는 과제가 진행중인데요.

네트워크에 대해서 공부하는 과정중에, TCP/IP 와 UDP 에 대해 알게되었고

그 중, TCP/IP 프로토콜에서 사용하는 3-way handshake 에 대해서 포스팅 하려합니다.

CSAPP 책에는 나와있지 않아서 따로 정리해서 이해하려고 합니다.

3방향으로 악수하기? 3가지 방법으로 악수하기? 너 대체 뭔데 임마!

그전에 TCP/IP 와 UDP

모든 네트워크는 동작하면서 결국 데이터를 주고받는데요.

데이터를 주고 받는 방식 2개가

  • TCP/IP
  • UDP

예요.

UDP

UDP는요.

일단 던질게 받아!!!
데이터가 제대로 올바른지? 중간에 손상됐나? 나 지금 올바른 주소에 전송했나?

알빠아님 ㅋㅋㅋ 체크안해 ㅋㅋㅋㅋ "하지만 빨랐죠?" 입니다.

클라이언트에서 서버로 혹은 서버에서 클라이언트로 연결없이 그냥 데이터를 보냅니다

그래서 "비연결형(Connectionless)" 방식이라고 불러요.

TCP/IP방식보다는 훨씬 빠르지만, 전송 성공 여부도 모르고, 순서도 뒤죽박죽일 수 있어요.

  • 실시간 영상통화
  • 스트리밍 서비스
  • 온라인 게임
  • DNS

이런 실시간성이 중요하고 약간의 데이터 손실을 허용할 수 있는 상황에서 많이 쓰입니다.

TCP/IP

TCP/IPUDP와 다르게 "연결지향(Connection-oriented)" 방식이예요.

UDP는 데이터 걍 보내버리잖아요.

TCP/IP데이터를 보내기전에 서버랑 연결을 먼저 맺고 데이터를 보내요.

그래서 정확하게, 순서대로, 빠짐없이 데이터를 전송하죠.

  • 웹사이트 접속
  • 이메일
  • 파일 전송
  • 원격 접속

등에 쓰여요.

이렇게 UDP는 안전하지 않지만 빠르고
TCP/IP는 조금 느리지만 안전하다는걸 알았어요.
그래서 서버랑 데이터 주고 받기전에 먼저 서버랑 연결하는 방법!
그게 3-way handshake입니다.

3-way handshake

TCP/IP는 연결을 맺기 전에 총 3단계를 거쳐요.
그래서 3-way handshake 라고 부르는데요.

  1. 클라이언트 -> 서버 : SYN보내기 ( 연결 요청 )
  2. 서버 -> 클라이언트 : SYN + ACK 보내기 ( 수락 및 응답 )
  3. 클라이언트 -> 서버 : ACK 보내기 ( 확인 )

이렇게 3가지 과정으로 이루어져요.

SYNACK에 어떤 내용이 있는지 좀 더 자세하게 알아볼게요.

1. 클라이언트 → 서버: SYN 메시지

메시지 구성:

  • SYN 플래그: TCP 헤더에서 SYN(Synchronize) 플래그가 1로 설정됨. 이것은 “나 연결을 시작하겠다”는 요청을 의미해요.

  • 초기 시퀀스 번호 (ISN): 클라이언트는 자신이 사용할 임의의 초기 시퀀스 번호 X를 선택하여, 이 값을 TCP 헤더의 시퀀스 번호 필드에 넣어요. 이 시퀀스 번호로 데이터 순서를 보장하고, 손실되었을 경우 재전송을 요청하는 용도로 써요.

  • 윈도우 크기: 클라이언트가 수신할 수 있는 버퍼 크기를 나타내어, 흐름 제어에 사용돼요.

  • 기타 옵션: 필요에 따라 최대 세그먼트 크기(MSS) 같은 TCP 옵션들도 포함될 수 있어요.

의미:
이 메시지로 클라이언트는 “나는 X라는 시퀀스 번호로 연결을 시작하고 싶다”는 의사를 전하고 이때 연결은 아직 설정되지 않은 상태이며, 단순히 연결 생성 히고 싶어요...!!!

2. 서버 → 클라이언트: SYN + ACK 메시지

메시지 구성:

  • SYN 플래그: 서버 역시 자신이 연결을 설정할 준비가 되었음을 나타내기 위해 SYN 플래그를 1로 설정해요.

  • ACK 플래그: 서버는 동시에 클라이언트의 SYN 메시지를 받았음을 확인하기 위해 ACK 플래그도 1로 설정해요.

  • 서버의 초기 시퀀스 번호 (ISN): 서버는 자신이 사용할 임의의 초기 시퀀스 번호 Y를 선택하고, 이를 시퀀스 번호 필드에 기록해요.

  • Acknowledgement Number: 서버는 클라이언트에서 받은 시퀀스 번호 X를 바탕으로 “내가 받은 데이터가 X임을 확인하며, 다음으로 기대하는 번호는 X+1이다”라는 의미로 ACK 번호 필드에 X+1을 설정해요.

윈도우 크기와 기타 옵션: 서버가 수신 가능한 버퍼 크기와 옵션들도 이 단계에서 설정할 수 있다.

의미:
SYN+ACK 메시지는 “너의 연결 요청을 받았고, 나도 연결할 준비가 됐다”는 뜻이예요. 서버는 자신의 시퀀스 번호 Y를 제시하며, 클라이언트가 보낸 첫 번째 패킷의 시퀀스 번호를 확인하고 그 다음 번호로 ACK를 보내 연결 설정을 승인합니다.

3. 클라이언트 → 서버: ACK 메시지

메시지 구성:

  • ACK 플래그: 클라이언트는 자신의 헤더에서 ACK 플래그를 1로 설정하여, 서버의 SYN+ACK 메시지를 받았음을 확인한다.

  • Acknowledgement Number: 클라이언트는 서버의 시퀀스 번호 Y에 대해 “내가 잘 받았으니, 다음으로 기대하는 번호는 Y+1이다”라는 의미로 ACK 번호 필드에 Y+1을 설정해요.

  • 시퀀스 번호: 클라이언트는 이전에 보내고 SYN 메시지에 사용했던 시퀀스 번호 X에 기반한 번호(보통 X+1, 왜냐하면 SYN 메시지가 한 바이트의 시퀀스로 간주되기도 함)를 사용해요.

  • 윈도우 크기 및 옵션: 추가적으로 클라이언트의 수신 여유 공간과 필요한 옵션들이 포함될 수 있다.

의미:
이 최종 ACK 메시지를 통해, 클라이언트는 서버의 응답을 확인하고 연결이 성공적으로 설정되었음을 확정합니다.
이제 양쪽 모두가 상대방의 시퀀스 번호와 흐름을 인지하였으므로, 안정적 데이터 전송을 시작할 수 있습니다.

마무리

이렇게 TCP/IP가 안정적으로 데이터를 주고 받기 위해서 3-way handshake를 사용하고
그게 어떤식으로 메세지를 주고 받는지 알게 되었어요.

UDP에 더해 이런 연결요청이 선행되기 때문에 더 느린거겠죠?

다들 에코서버 제작 화이팅입니다

하나 둘 셋!!!!

짱구야~~

2개의 댓글

comment-user-thumbnail
2025년 7월 4일

으....으ACK

답글 달기
comment-user-thumbnail
2025년 7월 6일

이거 진짜 진대네요.

답글 달기