앞의 글을 읽으시면 이해에 도움이 됩니다.
2023.04.17 - [Computer Science/네트워크] - [네트워크] TCP - Connection-Oriented Transport
1. TCP Segment Structure
- 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 Window는 flow 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에 있는 숫자 직전까지 잘 받았다는 의미가 됩니다.
- 또한 RST, SYN, FIN은 각각 리셋, 통신 요청, 통신 종료에 해당합니다.
- PSH는 수신자가 데이터를 상위 계층으로 즉시 올려야 한다는 것을 의미합니다.
- URG는 세그먼트에 있는 데이터에 긴급한 데이터가 있다는 것을 알려줍니다.
- 16-bit urgent data pointer field는 긴급한 데이터의 마지막 바이트를 가리킵니다.
2. Sequence Number
- TCP 세그먼트 헤더에서 가장 중요한 필드 두 가지는 바로 Sequence Number와 Acknowledge 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에 대해 알아보겠습니다.
감사합니다.
지적 환영합니다.
'Computer Science > 네트워크' 카테고리의 다른 글
[네트워크] TCP - RTT Estimation and Timeout (0) | 2023.05.03 |
---|---|
[네트워크] TCP - Connection-Oriented Transport (0) | 2023.04.17 |
[네트워크] Selective Repeat (SR) (0) | 2023.04.17 |
[네트워크] Go-Back-N (GBN) (0) | 2023.04.17 |
[네트워크] Pipelined Reliable Data Transfer Protocols (0) | 2023.04.17 |