TCP 3 & 4 way handshake
TCP (Transmission Control Protocol)
- 인터넷상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용되는 프로토콜
- TCP는 애플리케이션에 신뢰적이고 연결지향적 서비스를 제공함
- IP는 배달을, TCP는 패킷의 추적 및 관리를 함
- 3-way handshaking 과정을 통해 연결을 설정하고 4-way handshaking을 통해 연결을 해제함
- 흐름 제어 및 혼잡 제어 수행
- 높은 신뢰성을 보장하지만, 속도가 느림
3 way handshake와 4 way handshake 사전 지식
▶ 포트(Port) 상태 정보
- CLOSED : 포트가 닫힌 상태
- LISTEN : 포트가 열린 상태로 연결 요청 대기 중
- SYN_RCV : SYN 요청을 받고 상대방의 응답을 기다리는 중
- ESTABLISHED : 포트 연결 상태
▶ 플래그 정보
TCP Header에는 Control Bit (플래그 비트, 6bit)가 존재하며, 각각의 bit는 'URG-ACK-PSH-RST-SYN-FIN'의 의미를 가짐
즉, 해당 위치의 BIT가 1이면 해당 패킷이 어떤 내용을 담고 있는 패킷인지를 나타냄
- SYN(Synchronize Sequence Number) / 000010
□ 연결 설정. Sequence Number를 랜덤으로 설정하여 세션을 연결하는 데 사용하며, 초기에 Sequence Number를 전송
- ACK(Acknowledgement) / 010000
□ 응답 확인. 패킷을 받았음을 의미함
- FIN(Finish) / 000001
□ 연결 해제. 세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 의미함
TCP 3 way handshake
- TCP 통신을 이용하여 데이터를 전송하기 위해 네트워크 연결을 설정하는 과정
- 양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 실제 데이터 전달이 시작하기 전에 한 쪽에서 다른 쪽이 준비되었음을 알 수 있도록 함
- 즉, TCP/IP 프로토콜을 이용해서 통신을 하는 응용 프로그램이 데이터를 전송하기 전에, 먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미
Step 1
- 클라이언트는 서버에 연결을 요청하는 SYN 패킷을 보낸 후 서버의 응답을 기다리며 SYN_SENT 상태를 유지하고, 서버는 클라이언트의 요청을 받기 전엔 Wait for Client 상태를 유지함
- 송신자가 최초로 데이터를 전송할 때는 Sequence Number를 임의의 랜덤 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송
Step 2
- 서버는 클라이언트가 보낸 SYN 패킷을 받고 SYN_RECEIVED 상태가 되고 SYN+ACK를 보내 응답
- ACK Number 필드를 Sequence Number + 1로 지정하고, SYN과 ACK 플래그 비트를 1로 설정한 세그먼트를 전송
Step 3
- 서버의 응답을 받은 클라이언트는 다시 서버에 ACK 패킷으로 응답하고, 이를 서버가 받은 후부터 세션이 생성되어 연결이 완료됨
이러한 3 단계를 거치면 클라이언트와 서버 모두 데이터를 전송하고 받을 준비가 되었다는 것을 보장하여 안전한 데이터 전송이 이루어짐
TCP 4 way handshake
- 데이터를 주고 받은 뒤 연결을 해제하는 과정
Step 1
- 클라이언트는 연결을 종료하고자 서버에 FIN 플래그를 보내고 FIN_WAIT 상태에 들어감
Step 2
- 서버는 클라이언트로부터 FIN 플래그를 받은 뒤 확인했다는 ACK 패킷을 보내고, 자신의 통신이 끝날 때까지 기다림
- 서버는 클라이언트에게 응답을 보내고 CLOSE_WAIT 상태에 들어간 후, 아직 남은 데이터가 있다면 마저 전송을 함
- 클라이언트에서는 서버에서 ACK를 받은 후에 서버가 남은 데이터 처리를 끝내고 FIN 패킷을 보낼 때까지 기다림
Step 3
- 서버가 연결을 종료할 준비가 되면, 연결을 해제할 준비가 되었다는 FIN 플래그를 클라이언트에 전송하고, 서버는 LAST_ACK 상태가 됨
Step 4
- 클라이언트는 서버에 ACK를 보내 응답하고 클라이언트의 상태는 FIN_WAIT → TIME_WAIT으로 변경
- 클라이언트의 ACK 응답을 받은 서버는 연결을 해제함
- 이때 클라이언트는 ACK를 보낸 이후 일정 시간 기다리게 되는데, 아직 서버에서 받지 못한 데이터가 유실되는 경우를 대비해 잉여 패킷을 기다리는 TIME_WAIT 상태를 일정 시간 유지함
서버는 ACK를 받은 이후 소켓을 닫고, TIME_WAIT 시간이 끝나면 클라이언트도 닫음
이러한 4 단계를 통해 클라이언트와 서버 간의 연결을 해제함