TCP's 3-way handshake, 4-way handshake
TCP의 3-way 핸드셰이크(3-way handshake)와 4-way 핸드셰이크(4-way handshake)는 TCP(Transmission Control Protocol)에서 연결을 설정하고 해제하는 과정이다. 이 두 과정은 TCP가 신뢰성 있는 통신을 제공하는 데 중요한 역할을 한다.
1. TCP 3-way 핸드셰이크 (연결 설정 과정)
3-way 핸드셰이크는 클라이언트와 서버 간에 TCP 연결을 설정하는 과정이다. 이 과정에서 클라이언트와 서버는 서로 통신할 준비가 되었음을 확인하고, 통신을 위한 시퀀스 번호를 교환하여 데이터 전송을 준비한다.
단계별 설명
- SYN (Synchronize):
- 클라이언트는 서버에 TCP 연결을 요청하기 위해 SYN 플래그가 설정된 패킷을 서버로 보낸다. 이 패킷에는 클라이언트의 초기 시퀀스 번호(ISN, Initial Sequence Number)도 포함된다.
- 클라이언트 → 서버: SYN
- 상태: SYN_SENT
- SYN-ACK (Synchronize-Acknowledgment):
- 서버는 클라이언트의 SYN 패킷을 수신하고, 그 요청을 수락하면 SYN-ACK 패킷을 클라이언트에게 보낸다. 이 패킷에는 서버의 초기 시퀀스 번호(ISN)가 포함되며, 클라이언트의 SYN 요청에 대한 확인으로 ACK 플래그도 설정된다.
- 서버 → 클라이언트: SYN-ACK
- 상태: SYN_RCVD
- ACK (Acknowledgment):
- 클라이언트는 서버의 SYN-ACK 패킷을 수신하고, 이를 확인하는 ACK 패킷을 서버로 다시 보낸다. 이 패킷은 서버의 시퀀스 번호에 대한 확인 응답을 의미하며, 이로써 연결이 확립된다.
- 클라이언트 → 서버: ACK
- 상태: ESTABLISHED
3-way 핸드셰이크 요약
1. 클라이언트 → 서버: SYN (연결 요청)
2. 서버 → 클라이언트: SYN-ACK (연결 요청 수락 및 확인)
3. 클라이언트 → 서버: ACK (서버의 응답 확인)
- 목적: 클라이언트와 서버가 서로 통신할 준비가 되었음을 확인하고, 초기 시퀀스 번호(ISN)를 교환하여 신뢰성 있는 데이터 전송을 위한 TCP 연결을 설정한다.
- 결과: 클라이언트와 서버 간에 TCP 연결이 설정되며, 이후 데이터 전송이 가능하다.
2. TCP 4-way 핸드셰이크 (연결 종료 과정)
4-way 핸드셰이크는 TCP 연결을 종료하는 과정이다. 이 과정에서는 클라이언트와 서버가 각자 데이터 전송을 중단하고, 연결을 안전하게 해제한다. 연결 종료는 양방향으로 이루어지기 때문에, 각각의 종료 요청에 대해 FIN (Finish) 플래그를 사용하여 응답을 주고받는다.
단계별 설명
- FIN (Finish):
- 클라이언트가 더 이상 데이터를 전송할 필요가 없으면 FIN 플래그가 설정된 패킷을 서버로 보낸다. 이는 클라이언트가 서버와의 연결을 종료하고 싶다는 의사를 나타낸다.
- 클라이언트 → 서버: FIN
- 상태: FIN_WAIT_1
- ACK (Acknowledgment):
- 서버는 클라이언트의 FIN 패킷을 수신하고, 이를 확인하는 ACK 패킷을 클라이언트에게 보낸다. 이 패킷은 클라이언트의 FIN 요청을 수락했음을 의미하지만, 서버는 여전히 데이터를 전송할 수 있다.
- 서버 → 클라이언트: ACK
- 상태: CLOSE_WAIT (서버) / FIN_WAIT_2 (클라이언트)
- FIN (Finish):
- 서버가 더 이상 데이터를 전송할 필요가 없으면, 서버 역시 FIN 플래그가 설정된 패킷을 클라이언트에게 보낸다. 이는 서버도 연결을 종료하고 싶다는 의사를 나타낸다.
- 서버 → 클라이언트: FIN
- 상태: LAST_ACK (서버) / TIME_WAIT (클라이언트)
- ACK (Acknowledgment):
- 클라이언트는 서버의 FIN 패킷을 수신하고, 이를 확인하는 ACK 패킷을 서버로 다시 보낸다. 이 패킷을 통해 클라이언트는 서버의 종료 요청을 수락하며, 이로써 연결이 완전히 종료된다.
- 클라이언트 → 서버: ACK
- 상태: CLOSED
4-way 핸드셰이크 요약
1. 클라이언트 → 서버: FIN (클라이언트가 전송 종료 요청)
2. 서버 → 클라이언트: ACK (서버가 전송 종료 확인)
3. 서버 → 클라이언트: FIN (서버가 전송 종료 요청)
4. 클라이언트 → 서버: ACK (클라이언트가 전송 종료 확인)
- 목적: 클라이언트와 서버가 각자 더 이상 데이터를 전송하지 않을 것임을 명시하고, 안전하게 연결을 종료하는 과정이다.
- 결과: 양측 모두 데이터 전송이 완료되었으며, 연결이 종료된다.
4-way 핸드셰이크의 상태 요약
- 클라이언트: FIN_WAIT_1 → FIN_WAIT_2 → TIME_WAIT → CLOSED
- 서버: CLOSE_WAIT → LAST_ACK → CLOSED
3. 3-way 핸드셰이크와 4-way 핸드셰이크의 차이점
항목 | 3-way 핸드셰이크 | 4-way 핸드셰이크 |
기능 | TCP 연결을 설정하기 위한 절차 | TCP 연결을 종료하기 위한 절차 |
플래그 사용 | SYN, SYN-ACK, ACK | FIN, ACK |
단계 수 | 3단계 | 4단계 |
연결 지향 여부 | 클라이언트와 서버 간의 연결을 설정함 | 양측이 각각 독립적으로 연결을 종료함 |
흐름 제어 | 데이터 전송 전 준비 상태를 동기화 | 데이터 전송 후 종료 상태를 동기화 |
- 3-way 핸드셰이크는 연결 설정을 위한 과정으로, 데이터를 전송하기 전에 클라이언트와 서버가 연결 준비가 되었는지 확인하고 초기 시퀀스 번호(ISN)를 교환한다.
- 4-way 핸드셰이크는 연결 종료를 위한 과정으로, 양측이 각자의 데이터 전송이 끝났음을 확인하고 연결을 종료한다.
4. TIME_WAIT 상태
TIME_WAIT는 클라이언트가 서버의 FIN 패킷에 ACK 응답을 보낸 후 일정 시간 동안 연결을 유지하는 상태이다. 이는 패킷 손실 방지와 중복된 패킷의 영향을 최소화하기 위한 TCP의 메커니즘이다.
TIME_WAIT 상태의 목적
- 중복 패킷 방지: 만약 마지막 ACK 패킷이 손실되면 서버는 클라이언트에게 FIN 패킷을 다시 보낼 수 있다. 클라이언트는 여전히 TIME_WAIT 상태에 있으므로 서버의 재전송에 적절히 응답할 수 있다.
- 세그먼트 재사용 방지: 이전 연결에서 사용된 시퀀스 번호가 재사용되지 않도록 일정 시간이 경과한 후 새로운 연결을 허용한다.
TIME_WAIT 상태는 기본적으로 2 MSL(Maximum Segment Lifetime) 동안 유지되며, 이는 패킷이 네트워크를 통해 이동할 수 있는 최대 시간을 의미한다.
- TCP 3-way 핸드셰이크는 클라이언트와 서버가 연결을 설정하는 과정으로, 신뢰할 수 있는 데이터 전송을 위한 초기 시퀀스 번호 교환과 연결 준비를 동기화하는 데 사용된다.
- TCP 4-way 핸드셰이크는 클라이언트와 서버가 각자 데이터 전송을 완료하고 연결을 종료하는 과정으로, 양방향 모두 독립적으로 연결을 종료할 수 있다.
이 두 과정은 신뢰성 있는 TCP 통신을 보장하기 위한 중요한 절차로, TCP가 네트워크 통신에서 데이터 손실이나 오류를 방지하고, 안정적인 연결을 제공하는 데 핵심 역할을 한다.