CS/Network

[Network] TCP의 3-way-handshake와 4-way-handshake

ummchicken 2023. 1. 15. 14:56
💡 연결을 성립하고 해제하는 과정을 말한다.

 

 

 

3 way-handshake란? : 연결을 설정하는 과정

TCP 네트워크에서 통신하는 장치가 서로 연결이 잘 되었는지 확인하는 방법 (연결 성립)

 

송신자와 수신자는 총 3번에 걸쳐 데이터를 주고 받으며, 

통신이 가능한 상태인지 확인한다.

 

TCP는 정확한 전송을 보장해야 한다.

따라서 TCP/IP프로토콜을 이용해 통신하기에 앞서,

논리적인 접속을 성립하기 위해 3 way handshake 과정을 진행한다.

 

 

 

 

  • Client → Server : TCP SYN
  • Server → Client : TCP SYN + ACK
  • Clinet → Server : TCP ACK
※ 참고
- SYN : Synchronize Sequence Numbers
- ACK : Acknowledgment (승인)

 

 

이러한 절차는 TCP 접속을 성공적으로 성립하기 위해 반드시 필요하다.

 

 

 

TCP의 3-way Handshaking 역할

- 양쪽 모두 데이터를 전송할 준비가 되었다는 것을 보장하고, 

실제로 데이터 전달이 시작하기 전에 한쪽이 다른 쪽이 준비되었다는 것을 알 수 있도록 한다.

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

 

 

 

TCP의 3-way Handshaking의 과정

 

Step 1 (Client → Server : SYN)

- 클라이언트가 서버에게, 연결을 요청하는 메시지 SYN을 보낸다.
- 최초로 데이터를 전송할 때, Sequence Number를 임의의 숫자(난수)로 지정하고, 
SYN 비트를 1로 해서 보낸다.
💡 요약
Client는 Server에 접속 요청 메세지(SYN)을 전송하고, SYN_SEND 상태가 된다.

 

 

Step 2 (Server → Client : SYN + ACK)

- 서버가 클라이언트의 요청을 수락했으며(ACK), 
클라이언트의 포트도 열어달라는 메시지를 보낸다.(SYN)
- 이 때, ACK 필드를 (Sequence Number + 1)로 지정하고 
SYN과 ACK의 비트를 1로 설정한다.
💡 요약
Server는 SYN 요청을 받고 Client에 요청을 수락(SYN + ACK)하고, 
SYN_RECIEVED 상태가 된다.

 

 

Step 3 (Client → Server : ACK)

- 클라이언트에서 서버가 요청을 수락했음을 확인하는 응답 ACK를 보낸다.
- 이 때, 보내려는 데이터가 있으면 이 단계에서 전송을 수행할 수 있다.
💡 요약
Client는 Server에게 수락 확인(ACK)를 보내고, Server는 ESTACLISHED 상태가 된다.

 

 

 

이렇게 3번의 통신이 완료되면, 연결이 성립한다.

(3번이라 3 way handshake인 것)

 

 

 


 

4 way-handshake란? : 연결을 해제하는 과정

TCP 네트워크에서 통신하는 장치의 연결을 해제하는 방법

 

송신자와 수신자는 총 4번에 걸쳐 데이터를 주고 받으며 연결을 끊는다.

즉, 연결 성립 후, 모든 통신이 끝났다면 해제하야 한다.

 

 

3-Way handshake는 TCP의 연결을 초기화 할 때 사용한다면, 

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

 

 

 

 

 

 

TCP의 4-way Handshaking의 과정

 

Step 1 (Client → Server : FIN)

- 클라이언트가 서버에게 연결을 종료하겠다는 FIN 플래그 전송
- 서버로부터 FIN 응답을 받을 때 까지는 연결을 close 하지 못함

 

 

Step 2 (Server → Client : ACK)

- 서버는 FIN을 받고, 확인했다는 ACK를 클라이언트에게 보낸다.
- 이 때, 모든 데이터를 보내기 위해 CLOSE_WAIT 상태가 된다.

 

 

Step 3 (Server → Client : FIN)

- 서버가 통신이 끝났으면, 연결 종료 요청에 응한다는 의미로 FIN을 보냄

 

 

Step 4 (Client → Server : ACK)

- 클라이언트는 FIN을 받고, 확인했다는 ACK를 서버에게 보낸다.
- 이 때, 아직 서버로부터 받지 못한 데이터가 있을 수 있으므로 TIME_WAIT를 통해 기다린다.
※ TIME_WAIT란?
- 클라이언트가 서버로부터 FIN 응답을 받고 난 이후에도, 
바로 연결을 종료하지 않고 일정시간 동안 기다리는 상태.
<TIME_WAIT 부가 설명>
❓ 만약 "Server에서 FIN을 전송하기 전에, 
전송하고 있던 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로 인해 
FIN 패킷보다 늦게 도착하는 상황"이 발생한다면?

→ Cilent에서 세션을 종료시킨 후 뒤늦게 도착하는 패킷이 있다면, 
이 패킷은 Drop되고 데이터는 유실될 것이다.
이러한 현상에 대비하여 Client는 Server로부터 FIN을 수신하더라도
일정시간(디폴트 240초) 동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 
거치게 되는데 이 과정을 "TIME_WAIT"이라고 한다.

 

 

 

  • 서버는 ACK를 받을 이후 소켓을 닫는다. (Closed)
  • TIME_WAIT 시간이 끝나면 클라이언트도 닫는다.(Closed)

 

 

 

이렇게 4번의 통신이 완료되면, 연결이 해제된다.

 

 

 

 


출처

 

 

 

'CS > Network' 카테고리의 다른 글

[Network] HTTP & HTTPS  (0) 2023.01.17
[Network] 네트워크 기기 & IP 주소  (0) 2023.01.16
[Network] 네트워크의 기초 & TCP/IP 4계층 모델  (0) 2023.01.16
[Network] TCP와 UDP  (0) 2023.01.15
[Network] OSI 7 계층 & TCP/IP 4 계층  (0) 2023.01.07