개발놀이터

TCP 3 way handshake 본문

CS 지식/네트워크

TCP 3 way handshake

마늘냄새폴폴 2023. 3. 25. 02:12

이번 포스팅에서는 TCP 3 way handshaking에 대해서 알아보도록 하겠습니다. TCP 3 way handshake는 두개의 장치가 연결을 수립하고 해제하는 단계인데요. 이렇게 통신 하는 것이 통신에대한 신뢰성이 올라가기 때문입니다. 

 

이름이 handshake인 이유는 두 사람이 지인으로 발전하게 되는 첫 단계가 악수이기 때문이지 않을까 하는 개인적인 생각입니다. 

 

그럼 시작해보죠!

 

 

TCP 3 way handshake

3 way handshake는 서버와 클라이언트가 연결하는 TCP / IP 네트워크 매커니즘입니다. 실제 데이터가 오가기 전에 클라이언트와 서버가 Synchronization과 Acknowledgment 패킷을 주고받는 과정이라고 생각하시면 됩니다.

 

TCP Segment 구조

모든 TCP Segment는 헤더필드와 데이터필드로 나눠져 있습니다. 

 

헤더 필드는 20에서 60바이트의 크기로 설정할 수 있고 기본값은 20바이트입니다. 하지만 원한다면 60바이트로 설정할 수 있죠. 

 

이제 각 요소에 대해서 자세히 알아보도록하죠

 

Header Fields

  • Source port : Source port는 16비트 필드이고 이 필드는 데이터를 보내는 애플리케이션의 포트주소가 적혀있습니다. 
  • Detination Port : Destination Port는 Source port와 다르게 데이터를 받는 애플리케이션의 포트주소가 적혀있습니다. 
  • Sequence Number : Sequence Number 는 바이트의 트랙을 유지하기위해 사용됩니다. TCP 스트림 안에서 각각의 바이트는 TCP sequence number에 의해 유니크하게 식별됩니다. 
  • Acknowlegment Number : 이 필드는 acknowledgment number나 받는 사람이 다음으로 받기로 예측되는 숫자를 포함하고 있습니다. 이 필드는 이전 데이터를 성공적으로 받았다는 것에 대한 인지로서 작동합니다. 
  • Header Length (HLEN) : header length는 TCP header의 길이가 들어있습니다. 이렇게 헤더의 길이를 넣음으로서 어디가 실제 데이터의 크기인지 인지할 수 있게 해줍니다. 
  • Flags : 플래그는 여섯가지의 요소가 있는데요
    • URG : URG는 urgent pointer를 나타내고 만약 URG가 세팅되어있으면, 이 데이터는 굉장히 긴급하게 보내야하는 데이터라는 뜻입니다. 
    • ACK : 이게 흔히 TCP 3 way handshake를 공부하면 나오는 ACK 플래그입니다. ACK 플래그는 acknowledgment 필드를 나타내고 만약 0으로 세팅되어있으면 이 데이터 패킷은 acknowledgment를 포함하고 있지 않는 것입니다. 
    • SYN : 이것도 흔히 알려진 플래그이죠. SYN 플래그는 호스트 사이에 연결을 시작하는 혹은 수립하기위한 플래그입니다. 만약 SYN 플래그가 세팅되어있다면 이 디바이스는 안전한 연결을 수립하기를 원하는 것입니다. 
    • RST : RST 플래그는 연결을 재시작하기위한 플래그입니다. 이 플래그가 세팅되어있으면 연결을 재시작 하고싶다는 의미입니다. 
    • PSH : 만약 PSH 필드가 세팅되어있으면 데이터를 받는 장치는 버퍼링 없이 받는 애플리케이션에 다이렉트로 push하기를 요청됩니다. 
    • FIN : 이 FIN 플래그는 연결을 해제하고 싶을 때 사용합니다. 만약 FIN 플래그가 1로 세팅되어있으면 이 장치는 연결을 해제하기를 원하는 것입니다. 
    • Checksum : checksun은 숫자들의 순서이거나 데이터에서 에러를 감지하기위해 사용되는 문자들입니다. 16비트로 설정되어있고 UDP 통신에서는 필수가 아니지만 TCP / IP 통신에서는 필수적으로 세팅해야하는 플래그입니다.
    • Window size : window size는 16비트인 필드이고 이 필드는 받는 사람이 수용할 수 있는 데이터의 크기를 나타냅니다. 
    • Urgent pointer : 위의 URG 플래그가 가리키는 필드입니다. 만약 URG 플래그가 1로 세팅되어 있다면 해당되는 필드이고 받는 사람이 가능하면 빨리 받아야하는 경우에 이 필드를 활성화시킵니다. 

 

TCP 3 way handshake의 과정

설명할 이 세가지 단계는 TcP에서 연결을 수립하기위해 사용되는 순서입니다. 

 

1. 클라이언트가 SYN 메시지를 서버에 보낸다 : 클라이언트가 서버와 연결되기위해 요청할 때 SYN 플래그를 1로 세팅합니다. 이 SYN 메시지에는 아래의 요소들이 포합되어있습니다.

  • sequence number (이 sequence number는 난수로 세팅됩니다. 그 이유는 기존 요청과 구분하기 위해서입니다)
  • ACK 패킷
  • window size
  • 최대 segment size => 예를 들어서 window size (받는 사람이 수용할 수 있는 크기) 가 3000비트이고 최대 segment size가 300이면 연결은 최대 10개의 segment로 만들어져 보낼 수 있습니다. segment는 "조각" 정도로 해석하시면 됩니다.

2. 서버가 SYN 메시지에 대한 응답으로 SYN과 ACK 패킷을 클라이언트에 보낸다 : SYN요청을 받은 후에 서버는 클라이언트에게 ACK 플래그를 1로 바꿈으로써 인지했다는 패킷을 보냅니다. 이때 ACK 패킷은 기존에 받았던 SYN 메시지의 sequence number에 1을 더한 숫자를 부여합니다. 

 

예를 들어서 SYN 패킷의 sequence number가 2000이었다면 ACK 패킷은 20001을 전달해줍니다. 그리고 서버는 클라이언트에게 서버의 window size와 최대 segment size를 알려줍니다. 

 

이 단계가 모두 끝나면 클라이언트와 서버는 연결이 수립된 단계라고 볼 수 있습니다. 

 

3. 클라이언트가 ACK 패킷을 서버에 보냄 : 클라이언트는 ACK 플래그를 1로 세팅하고 서버의 SYN 메시지 안에 있는 sequence number에 1을 더한 값을 보냅니다. 이미 SYN 패킷으로 연결이 수립되었기 때문에 SYN 플래그는 0으로 세팅하고 ACK 패킷을 서버로 보냅니다. 

 

앞선 세가지 단계를 도식화하면 다음과 같습니다.

 

 

정리하자면 SYN 패킷은 "우리 연결하자~" 라는 의미이고 ACK 패킷은 "어 연결 됐어~" 라는 의미라고 생각하시면 되겠습니다. 

 

 

3 way handshake 연결 해제

대부분의 오늘날 연결 해제는 3 way 혹은 4 way로 이루어집니다. 제가 소개해 드리는 연결 해제 방식은 3 way handshake입니다. 

 

1. 클라이언트는 FIN 메시지를 서버에 보낸다 : 클라이언트가 네트워크와 연결을 해제해야겠다고 결정할 때, 클라이언트는 서버에 난수를 FIN 메시지에 담아 보내고 FIN 플래그를 1로 ACK 플래그를 0으로 세팅해서 보냅니다. 

 

2. 서버는 응답으로 FIN 패킷과 ACK 패킷을 클라이언트에 보낸다 : 서버가 요청을 받은 후에 클라이언트의 해제 요청에 인지했다는 뜻으로 ACK 플래그를 1로 세팅하고 ACK 패킷을 보냅니다. 연결을 수립할 때와 마찬가지로 ACK 패킷에는 FIN 메시지에 있는 시퀀스 넘버에 1을 더한 값으로 ACK 패킷을 보내게 됩니다. 

 

만약 서버가 연결을 해제해야겠다고 결정했으면 FIN 플래그를 1로 세팅하고 클라이언트에 보냅니다. 이 단계가 끝나고 나면 클라이언트와 서버는 연결을 해제가 됩니다. 

 

3. 클라이언트가 ACK 패킷을 서버에 보낸다 : 클라이언트는 ACK 플래그를 1로 세팅하고 ACK 패킷을 보냅니다. 이 ACK 패킷역시 앞에서 보낸 FIN 메시지에 있는 시퀀스 넘버에 1을 더한 값을 보냅니다. 

 

앞선 세 단계를 도식화하면 다음과 같습니다. 

 

 

연결 해제의 단계를 3 way 가 아닌 4 way로 알고 계신 분들이 계신데 3 way와 4 way는 FIN + ACK을 두개로 쪼개냐 안쪼개냐 차이이기때문에 둘이 같은 연결 해제 방식이라고 생각하시면 됩니다. 

 

3 way 를 4 way 로 해제하면 다음과 같습니다. 

 

 

 

여기까지 TCP 3 way handshake에 대해서 알아봤습니다. 저는 기존에 3 way handshake에 대해서 알고 있었는데 이렇게까지 자세히 알지는 못했던 것 같습니다. SYN 패킷과 ACK 패킷을 주고 받는다는 것 정도까지만 알고 있었지 header와 flag에 대해서는 전혀 알지 못했던 것 같네요. 

 

글은 여기서 마치도록 하고 오늘도 즐거운 하루 보내시길 바라겠습니다. 저는 다음 포스팅에서 찾아뵙겠습니다. 

 

 

 

출처

https://www.scaler.com/topics/computer-network/tcp-3-way-handshake/

 

What is TCP 3 Way Handshake? - Scaler Topics

This article provides an overview of the 3-way Handshake in TCP and various steps of it for establishing and terminating the connection between the client and server.

www.scaler.com

https://www.geeksforgeeks.org/why-tcp-connect-termination-need-4-way-handshake/

 

Why TCP Connect Termination Need 4-Way-Handshake? - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org