TCP 3 Way Handshake 란?
전송제어 프로토콜 TCP은 연결지향적 이므로 통신하는 장치 간 서로 연결이 잘 되어 있는지 확인하는 방식이고
3번의 확인 과정을 거친다고 하여 3 Way Handshake라고 불립니다.
TCP 3 Way Handshake 과정
① A클라이언트는 B서버에 접속을 요청하는 SYN 패킷을 보낸다.
이때 A클라이언트는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 됩니다.
② B서버는 SYN요청을 받고 A클라이언트에게 요청을 수락한다는 ACK와 SYN Flag 가 설정된 패킷을 발송하고
A가 다시 ACK으로 응답하기를 기다리는데 이때 B서버는 SYN_Received 상태가 됩니다.
③ A클라이언트는 B서버에게 ACK 보내고 이후로 부터는 연결이 이루어지게 되므로 데이터가 오가게 됩니다.
이때 B서버의 상태가 ESTABLISHED 입니다.
이와 같이 통신하는 것이 신뢰성 있는 연결을 맺어 준다는 TCP의 3 Way handshake 방식입니다.
👉 SYN(Synchronization) : 연결요청, 세션을 설정하는데 사용되며 초기에 시퀀스 번호를 보냅니다.
👉 ACK(Acknowledgement) : 보낸 시퀀스 번호에 TCP 계층에서의 길이 또는 양을 더한 것과 같은 값을 ACK 포함하여 전송합니다.
TCP 4 Way Handshake 과정
① 클라이언트가 연결을 종료하겠다는 FIN 플래그를 전송합니다.
② 서버는 우선 확인메세지를 보내고 자신의 통신이 끝날때 까지 기다리는데 이 상태가 TIME_WAIT 입니다.
③ 서버가 통신이 끝났으면 연결이 종료되었다고 클라이언트에게 FIN플래그를 전송합니다.
④ 클라이언트는 확인했다는 메세지를 보냅니다.
But, Server에서 FIN을 전송하기 전에 전송한 패킷이 라우팅지연이나 패킷 유실로 인한 재전송 등으로 인해
FIN패킷 보다 늦게 도착하는 상황이 발생된다면?
👉 Client에서 세션을 종료시킨 후 뒤늦게 도착하는 패킷이 있다면 해당 패킷은 Drop되고 데이터는 유실 됩니다.
이러한 현상 때문에 Client는 Server로 부터 FIN을 수신하더라도 일정시간(기본값240초) 동안 세션을 남겨놓고
패킷을 기다리는 과정을 거치게 되는데 이 과정을 TIME_WAIT 라고 합니다.