본문 바로가기
Network

3-way Handshake & 4-way Handshake

by BTC_작은뉴진 2023. 10. 19.

베하~~🙋🏻‍♀️

뉴진쓰 팀의 작은뉴진이에요!

 

바로 본론으로 들어가 볼게요~~

 


 

우선, 3, 4-way handshake에 대해 알아보기 전에 TCP가 무엇인가에 대해 다시 한 번 간단하게 짚고 넘어갈게요!

 

TCP란?

TCP (Transmission Control Protocol)란 OSI 4계층인 전송계층(Transport Layer)의 프로토콜로, 웹이나 이메일과 같이 데이터가 정확하게 전달되어야 하는 통신에서 사용됩니다.

 

TCP는 연결 지향 프로토콜로 높은 신뢰성을 보장하기 위해 3-way handshaking을 통해 연결을 설정하며, 4-way handshaking을 통해 연결을 해제합니다. 그래서 비연결지향 프로토콜인 UDP보다 속도가 느리죠.

 

데이터의 정확한 전달을 중요시하는 프로토콜인 TCP는 신뢰성 있는 데이터 전송을 위해 데이터를 세그먼트 단위로 분할하고, 전송 속도를 조절하며, 데이터가 제대로 전달되지 않았을 때는 다시 데이터를 전송합니다.

 

그럼 이제 본격적으로 3-way handshake에 대해 알아보겠습니다.

 

3-way handshake란?

TCP 통신을 이용하여 데이터를 전송하기 위해 세 단계를 거쳐 네트워크 연결(Connection Establish)을 하는 과정입니다.

통신을 하는 응용 프로그램이 데이터를 전송하기 전에 먼저 정확한 데이터 전송을 위해 상대방 컴퓨터와 사전에 세션을 수립하는 과정이지요.

 

연결이 맺어지면 데이터를 전송할 수 있는 상태가 되고, 데이터 전송이 끝나면 연결을 끊게 됩니다.

연결을 끊는 단계들은 4-way handshake라고 하는데 이 부분은 아래에 설명드릴게요.

 

 

이제 어떻게 작동을 하는지에 대해 알아보겠습니다.

1. 클라이언트(연결 요청을 먼저 한 쪽)는 서버(연결 요청을 받은 쪽)와 연결하기 위해 연결 요청을 합니다. (SYN)

클라이언트가 최초로 데이터 전송 시 Sequence Number를 임의의 숫자로 지정하고, SYN 플래그 비트를 1로 설정한 세그먼트를 전송합니다.

이 때 포트의 상태는 다음과 같습니다 :

  • 클라이언트 : SYN_SENT
  • 서버 : LISTEN

 

2. 서버가 SYN을 받고, 클라이언트에게 받았다는 신호인 ACK과 SYN 패킷을 보내어 수락합니다. (SYN + ACK)

접속 요청을 받은 서버가 요청을 수락했으며, 접속을 요청한 프로세스인 클라이언트측에서도 포트를 열어달라는 메세지를 전송합니다.


이 때 포트의 상태는 다음과 같습니다 :

  • 클라이언트 : CLOSED
  • 서버 : SYS_RCV

 

3. 클라이언트는 서버에게서 ACK와 SYN 패킷을 받고 ACK를 서버로 다시 보냅니다.이 때, 전송할 데이터가 있다면 이 단계에서 데이터를 전송하게 됩니다.

 

접속 요청 프로세스인 클라이언트가 수락 확인(ACK)을 보내 연결을 맺습니다.

 

이 때 포트의 상태는 다음과 같습니다 :

  • 클라이언트 : ESTABLISHED
  • 서버 : SYN_RCV

 

4-way handshake란?

앞서 말씀드린 바와 같이 연결을 끊을(Connection Termination) 때는 4-way handshaking 과정을 거칩니다.

1. Active Close인 쪽(서버를 종료하겠다고 먼저 FIN을 보낸 쪽, 위 사진에서는 클라이언트)이 Passive Close(FIN을 받은 쪽, 위 사진에서는 서버)인 쪽에 FIN을 보냅니다.

 

클라이언트는 FIN_WAIT1 상태로 대기합니다.

 

2. 서버는 CLOSE_WAIT으로 상태를 바꾸고 응답하는 ACK 신호를 보냅니다. 하지만 바로 FIN을 보내 종료 시키지 않습니다.

 

서버는 CLOSE_WAIT 상태가 됩니다.

 

3. 서버는 할일을 다 끝내고 난 후 FIN을 클라이언트에 보내게 됩니다.

 

클라이언트는 TIME_WAIT 상태가 됩니다.

 

4. 클라이언트는 서버의 FIN을 잘 받았다며 ACK를 서버에게 보내고, 서버는 ACK를 전달 받으면 TIME_WAIT 시간 동안 기다린 후에 소켓을 종료 시키며, CLOSED 상태가 됩니다.

 


사실 오늘은 소켓의 연결과 종료 과정을 알아보았지만, 제일 다루고 싶었던 부분은 TIME_WAIT에 대한 내용이에요!

 

다음에는 TIME_WAIT과 관련된 내용들에 대해 알아 보도록 하겠습니다.

 

곧 다시 만나요 베빠!!

댓글