Backend/Internet

3-way handshake & 4-way handshake

비망노트 2022. 9. 4. 19:01

 

 

📌 TCP 3-way handshake란?

 

TCP/IP프로토콜을 이용해 통신을 하는 응용프로그램이 데이터를 전송하기전

먼저 정확한 전송을 보장하기위해 상대방컴퓨터와 사전에 세션을 수립하는 과정을 뜻한다.

 

다시말해 연결하고자하는 두 장치간의 논리적 접속을 성립하기위해 사용하는 연결확인 방식으로,

3번의확인과정을 거친다고하여 3-way handshake라고 부른다.

 


 

📌 TCP 3-way handshake

 

TCP 3-way handshake는

클라이언트, 서버 양쪽 모두 데이터를 전송할 준비가 되었다는것을 보장하고,

데이터 전달시작전 한쪽이 다른쪽의 준비완료여부를 알 수 있도록 한다.

 

양쪽 모두 상대편에 대한 초기 순차일련번호를 얻을 수 있도록한다.

 

3-way handshake 를 간단히 표현한 그림이다.

 

 

Client -> Server : 서버 들리나요?

Server -> Client : 서버 들립니다. 클라이언트 들리나요?

Client -> Server : 클라이언트 들립니다.

 

 

🚩 step 1

 

클라이언트는 서버에 접속을 요청하는 SYN 패킷을 보낸다.

이때 클라이언트는 SYN을 보내고 SYN/ACK응답을 기다리는 SYN_SENT상태, 서버는 Wait for Client 상태

 

 

🚩 step 2

 

서버는 SYN요청을 받고 클라이언트에게 요청을 수락한다는 ACK와 SYN flag가 설정된 패킷을 발송한다.

클라이언트가 다시 ACK로 응답하기를 기다리며 이때 서버는 SYN_RECEIVED 상태가 된다.

 

 

🚩 step 3

 

클라이언트는 서버에세 ACK를 보내고 이후로부터는 연결이 이루어지고 데이터가 오가게된다.

이때 서버의 상태는 ESTABLISHED 이다.

 

 

SYN ( synchronize sequence numbers ) : 연결확인을위해 보내는 무작위의 숫자값 (들리나요?)

ACK ( acknowledgment ) : Client혹은 Server로부터 받은 SYN에 1을 더해 SYN을 잘 받았다는 ACK (들립니다)

ISN ( Initial sequence numbers ) : Client와 Server가 각각 처음으로 생성한 SYN

 

상태 설명
CLOSED 연결수립을 시작하기전의 기본상태(연결없음)
LISTEN 포트가 열린 상태로 연결요청대기중
SYN-SENT SYN 요청을 한 상태
SYN-RECEIVED SYN 요청을 받고 상대방의 응답을 기다리는 중
ESTABLISHED 연결의 수립이 완료된상태, 서로 데이터를 교환할 수 있음

 


 

📌 4-way handshake란?

 

3-way handshake가 TCP의 연결을 초기화 할 때 사용되었다면, 

4-way handshake는 세션을 종료하기 위해 수행되는 절차이다.

 

4-way handshake 를 간단히 표현한 그림이다.

 

Client -> Server : 데이터를 다 보냈으니 이제 종료하겠습니다.

Server -> Client : 알겠습니다 잠시만 기다려주세요.

Server -> Client : 됐습니다 이제 종료하겠습니다.

Client -> Server : 네 알겠습니다.

 

 

🚩 step 1

 

클라이언트가 연결을 종료하겠다는 FIN 플래그를 전송한다. 이때 클라이언트는 FIN-WAIT상태가 된다.

 

 

🚩 step 2

 

서버는 FIN플래그를 받고, 일단 확인메시지 ACK를 보낸뒤 자신의 통신이 끝날때까지 기다리는데

이때의 서버상태는 CLOSE-WAIT이다.

 

 

🚩 step3

 

연결을 종료할 준비가 되면, 연결해지를 위한 준비가 되었음을 알리기 위해 클라이언트에게 FIN플래그를 전송한다.

이때 서버의 상태는 LAST-ACK이다.

 

 

🚩 step4

 

클라이언트는 서버의 해지준비가 되었다는 FIN플래그를 받고 확인했다는 ACK를 전송한다.

이때 클라이언트의 상태가 FIN-WAIT에서 TIME-WAIT으로 변경된다.

 

 

상태 설명
CLOSE 연결 수립을 시작하기 전의 기본 상태 (연결 없음)
ESTABLISHED 연결의 수립이 완료된 상태, 서로 데이터를 교환할 수 있다.
CLOSE-WAIT 상대방의 FIN(종료 요청)을 받은 상태. 상대방 FIN에 대한 ACK를 보내고 애플리케이션에 종료를 알린다.
LAST-ACK CLOSE-WAIT 상태를 처리 후 자신의 FIN요청을 보낸 후 FIN에 대한 ACK를 기다리는 상태.
FIN-WAIT-1 자신이 보낸 FIN에 대한 ACK를 기다리거나 상대방의 FIN을 기다린다.
FIN-WAIT-2 자신이 보낸 FIN에 대한 ACK를 받았고 상대방의 FIN을 기다린다.
CLOSING 상대방의 FIN에 ACK를 보냈지만 자신의 FIN에 대한 ACK를 못받은 상태
TIME-WAIT 모든 FIN에 대한 ACK를 받고 연결 종료가 완료된 상태. 새 연결과 겹치지 않도록 일정 시간 동안 기다린 후 CLOSED로 전이한다.

 

FIN(Finish) - TCP 연결을 종료하겠다는 메시지

 

 

 

📍 Time-Wait

 

먼저 연결을 끊는(active closer)쪽에 생성되는 소켓으로, 혹시모를 패킷전송실패에 대비하기위해 존재하는 소켓

 

만약 서버에서 FIN을 전송하기 이전에 전송했던 패킷이 Routing 지연 혹은, 패킷유실로인한 재전송등의 이유로인해

FIN패킷보다 늦게 도착하는 상황이 발생하는 바람에

클라이언트에서 세션을 종료시킨 뒤 뒤늦게 도착하는 패킷이 있다면 이 패킷은 드랍되고, 데이터는 유실될것이다.

 

클라이언트는 이러한 현상에 대비해 클라이언트는 서버로부터 FIN을 수신하더라도

일정시간(기본240초)동안 세션을 남겨두는 잉여패킷을 기다리는 과정을 거치게되는데

해당과정을 TIME-WAIT 이라고 하며 일정시간이 지나면 세션을 만료하고 연결을 종료시키며 CLOSE상태로 변한다.

 

 

 

 

-출처

https://bangu4.tistory.com/74

https://seongonion.tistory.com/74

'Backend > Internet' 카테고리의 다른 글

DNS의 개념과 작동원리  (0) 2022.12.25
웹 브라우저의 작동원리  (0) 2022.12.08
HTTP  (0) 2022.09.17
TCP/IP  (0) 2022.09.04
인터넷의 작동 원리  (1) 2022.09.03