TCP 에서 신뢰성 있는 데이터 전송을 위해 연결 시에는 3-way handshake를 통해 클라이언트와 서버 간의 연결을 설정합니다. 연결 해제 시에는 4-way handshake를 통해 클라이언트와 서버가 연결을 안전하게 종료합니다.
TCP
- 송신/수신 프로세스 사이에 신뢰성있는 전송
- 순서에 맞는 전달
- 흐름 제어 : 클라이언트가 너무 빠르게 데이터를 보내서 서버가 처리하지 못하는 상황을 방지
- 혼잡 제어 : 네트워크가 과부하되지 않도록 클라이언트가 전송 속도를 조절
- 연결 지향 : 신뢰성있는 전송을 위해 클라이언트/서버 프로세스 간 연결을 유지하며 동작함
- 전송 간의 피드백 정보를 이용함
TCP 3-way handshake
- TCP 연결을 설정할 때, 클라이언트와 서버가 세번의 신호 교환을 함
- 두 당사자가 데이터 전송을 위해 준비되었음을 확인하고 시퀀스 번호를 동기화함
SYN → SYN-ACK → ACK
- SYN (클라이언트 → 서버)
- 클라이언트는 시퀀스 번호를
m으로 설정
- 클라이언트는 SYN 플래그를 시퀀스 번호로 설정함
- 클라이언트가 SYN 패킷을 보냄
- SYN-ACK (서버 → 클라이언트)
- 서버는 클라이언트의 SYN 패킷을 수신함
- 서버는 시퀀스 번호를
n 으로 설정함
- 서버는 SYN 플래그를 시퀀스 번호로 설정함
- 서버는 ACK 플래그를
m+1 로 설정함
- 서버가 SYN-ACK 패킷을 보냄
- ACK (클라이언트 → 서버)
- 클라이언트는 서버의 SYN-ACK 패킷을 수신함
- 클라이언트는 ACK 플래그를
n+1 로 설정함
- 클라이언트는 ACK 패킷을 보냄

TCP 4-way handshake
- TCP 연결을 해제할 때, 클라이언트와 서버가 네번의 신호 교환을 함
FIN → ACK → FIN → ACK
- FIN (클라이언트 → 서버)
- 클라이언트는 FIN 플래그를 설정함
- 클라이언트가 FIN 패킷을 보냄
- 클라이언트는 FIN_WAIT_1 상태로 전환함
- 서버는 클라이언트의 FIN 패킷을 받고, CLOSE_WAIT 상태로 전환함
- ACK (서버 → 클라이언트)
- 서버는 ACK 패킷을 보냄
- 클라이언트는 ACK 패킷을 받고,FIN_WAIT_2 상태로 전환함
- FIN (서버 → 클라이언트)
- 서버가 종료 절차를 시작함
- 서버가 FIN 패킷을 보냄
- 서버는 LAST_ACK 상태로 전환함
- ACK (클라이언트 → 서버)
- 클라이언트는 서버의 FIN 패킷을 받음
- 클라이언트는 ACK 패킷을 서버에 보냄
- 서버는 클라이언트의 ACK 패킷을 받고, 연결이 종료되어 CLOSED 상태가 됨
- 클라이언트는 TIME_WAIT 상태로 전환하며, 일정 시간이 지나면 CLOSED 됨
