3-Way HandShake & 4-Way HandShake
3-Way HandShake 는 TCP의 접속, 4-Way HandShake는 TCP의 접속 해제 과정이다.
3-Way Handshake
TCP 통신을 이용하여 데이터를 전송하기 위해 네트워크 연결 설정을 하는 과정이다.
양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고,
실제로 데이터 전달이 시작하기 전에 한 쪽이 다른 쪽이 준비되었다는 것을 알 수 있도록 한다.
즉, TCP/IP 프로토콜을 이용해서 통신을 하는 응용 프로그램이 데이터를 전송하기 전에
먼저 정확한 전송을 보장하기 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정을 의미한다.
포트(PORT) 상태 정보
STATE | 설명 |
CLOSED | 포드가 닫힌 상태 |
LISTEN | 포트가 열린 상태로 연결 요청 대기 중 |
SYN_SENT | SYN 요청을 한 상태 |
SYN_RECEIVED | SYNC 요청을 받고 상대방의 응답을 기다리는 중 |
ESTABLISHED | 포트 연결 상태 |
플래그 정보
FLAG | 기능 | 설명 |
SYN | 연결 설정 | Synchronize Sequence Number Sequence Number 를 랜덤으로 설정하여 세션을 연결하는데 사용하며, 초기에 Sequence Number 를 전송한다. |
ACK | 응답 확인 | Acknowledgement 패킷을 받았다는 것을 의미하며, Acknowledgement Number 필드가 유효한지 나타낸다. |
FIN | 연결 해제 | Finsh 세션 연결을 종료시킬 때 사용되며, 더 이상 전송할 데이터가 없음을 의미한다. |
3-Way Handshake 동작 과정
1. Client -> Server (SYN)
- 서버에 접속을 요청하는 SYN 패킷을 전송한다.
- 송신자가 최초로 데이터를 전송할 때 Sequence Number를 임의의 랜덤 숫자로 지정하고,
SYN 플래그 비트를 1로 설정한 새그먼트를 전송. - Client는 SYN을 보낸 후 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다.
2. Server → Client (SYN/ACK)
- LISTEN 상태인 Server가 SYN을 받고, 클라이언트에게 요청을 수락(ACK)했으며
접속 요청 프로세스인 클라이언트도 포트를 열어달라(SYN)는 메시지를 전송. - ACK Number필드를 Sequence Number + 1로 지정하고 SYN과 ACK 플래그 비트를 1로 설정한 새그먼트 전송.
- SYN을 받은 서버는 SYN_RECEIVED 상태가 된다.
3. Client → Server (ACK)
- 클라이언트는 서버의 응답을 받았다는 의미로, ACK Number필드를 Sequence Number + 1로 지정하고 서버로 ACK 플래그가 설정된 새그먼트를 전송한다.
- ACK 요청을 보낸 클라이언트는 ESTABLISHED 상태가 된다.
- ACK를 받은 서버는 ESTABLISHED 상태가 된다.
4-Way Handshake
3-Way Handshake가 세션을 수립하는 과정이었다면
4-Way Handshake는 세션을 종료하기 위해 수행되는 과정이며, 여기서 FIN 플래그를 사용한다.
STATE | 설명 |
FIN_WAIT1 | close() 를 호출 후 FIN 패킷을 보내고 응답을 대기하는 상태 |
CLOSE_WAIT | 종료 요청을 받고 진입하는 상태로 남은 데이터가 있다면 전송을 마친 후 close() 호출 |
FIN_WAIT2 | 종료를 준비한다는 응답을 받고 종료 요청이 올 때까지 대기 |
LAST_ACK | 모든 데이터를 보내고 FIN 패킷을 전송한 후 상배당의 응답을 대기 |
TIME_WAIT | FIN 패킷을 받은 후 다시 ACK 응답을 한 이후의 상태, 의도치 않은 에러로 인해 연결이 데드락에 빠지는 것을 방지 |
4-Way Handshake 동작 과정
1. Client → Server (FIN)
- close()가 호출되면 연결을 종료한다는 FIN 패킷을 보낸다.
- FIN 패킷에는 ACK로 포함되어있다.
- FIN 패킷을 보낸 후 FIN_WAIT_1 상태가 된다.
2. Server → Client (ACK)
- FIN 패킷을 받은 서버는 응답 패킷 ACK를 보낸다.
- 응답 패킷 ACK를 보낸 후 CLOSE_WAIT 상태가 된다.
- 아직 남은 데이터가 있다면 마저 전송을 마친 후에 close( )를 호출한다.
- 클라이언트는 ACK 패킷을 받은 후 FIN_WAIT_2 상태가 된다.
3. Server → Client (FIN)
- 데이터를 모두 보냈다면, 서버는 FIN 패킷을 클라이언트에게 보낸 후에
승인 번호를 보내줄 때까지 기다리는 LAST_ACK 상태로 들어간다.
4. Client → Server (ACK)
- 클라이언트는 FIN 패킷을 받고, 확인했다는 ACK 응답을 보낸다.
- ACK 응답을 보낸 후 클라이언트는 TIME_WAIT 상태가 된다.
- TIME_WAIT 상태는 의도치 않은 에러로 인해 연결이 데드락으로 빠지는 것을 방지한다.
- 만약 에러로 인해 종료가 지연되다가 타임이 초과되면 CLOSED 상태로 들어간다.
- 서버는 ACK를 받은 이후 소켓을 닫는다 (Closed)
- TIME_WAIT 시간이 끝나면 클라이언트도 닫는다 (Closed) - 기본 240초
'CS > 네트워크' 카테고리의 다른 글
TCP/IP 흐름제어, 혼잡제어 (0) | 2024.06.07 |
---|---|
유니캐스트, 브로드캐스트, 멀티캐스트 (0) | 2024.06.03 |
TCP & UDP (0) | 2024.05.29 |
OSI 7계층 (0) | 2024.05.27 |
HTTP & HTTPS (0) | 2024.05.24 |