티스토리 뷰
4way Handshake란 ?
네트워크를 사용한 통신에서 TCP프로토콜을 이용하여 통신하는 경우 호스트 간 성립(EASTABLISH)된 세션을 종료하기 위한 4단계로 진행되는 과정이다. 서버와 클라이언트 구분없이 연결 종료를 요청하는 호스트가 먼저 FIN 신호를 보내며, TIME-WAIT 상태에 빠지게 된다. 전반적인 흐름을 보면 두번의 요청과 두번의 응답이 있다. 곧바로 연결을 종료하지 않는 이유는 TCP의 신뢰성을 보장하기 위해서이다.
TCP 프로토콜에서 신뢰성 있는 연결을 설정할 땐 3way, 연결을 종료할 땐 4way로 진행된다.
진행 과정
연결 종료를 먼저 요청하는 호스트를 클라이언트, 연결 종료 요청을 응답하여 빠르게 연결을 종료하는 호스트를 서버라 가정한다.
1. 클라이언트가 연결을 종료하겠다는 FIN 신호(세그먼트)를 서버에게 전송한다.
: 클라이언트는 FIN_WAIT-1 상태가 된다.
: 클라이언트는 Appcatlion을 통해 데이터를 전달할 수 없는 상태가 된다.
2. FIN 신호(세그먼트)를 수신한 서버는 응답 메시지(ACK)를 클라이언트에게 송신한다.
: 서버는 CLOSE-WAIT 상태가 된다.
: 포트에 연결되어 있는 Application에게 close()를 요청한다. (종료하려고 알림)
: 서버는 Appcatlion을 통해 데이터를 전달할 수 없는 상태가 된다.
3. 응답 메시지(ACK)를 수신한 클라이언트는 다시 서버의 FIN 신호를 기다린다.
: 클라이언트가 응답 메시지(ACK)를 수신 시 FIN_WAIT-2 상태가 된다.
4. 서버는 Application이 close() 작업을 끝마쳤으면 FIN 신호(세그먼트)를 클라이언트에게 송신한다.
: 서버는 FIN 신호를 클라이언트에게 송신하는 순간 LAST-ACK 상태가 된다.
5. 클라이언트는 서버가 보낸 FIN 신호(세그먼트)를 수신하고 응답 메시지(ACK)를 서버에게 송신한다.
: 클라이언트는 응답 메시지(ACK)를 송신하는 순간 TIME-WAIT 상태가 된다.
: TIME-WAIT 상태는 ACK 도착 여부를 판단한다. 자세한건 다음 글을 참고하자
6. 서버는 응답 메시지(ACK)를 수신하고 CLOSED 상태가 되어 포트가 닫히고, 서버와 연결을 종료한다.
7. 클라이언트는 TIME-WAIT 상태에서 2MSL Time만큼 기다린 후 CLOSED 상태가 되어 포트가 닫히고 서버와 연결을 종료한다.
수 많은 커넥션(연결 및 연결 종료)이 존재한다면 포트의 사용량이 많아진다. 그러므로 포트가 부족할 수도 있다. FIN-WAIT-1, FIN-WAIT-2 상태에서 타임아웃(Time-Out)이 발생할 수 있다. Time-Out이 되기 기다리는 동안에 연결된 포트들을 사용할 수 없으므로 포트 부족 현상이 발생할 수 있다. 이를 방지하고자 타임아웃(Time-Out) 시간을 30초 이하로 조정하여 문제를 보완할 수 있다. (참고)
다음 그림은 4way-handshake 참고 그림이다.