TCP 3-way 와 4-way Handshake

공부/Network

TCP 3-way 와 4-way Handshake

해리누나 2024. 6. 23. 17:40
반응형

 

연결형 통신

TCP는 신뢰성 있는 데이터 전송을 보장하기 위해 여러 기능들을 제공하는 전송 계층의 연결 지향적 포로토콜이다.  TCP를 통해 데이터를 주고 받기 위해서는 먼저 클라이언트와 서버간에 연결이 수립되어야 한다. (클라이언트-서버 간 통신에 자주 사용되는 HTTP도 TCP 기반으로 동작함.) 어떠한 과정을 통해 TCP 연결이 맺어지는지 살펴보자.

 

1. 3-way handshake

3-way handshake

TCP 3-way handshake를 통해 클라이언트와 서버간의 연결(커넥션)이 성립되는 것이다. 안전한 통신을 위해 서로 얼마만큼의 데이터를 송수신 및 처리할 수 있는지 알아야해서 TCP 3-way handshake 과정 중 윈도우 크기(Window Size)와 최대 세그먼트의 크기(MMS, Maximum Segment Size)를 정해진다. 윈도우 크기는 흐름 제어에 중요한 역할을 하며, MSS는 네트워크를 통해 전송할 수 있는 최대 데이터의 양을 결정한다.

 

❶  클라이언트가 통신을 하려면 먼저 허가를 받아야 하므로, 서버에 연결을 요청하는 SYN 플래그가 설정된 TCP 세그먼트를 보낸다. (이는 SYN 필드의 비트가 1로 설정된 세그먼트로, 애플리케이션의 데이터는 포함되지 않는다. 즉, 이는 연결 설정을 위한 신호일 뿐 데이터 전송을 위한 것은 아니다.) 클라이언트는 이 SYN 세그먼트의 헤더에 초기 시퀀스 번호(ISN, Initial Sequence Number / 그림에선 'a'로 표기)를 포함시킨다. 이 초기 시퀀스 번호는 랜덤으로 선택되며, 나중에 데이터 전송의 순서를 추적하고 제어하기 위해 사용된다. 클라이언트는 SYN 세그먼트를 보낸 후 SYN_SENT 상태가 된다. (서버 응답 기다리는 중~)

 

❷ 서버는 SYN 세그먼트를 받아 SYN_RCVD 상태로 전환되고, 해당 클라이언트와의 TCP 통신에서 사용할 버퍼 및 변수(윈도우 사이즈 등)를 초기화한다. 응답으론 SYN과 ACK의 필드 비트가 1로 설정된 세그먼트를 클라이언트에 전송한다. (SYN-ACK). 이 SYN-ACK 세그먼트에 Sequence Number 필드에는 랜덤으로 설정된 자체 초기 시퀀스 번호(server_isn = b)를 담고 Acknowledgement Number 필드에는 클라이언트로부터 받은 client_isn 값에 1을 더해 담는다 (a+1). 이 세그먼트에도 애플리케이션 데이터가 포함되지 않는다.

 

❸ 서버로부터 응답을 받은 클라이언트는 해당 서버와의 TCP 통신에서 사용할 버퍼 빛 변수를 초기화한다. 그리고 ACK 플래그가 설정된 세그먼트로 서버에 확인 응답을 보낸다. (이 세그먼트의 ACK 번호는 server_isn + 1로 설정된다. /  'b + 1') 클라이언트의 상태는 ESTABLISHED로 바뀌며, 이제 TCP 연결이 완전히 설정된 상태다. 연결이 설정된 후에는 클라이언트가 서버에 ACK 세그먼트를 전송할 때, 애플리케이션 데이터를 포함해 전송할 수 있다.

 

❹ 클라이언트로부터 ACK 세그먼트를 받은 서버는 ESTABLISHED 상태로 전환되고 클라이언트와 맺은 TCP 연결을 통해 데이터를 주고 받을 수 있게 된다.

 

3-way handshake는 이처럼 클라이언트와 서버가 서로 통신할 준비가 되어있는지를 확인함과 안정적인 연결 확립을 위해 사용된다.

 

 

2. 4-way handshake

TCP 연결을 종료할 때엔 4 - way handshake 방식을 사용하여 연결을 종료한다. TCP 연결을 맺은 클라이언트나 서버 누구라도 연결을 종료할 수 있으며, 아래 그림 예시는 클라이언트가 먼저 종료 요청을 보낼때의 모습이다.

 

4-way handshake

❶ TCP 연결 종료를 위해 클라이언트가 FIN 플래그가 설정된 세그먼트를 서버에 전송하고 FIN_WAIT1 상태로 된다.

 

❷ FIN 세그먼트를 받은 서버는 ACK 플래그가 설정된 세그먼트를 전송하여 FIN 세그먼트를 받았음을 확인시킨다. 서버는 이 확인 응답을 보낸 후 CLOSE_WAIT 상태가 된다. 서버로부터 ACK 세그먼트를 받은 클라이언트는 FIN_WAIT_2 상태가 된다.

 

❸ 이후 서버에서 연결을 종료할 준비가 완료되면 (이전에 수행되고 있는 통신(데이터 전송)이 완전히 끝나면), FIN 플래그가 설정된 세그먼트를 보내고 LAST_ACK 상태로 전환한다.

 

❹ 서버로부터 FIN 세그먼트를 받은 클라이언트는 서버에게 ACK 플래그가 설정된 세그먼트를 보내 응답하고 TIME_WAIT 상태로 바뀐다.

 

❺ 클라이언트로부터 ACK 세그먼트를 받은 서버는 CLOSED 상태가 된다.

 

❻ TIME_WAIT 상태인 클라이언트는 일정 시간(기본값: 240초)동안 기다린 후 연결을 종료하게 된다. 일정 시간동안 기다렸다가 종료하는 이유는, ACK 세그먼트가 유실되었을 경우를 대비하기 위해서다.

  • 만약 클라이언트가 ACK를 전송하자마자 연결을 종료하면, 이 ACK 세그먼트가 유실될 경우에 서버는 FIN 세그먼트에 대한 ACK를 받지 못한거니 다시 FIN 세그먼트를 전송하게 된다.
  • 클라이언트가 이미 연결을 종료한 상태에서는 이 FIN 세그먼트를 받아들이지 못해, 서버는 계속해서 FIN 세그먼트를 재전송하게 된다.
  • 따라서 이를 방지하고자 ACK 세그먼트를 보낸 후 일정 시간 기다렸다가 최종적으로 TCP 연결을 종료하는 것이다.

 

❼ TCP 연결이 완전히 종료되면 TCP 통신을 위해 할당되었던 모든 자원의 할당 해제가 이뤄진다.

 

 

 

 

 

단어

커넥션: TCP 통신에서 정보를 전달하기 위해 사용되는 가상의 통신로로 연결을 확립하고 데이터를 전송함.

 

참고

책: 10일만에 배우는 네트워크 기초, 모두의 네트워크 | 미즈구치 카츠야 | 이승룡 옮김

https://qpar.tistory.com/4

https://velog.io/@leeesangheee/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC.-TCP-3-way-Handshake

https://jaehyeon48.github.io/network/tcp-three-way-handshake/

https://steadiness.dev/tcp-basics/#tcp-3-way-handshake

 

 

 

 

 

 

 

 

 

728x90
반응형