Network
[Network] 3-way handshake, 4-way handshake 정리
yeit
2024. 1. 29. 09:59
728x90
3-way handshake와 4-way handshake가 무엇인지 알아보기 전에, 먼저 TCP와 UDP의 개념에 대해 알아야 한다.
TCP (Transmission Control Protocol)
- 안정적이고 신뢰성 있는 방식으로 데이터를 전송하기 위한 연결 지향적인 네트워크 프로토콜로, 3-way handshake를 통해 클라이언트와 서버 간 안전한 통신을 구현한다.
- 송수신 측이 서로 데이터를 주고 받는 방식
- 높은 신뢰성과 연결 지향성을 제공
UDP (User Datagram Protocol)
- 인터넷상에서 서로 정보를 주고받을 때 정보를 보낸거나 받는다는 신호 절차를 거치지 않고, 보내는 쪽에서 일방적으로 데이터를 전달하는 통신 프로토콜 (3-way handshake와 같은 과정이 없음)
- 수신 측이 데이터를 읽었는지 말았는지 상관하지 않고 송신 측에서 일방적으로 데이터를 전달한다.
- 비신뢰성, 연결 설정 없이 데이터를 직접 주고받기 때문에 TCP의 3-way handshake와 달리 더 빠르게 데이터를 전송
+ ICMP (Internet Control Message Protocol)
- 네트워크 장치에서 네트워크 통신 문제를 진단하는 데 사용하는 네트워크 계층 프로토콜
- Ping 을 실행하면 ICMP 의 에코 패킷을 송신하게 되는데 수신 측 네트워크 장비는 에코 패킷을 받은 후, 에코 응답 패킷을 되돌려주어 회신한다.
즉, TCP는 클라이언트와 서버 간 안전한 통신을 위해 3-way handshake를 필요로 하며, 데이터 주고받을 때 이를 통해 안전한 연결을 설정하고, 이후에는 데이터를 신뢰성 있게 전송한다. 그럼 이제 3-way handshake에 대해 알아보자.
3-way handshake란?
3-way handshake는 TCP 프로토콜에서 사용되는 연결을 수립하는 과정을 말한다.
데이터를 안전하게 전송하고 정확한 전송을 보장하기 위해 클라이언트와 서버 간에 세션을 수립하는 것으로, 총 3단계로 이루어진다.
3-way handshake 동작 순서
- 클라이언트는 서버에게 접속을 요청하는 SYN(Synchronize) 패킷을 전송하고 SYN_SENT 상태가 된다.
- 서버는 클라이언트의 SYN을 받고 SYN_RECEIVED 상태가 되고, 클라이언트에게 요청을 수락한다는 의미로 SYN-ACK(Synchronize-Acknowledgment) 패킷을 전송한다.
- 클라이언트는 서버의 SYN-ACK를 받은 후, 이에 대한 확인으로 ACK(Acknowledgment) 패킷을 전송하고 ESTABLISHED 상태가 된다. 서버 또한 해당 요청을 받으면 ESTABLISHED 상태가 된다.
참고)
- CLOSED : 소켓이 완전히 종료되어 더 이상 데이터를 주고받을 수 없는 상태
- LISTEN : 연결을 기다리고 있는 상태, 포트가 열려있음
- SYN_SENT : 클라이언트가 서버에게 연결을 요청한 상태로, SYN 패킷을 보낸 상태
- SYN_RECEIVED : 서버가 클라이언트의 연결 요청(SYN)을 받은 상태로, SYN-ACK 패킷을 보낸 상태
- ESTABLISHED : 연결 완료, 데이터를 주고받을 수 있는 상태
4-way handshake란?
4-way handshake는 TCP 연결을 해제하는 과정을 말한다.
클라이언트와 서버가 통신을 완료하고 연결을 해제할 때 사용되며, 총 4단계로 이루어진다.
4-way handshake 동작 순서
- 클라이언트는 서버에게 연결을 종료하겠다는 의미로 FIN 패킷을 전송하고 FIN_WAIT_1 상태가 된다.
- 서버는 클라이언트의 FIN을 받고, 이에 대한 확인으로 ACK 패킷을 보내고 CLOSE_WAIT 상태가 된다. ACK를 받은 클라이언트는 FIN_WAIT_2 상태로 변경된다.
- 서버는 통신이 다 끝나면, 클라이언트에게 연결이 종료되었다는 FIN 패킷을 전송하고 LAST_ACK 상태가 된다.
- 클라이언트는 서버의 FIN에 대한 확인으로 ACK 패킷을 전송하고 TIME_WAIT 상태가 된다. 서버는 클라이언트의 ACK를 받으면 연결이 완료되었다고 판단하고, 연결을 종료한다.
참고)
- ESTABLISHED : 연결 완료, 데이터를 주고받을 수 있는 상태
- FIN_WAIT_1 : 송신자가 연결을 종료했고, 상대편에게 확인을 기다리는 상태
- FIN_WAIT_2 : 수신자가 연결 종료를 확인한 상태
- CLOSE_WAIT : 상대방(원격 피어)이 연결 종료를 요청, 로컬 소켓은 해당 종료 확인을 위해 대기하고 있는 상태
- LAST_ACK : 로컬 소켓이 연결 종료를 요청하고 확인을 기다리는 상태
- TIME_WAIT : 연결은 종료되었으나 마지막 패킷이 소멸하기 전까지 대기 중인 상태
- CLOSED : 소켓이 완전히 종료되어 더 이상 데이터를 주고받을 수 없는 상태
728x90