TCP 프로토콜을 사용하여 연결을 설정할 때 사용되는 절차로 세 단계로 이루어진다.
- 클라이언트는 ISN과 함께 SYN 플래그를 설정하여 서버에 연결 요청
- ISN : 32비트 시퀀스의 고유번호이며, 이를 통해 TCP 연결을 구분하여 통신 충돌 방지
- SYN = Synchronization, 연결 요청 플래그
- ACK = Acknowledment, 응답 플래그
- 서버가 연결 요청을 수신하면, SYN 플래그를 확인하고 서버의 ISN 값을 SYN/ACK 플래그와 함께 클라이언트에게 전송
- 클라이언트는 이를 받아서 1이 증가한 ISN을 SYN 플래그와 함께 서버의 ISN에 1을 더한 값을 ACK 플래그로 담아 다시 서버에게 전송
- 상태변화: 클라이언트, 서버 모두 CLOSED 된 상태에서 연결 시작
- 클라이언트 SYN → 클라이언트 상태는 SYN-SENT로 변경
→ 이 때, 서버는 LISTEN 상태여야 함- 서버 상태는 SYN-RECEIVED로 변경 → 서버는 SYN/ACK 전송
- 클라이언트 ESTABLISHED → 클라이언트 ACK → 서버 ESTABLISHED
3-way handshaking 과정을 거치면서 클라이언트-서버 간의 연결과정이 성립되기 때문에 TCP는 신뢰성이 있다고 말할 수 있다.
- 클라이언트가 연결 종료를 요청하기 위해 FIN 세그먼트를 전송하면, 클라이언트는 FIN_WAIT 1 상태로 전환
- 서버는 FIN 요청을 받으면 CLOSED_WAIT 상태로 이동하고, ACK 세그먼트를 클라이언트에게 전송하면 클라이언트는 FIN_WAIT 2 상태로 전환
- 일정 시간 후, 서버는 CLOSED_WAIT 상태에서 LAST_ACK 상태로 변경하고 FIN 세그먼트를 전송
- 클라이언트는 TIME_WAIT 상태로 변경하고 ACK를 전송한 후, 서버는 CLOSED 상태로 전환
→ 클라이언트는 설정한 TIME_WAIT 시간이 지나면 CLOSED 상태로 전환
- TIME_WAIT 상태: 연결 종료 프로세스가 완료되고 모든 리소스가 확실히 해제될 때까지 대기하는 상태
→ MSL * 2 시간으로 보통 설정
→ MSL(Maximum Segment Lifetime): 최대 패킷 수명으로 OS마다 차이가 있음 (Ubuntu : 60초, Window : 4분)- TIME_WAIT 설정 이유
- 지연 패킷을 수신: 클라이언트는 연결 종료 후 일정 시간 동안 지연 패킷을 기다릴 수 있다.
→ 데이터 무결성을 보장- 연결이 올바르게 닫힌 상태로 만들기 위해: 더 이상 해당 연결에 관련된 리소스나 포트가 사용되지 않도록 TCP 연결이 완전히 종료되도록 일정시간 기다린다.
→ 이후 새로운 TCP 연결이 올바르게 설정될 수 있도록 한다.