Computer Science/네트워크

[네트워크] TCP - Segment Structure

바보1 2023. 4. 17. 22:25

앞의 글을 읽으시면 이해에 도움이 됩니다.

 

2023.04.17 - [Computer Science/네트워크] - [네트워크] TCP - Connection-Oriented Transport

 

[네트워크] TCP - Connection-Oriented Transport

앞의 글을 읽으시면 이해에 도움이 됩니다. 2023.04.15 - [Computer Science/네트워크] - [네트워크] Transport-Layer Protocols [네트워크] Transport-Layer Protocols 앞의 글을 읽으시면 이해에 도움이 됩니다. 2023.04.07

hi-guten-tag.tistory.com


1. TCP Segment Structure

 

 

출처 : Computer Networking 3장. Figure 3.29

  • TCP는 헤더와 데이터 필드로 나뉘어 있습니다.
  • 이전 글에서도 언급했듯이, 세그먼트의 데이터의 영역은 MSS에 의해 제한됩니다.
  • 만약 TCP가 큰 파일을 옮겨야 한다면, MSS의 사이즈에 맞게 파일을 쪼개서 전송합니다.
  • UDP와 마찬가지로 TCP도 source and destination port number를 적어놓았습니다. 또한 checksum도 있습니다.
  • TCP는 추가로 아래와 같은 영역을 가집니다.
  • 32-bit sequence number field와 32-bit Acknowledgement number field는 Reliable Data Transfer을 위해 구현되어 있습니다.
  • 16-bit Receive Windowflow control을 위해 사용됩니다. 수신 측의 상태를 확인하고, 수신 측의 버퍼에 남아있는 용량이 됩니다. 다만 해당 공간은 16-bit이므로 최대 2*16 바이트만 나타낼 수 있는 것이 아닙니다. ∂ * 2^16에 해당하는 ∂를 전송합니다.
  • 4-bit header length field에는 TCP header의 길이를 적어놓습니다. TCP header의 길이는 TCP option field에 의해 가변적이기 때문에 어디가 데이터의 시작인지 알려줘야 합니다. 다만 4비트로는 최대 15의 길이까지 알려줄 수 있습니다. 따라서 해당 필드는 4바이트 단위로 표시됩니다. 일반적으로 TCP header는 최소 20 바이트이므로, 해당 필드는 최소 5 이상이 됩니다.
  • UDP의 Length Field와는 다른 점은 UDP는 전체 세그먼트의 길이를 나타내지만, TCP는 Header의 길이만을 나타냅니다.
  • 가변적이고, 선택적인 options field는 MSS 혹은 window scaling factor를 타협할 때 사용됩니다. 이 외에도 다양한 옵션이 있습니다.
  • flag field는 6-bit로 이루어져 있고, ACK bit는 Acknowledgment를 나타내기 위해 사용됩니다. 해당 비트가 유효하다면 Acknowledgment number에 있는 숫자 직전까지 잘 받았다는 의미가 됩니다.
  • 또한 RSTSYNFIN은 각각 리셋, 통신 요청, 통신 종료에 해당합니다.
  • PSH는 수신자가 데이터를 상위 계층으로 즉시 올려야 한다는 것을 의미합니다.
  • URG는 세그먼트에 있는 데이터에 긴급한 데이터가 있다는 것을 알려줍니다.
  • 16-bit urgent data pointer field는 긴급한 데이터의 마지막 바이트를 가리킵니다.

2. Sequence Number

 

 

출처 : Computer Networking 3장. Figure 3.31

  • TCP 세그먼트 헤더에서 가장 중요한 필드 두 가지는 바로 Sequence NumberAcknowledge Number입니다.
  • 해당 필드는 TCP의 Reliable Data Transfer을 위해 가장 중요한 부분입니다.
  • TCP는 데이터를 Byte Stream으로 보는데, Sequence Number는 전송된 바이트의 스트림에 대해서라는 관점을 반영한 것입니다.
  • 세그먼트에 대한 Sequence Number는 세그먼트의 페이로드에 있는 첫 번째 바이트의 스트림 번호입니다.
  • 예를 들어 500,000 바이트의 데이터를 보내야 하는데, 하나의 세그먼트에는 1000 바이트만 담을 수 있다고 가정해 봅시다.
  • 첫 번째 세그먼트의 Sequence Number는 0이 될 것이고, 두 번째 세그먼트의 Sequence Number는 1000이 됩니다.
  • 이런 방식으로 TCP 세그먼트 헤더의 Sequence Number가 할당됩니다.

3. Acknowledge Number

 

 

  • Acknowledge Number는 위의 Sequence Number에 대해 반응하기 위한 번호입니다.
  • 프로세스 B가 A에게 TCP 세그먼트를 보냈을 때, A는 이를 반응하기 위하여 B에 있는 Sequence Number의 다음 바이트에 해당하는 번호를 Acknowledge Number로 입력하여 보냅니다.
  • 예를 들어 B가 A에게 0~535까지 번호가 붙은 바이트를 송신했다고 가정해 봅시다.
  • 그러면 A는 536을 기다리고 있으므로 Acknowledge Number Field에 536을 삽입하고 B에게 송신합니다.

4. Example

 

 

  • A는 B로부터 0~535 바이트를 포함하는 세그먼트와 900~1000 바이트를 포함하는 세그먼트를 수신받았다고 가정해 봅시다.
  • 536~899까지의 바이트는 아직 수신받지 못한 상황입니다.
  • TCP는 Cumulative Acknowledge를 사용하므로 536을 Acknowledge Number에 넣어서 B에게 송신합니다.
  • 확실히 어떤 문제가 발생해서 데이터가 순서에 맞지 않게 도착한 모습을 볼 수 있습니다.
  • 이때 두 가지 방법이 있습니다.
    • 900~1000 바이트에 해당하는 세그먼트를 버리고 536부터 1000까지 기다린다.
    • 순서가 바뀐 데이터를 보유하고, 빈 공간에 잃어버린 데이터를 채우기 위해 기다린다.

 

  • 실제로는 두 번째 방법이 네트워크 대역폭 관점에서 더 효율적이며 실전에서 사용한다고 합니다.

참고

 

 

경북대학교 컴퓨터학부 COMP0414-001 컴퓨터 망 수업

Computer Networking: A Top Down Approach / James F. Kurose, Keith W. Ross 저 / PEARSON / 2021년

Chat GPT, Bing AI


다음 글에서는 RTT Estimation and Timeout에 대해 알아보겠습니다.

감사합니다.

지적 환영합니다.