4-Way Handshake
4-Way Handshake은 연결을 해제 (Connecntion Termination)하는 과정
FIN 플래그를 이용
FIN
(finish) : 세션을 종료시키는데 사용되며, 더 이상 보낸 데이터가 없음을 나타낸다.
Termination의 종류
TCP는 대부분의 connection-oriented 프로토콜과 같은 두 가지 연결 해제 방식을 가짐
-
Graceful connection release(정상적인 연결 해제)
정상적인 연결 해제에서는 양쪽이 커넥션이 서로 모두 커넥션을 닫을 때까지 연결
-
Abrupt connection release(갑작스런 연결 해제)
- 갑자기 한 TCP 엔티티가 연결을 강제로 닫는 경우
- 한 사용자가 두 데이터 전송 방향을 모두 닫는 경우
작동방식 (Abrupt)
RST(TCP reset)
세그먼트가 전송되면 갑작스러운 연결 해제가 수행되는데, RST 세그먼트는 다음과 같은 경우에 전송됨
- 존재하지 않는 TCP 연결에 대해 비SYN 세그먼트가 수신된 경우
- 열린 커넥션에서 일부 TCP 구현은 잘못된 헤더가 있는 세그먼트가 수신된 경우
- RST 세그먼트를 보내, 해당 커넥션을 닫아 공격을 방지
- 일부 구현에서 기존 TCP 연결을 종료해야 하는 경우
- 연결을 지원하는 리소스 부족할 때
- 원격 호스트에 연결할 수 없고 응답이 중지되었을 때
작동방식 (Graceful)
Half-Close 기법
1. 종료 요청자가 처음 보내는 FIN 패킷에 승인 번호를 함께 담아서 보냄
2. 수신자가 남은 데이터를 모두 보내고 나면 다시 요청자에게 FIN 패킷을 보냄으로써 모든 데이터가 처리되었다는 신호 FIN을 전송
3. 요청자는 그때 나머지 반을 닫으면서 좀 더 안전하게 연결을 종료
1. 서버와 클라이언트가 연결된 상태에서 클라이언트가 close()를 호출하여 접속 종료 시도 (Client → Server : FIN(+ACK))
- 클라이언트는 서버에게 연결을 종료한다는 FIN 플래그를 전송
- FIN 패킷에는 보통 ACK도 포함
STEP2 (Server → Client : ACK)
2. 서버는 ACK를 클라이언트에게 전송 (Server → Client : ACK)
- 서버는 이후 자신의 통신이 끝날때까지 대기 (TIME_WAIT 상태)
- Server(수신자)는 ACK Number 필드를 (Sequence Number + 1)로 지정하고, ACK 플래그 비트를 1로 설정한 세그먼트를 전송
- 서버는 클라이언트에게 응답을 보내고 CLOSE_WAIT 상태
- 남은 데이터가 있다면 마저 전송을 마친 후에 close( )를 호출
- 클라이언트에서는 서버에서 ACK를 받은 후에 서버가 남은 데이터 처리를 끝내고 FIN 패킷을 보낼 때까지 대기 (FIN_WAIT_2)
3. 서버는 FIN 패킷을 클라이언트에게 전송 (Server → Client : FIN)
- 서버는 승인 번호를 보내줄 때까지 기다니는 LAST_ACK 상태로 들어간다.
4. 클라이언트는 ACK를 서버에게 보낸다.(Client → Server : ACK)
출처:[네트워크] TCP/UDP와 3 -Way Handshake & 4 -Way Handshake