3-Way-Handshake와 4-Way-Handshake는 각각 TCP가 서로의 연결을 논리적으로 성립시키고 해제 시키는 과정을 의미한다.
3-Way-Handshake
TCP는 서버와 클라이언트 사이에 데이터를 전송하기 위해 데이터 전송 전 서로의 연결을 3가지 단계를 이용해 성립시킨다.
- 연결하고자 하는 A가 B에게 연결 요청을 한다.
- B는 연결요청을 받았으니 A에게 연결 요청을 수락한다는 응답과 연결 요청을 보낸다.
- A는 B의 연결 요청을 수락한다는 응답을 B에게 보낸다.
각 단계를 구체적으로 알아보자.
연결하고자 하는 A가 B에게 연결 요청을 한다.
클라이언트 A는 서버 B와 연결을 하고싶다.
클라이언트 A는 연결하고자 하는 서버 B에게 연결을 요청하는 SYN 패킷을 전송한다.
연결이 없던 클라이언트 A는 “CLOSED” 상태에서 SYN 패킷을 보냈다는 “SYN-SENT” 상태로 변경된다.
B가 A에게 응답과 함께 연결을 요청한다.
서버 B는 클라이언트 A에게 연결을 요청하는 SYN 패킷을 받았기 때문에 연결 요청을 수락한다는 응답(ACK)을 줘야한다.
또한 서버 B도 클라이언트 A에게 연결을 요청하는 SYN 패킷을 전송한다.
즉, 서버 B는 SYN 플래그와 ACK 플래그가 설정된 패킷을 클라이언트 A에게 전송한다.
이 때, 서버 B는 연결 요청을 듣고 있는 “LISTEN” 상태에서 클라이언트 A에게 연결 요청을 정상적으로 받았다는 “SYN-RECIEVED” 상태로 변경된다.
A는 B의 연결 요청을 수락하는 응답을 보낸다.
클라이언트 A는 서버 B로부터 자신의 요청이 수락되었다는 응답과 함께 B의 연결 요청을 받았다.
클라이언트 A는 서버 B에게 연결 요청을 수락하는 ACK 응답을 보내준다.
직전, SYN_SENT 상태였던 클라이언트 A는 연결이 성립되었다는 “ESTABLISHED” 상태로 변경된다.
서버 B 또한 클라이언트 A로부터 응답을 받고 연결이 성립되었다는 “ESTABLISHED” 상태로 변경된다.
4-Way-Handshake
TCP는 서버와 클라이언트 사이의 성립된 연결 세션을 종료하기 위해 4가지 단계를 이용한다.
- A가 B에게 연결 해제 요청을 한다.
- B는 연결 해제 요청을 받고 A에게 연결 해제 요청을 정상적으로 받았다고 응답한다. 이 후, 자신이 수행중인 애플리케이션이 종료되기를 기다린다.
- B는 자신의 애플리케이션이 종료되면 A에게 연결 해제 요청을 보낸다.
- A는 B의 연결 해제 요청을 정상적으로 받고 종료한다고 응답한다.
A가 B에게 연결 해제 요청을 한다.
클라이언트 A는 서버 B에게 연결 해제 요청을 하기위해 FIN 플래그가 설정된 패킷을 보낸다.
현재 클라이언트 A는 연결되어 있는 상태인 “ESTABLISHED” 에서 “FIN-WAIT-1” 상태로 변경된다.
B는 연결 해제 요청을 응답한다.
서버 B는 클라이언트 A로부터 연결 해제 요청을 받았다.
서버 B는 클라이언트 A에게 연결 해제 요청을 정상적으로 받았다는 것을 알려주는 ACK 패킷을 담아 응답한다.
또한, 현재 실행중인 애플리케이션에게 클라이언트 A가 연결 해제 요청을 했다고 알려주고 애플리케이션이 종료되길 기다리는 “CLOSE-WAIT” 상태로 변경된다.
클라이언트는 A는 서버 B로부터 ACK 응답을 받으면서 서버 B의 연결 해제 요청을 기다리는 “FIN-WAIT-2” 상태로 변경된다.
애플리케이션이 종료되었다. B는 A에게 연결 해제 요청을 보낸다.
서버 B에서 실행중이던 애플리케이션이 정상적으로 종료되었다.
클라이언트 A는 서버 B의 연결 해제 요청을 기다리고 있다.
따라서, 서버 B는 클라이언트 A에게 FIN 플래그가 설정된 패킷을 보내고 클라이언트 A가 연결 해제 요청을 정상적으로 받았다는 응답을 기다리는 “LAST-ACK” 상태로 변경된다.
A는 B에게 연결 해제 요청을 정상적으로 수신함을 응답한다.
클라이언트 A는 서버 B로부터 연결 해제 요청을 정상적으로 받으면 서버 B에게 ACK 응답을 보내준다.
클라이언트 A와 서버 B 사이의 연결 해제 단계가 모두 수행되었다.
이 때, 클라이언트 TIME-WAIT 단계로 변경되었다가 일정 기간 세션을 유지한 CLOSED 상태로 변경된다.
서버 B는 클라이언트 A로부터 ACK 응답을 전달 받고 CLOSED 상태로 변경된다.
TIME-WAIT이란?
연결 해제 요청을 처음 시작한 쪽에 생성되는 소켓이다.
FIN 패킷을 보내기 전에 라우팅 지연 혹은 패킷 유실로 인한 재전송이 이뤄져 FIN 패킷보다 늦게 도착하는 경우가 발생하면 해당 패킷은 이미 종료된 상태에서 온 데이터라 유추되기 때문에 삭제될 것이다.
이런 예기치 못한 상황을 대비하기 위해 종료 요청을 한 쪽은 FIN 패킷을 받더라도 즉시 종료하지 않고 일정시간 동안 세션을 유지한 후 CLOSED 상태로 변경되는데 이 때 일정시간 세션을 유지하는 단계를 TIME-WAIT 단계라고 한다.
📄 References
[ 네트워크 쉽게 이해하기 22편 ] TCP 3 Way-Handshake & 4 Way-Handshake : https://mindnet.tistory.com/entry/네트워크-쉽게-이해하기-22편-TCP-3-WayHandshake-4-WayHandshake
'Computer Science > Network' 카테고리의 다른 글
HTTP, HTTPS (0) | 2022.07.10 |
---|---|
TCP, UDP (0) | 2022.05.17 |
CORS (Cross Origin Resource Sharing) (0) | 2022.05.08 |