TCP 3-way-Handshake & 4-way-Handshake
TCP는 정확한 전송을 보장해야 하며, 실제 통신을 하기 전에 접속이 연결됨을 알려주는 것이 필요하다. 이 과정이 3-way Handshaking이다.
연결 성립 (Connection Establishment)
[그림]
- 클라이언트가 서버에 접속을 요청하는 SYN 패킷을 보낸다.
- 서버는 클라이언트의 요청인 SYN을 받고 클라이언트에게 요청을 수락한다는 ACK와 SYN이 설정된 패킷을 전송한다.
- 클라이언트는 서버의 수락 응답인 ACK와 SYN 패킷을 받고, ACK를 서버로 보내면 연결이 성립(establish)된다.
연결 해제 (Connection Termination)
연결이 성립된 후, 모든 통신이 끝나게 되면 연결을 해제해야 한다.
[그림]
- 클라이언트가 서버에 연결을 종료하겠다는 FIN 플래그를 보낸다.
- 서버는 클라이언트의 요청(FIN)을 받고, 확인했다는 표시인 ACK를 보낸다.
2.1 이때 남은 데이터를 모두 보낼 때 까지 CLOSE_WAIT 상태가 된다.
- 데이터를 모두 보내고 통신이 끝났으면, 클라이언트에게 연결이 종료되었다는 FIN 플래그를 전송한다.
- 클라이언트는 FIN 플래그를 확인했다는 ACK텍스트를 서버에게 보낸다.
4.1 이때 서버로부터 받지 못한 데이터가 있을 수 있으므로, TIME_WAIT을 통해 기다린다.
- 클라이언트의 ACK를 받은 서버는 소켓 연결을 닫는다.(closed)
- TIME_WAIT 시간이 끝나면 클라이언트도 닫는다.(closed)