【计算机网络】TCP 报文的组成,TCP 是如何实现可靠传输的?

在计算机网络中,传输控制协议(Transmission Control Protocol,简称 TCP)是一种面向连接、可靠的传输层协议,它确保数据能够在不可靠的网络环境中顺利传输。TCP 通过一系列复杂的机制实现了数据的可靠传输。本文将详细介绍 TCP 报文 的组成,并解释 TCP 是如何实现可靠传输的

1. TCP 报文的组成

TCP 协议的核心在于报文(Segment),它包含了头部和数据两部分。报文头部存储了用于控制和管理传输的关键信息,而数据部分则是需要传输的实际内容。

1.1 TCP 报文头部结构

TCP 报文头部的大小最小为 20 字节,其中包含了多个关键的字段。下图展示了 TCP 报文头部的组成:

偏移 0-3 4-7 8-15 16-31
0 源端口号(16位) 目标端口号(16位)
32 序列号(32位)
64 确认号(32位)
96 数据偏移(4位) 保留位(6位) 控制位(6位) 窗口大小(16位)
128 校验和(16位) 紧急指针(16位)
160 可选字段(若有) 数据

1.2 各字段解释

  • 源端口号(Source Port)目标端口号(Destination Port):标识发送端和接收端的应用程序。
  • 序列号(Sequence Number):用于标识数据段中的第一个字节,它确保数据包的顺序不变。
  • 确认号(Acknowledgment Number):表示下一个期望接收的字节序号,实现了 TCP 的可靠确认机制。
  • 数据偏移(Data Offset):指出 TCP 头部的长度,从而标识出数据段的起始位置。
  • 控制位(Control Bits):包含多个控制标志,例如 SYN、ACK、FIN、RST,用于连接的建立、终止和控制传输的状态。
  • 窗口大小(Window Size):流量控制的一部分,定义了接收方能够接收的数据量。
  • 校验和(Checksum):用于检验数据在传输过程中的完整性。
  • 紧急指针(Urgent Pointer):在标记紧急数据时有效,表示该段中紧急数据的结束位置。

1.3 可选字段

TCP 报文头部可以包括一些可选字段,常见的有时间戳、窗口扩展等,用于增强 TCP 的性能和可靠性。

2. TCP 实现可靠传输的机制

TCP 通过多种机制保证数据的可靠传输,下面将详细讲解其核心的几个机制。

2.1 三次握手建立连接

在 TCP 中,连接的建立过程称为 三次握手,这是确保客户端和服务器之间能够可靠通信的关键步骤。

  1. 第一次握手(SYN):客户端向服务器发送一个 SYN(同步序列号)报文,表示请求建立连接。
  2. 第二次握手(SYN-ACK):服务器收到 SYN 报文后,返回一个 SYN 和 ACK(确认序列号)报文,确认客户端的请求并同步自身的序列号。
  3. 第三次握手(ACK):客户端收到服务器的 SYN-ACK 报文后,发送一个 ACK 报文,表示确认建立连接。

三次握手的目的是确认双方的发送和接收能力都正常,并且初始化序列号,确保后续的数据传输能够正确进行。

// 三次握手示例代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>

int main() {
    
    
    int sockfd;
    struct sockaddr_in server_addr;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    server_addr.sin_addr.s_addr = inet_addr("192.168.1.1");

    connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr));
    printf("TCP三次握手建立成功!\n");

    close(sockfd);
    return 0;
}

2.2 四次挥手断开连接

TCP 使用 四次挥手 机制来断开连接,确保数据传输完成并释放资源。

  1. 第一次挥手(FIN):客户端发送 FIN 报文,表示不再发送数据。
  2. 第二次挥手(ACK):服务器收到 FIN 报文后,返回一个 ACK 报文,表示确认。
  3. 第三次挥手(FIN):服务器发送 FIN 报文,表示不再发送数据。
  4. 第四次挥手(ACK):客户端收到服务器的 FIN 报文后,返回一个 ACK 报文,表示确认断开连接。
// 四次挥手示例代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>
#include <unistd.h>

int main() {
    
    
    int sockfd;
    struct sockaddr_in server_addr;

    sockfd = socket(AF_INET, SOCK_STREAM, 0);

    server_addr.sin_family = AF_INET;
    server_addr.sin_port = htons(8080);
    server_addr.sin_addr.s_addr = inet_addr("192.168.1.1");

    // 发起关闭请求
    shutdown(sockfd, SHUT_WR); 
    printf("TCP四次挥手断开成功!\n");

    close(sockfd);
    return 0;
}

2.3 超时重传

TCP 通过超时重传机制确保数据能够可靠传输。每次发送数据后,TCP 会启动一个计时器,如果在指定的时间内没有收到确认报文,TCP 就会重新发送数据。

// 超时重传示例代码
setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &timeout, sizeof(timeout));

2.4 流量控制

TCP 通过 滑动窗口机制 实现流量控制。发送方通过接收方返回的窗口大小(即接收方的缓冲区空间大小),决定可以发送的数据量。

// 滑动窗口机制示例代码
int win_size = 1024;
setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &win_size, sizeof(win_size));

2.5 拥塞控制

TCP 拥有四种主要的拥塞控制算法:慢启动拥塞避免快重传快恢复。这些算法的目的是通过调整发送数据的速度来避免网络拥塞。

  • 慢启动:发送方会逐渐增加数据的发送速度,直到达到网络的拥塞点。
  • 拥塞避免:一旦检测到拥塞,发送方会降低发送速度并逐步增加。
  • 快重传快恢复:在收到多个重复的 ACK 时,发送方会立即重传丢失的数据包,而不是等待超时。
// 调整拥塞窗口示例代码
int congestion_ctrl = 1;
setsockopt(sockfd, IPPROTO_TCP, TCP_CONGESTION, &congestion_ctrl, sizeof(congestion_ctrl));

3. TCP 的可靠性特性总结

通过上述机制,TCP 实现了以下几个可靠传输的关键特性:

  • 连接建立与断开:通过三次握手和四次挥手确保连接的可靠建立与断开。
  • 确认与重传:TCP 使用超时重传和确认机制确保数据的完整性和正确传输。
  • 流量控制:通过滑动窗口机制,TCP 防止发送方发送过多数据导致接收方溢出。
  • 拥塞控制:TCP 调整数据的发送速度,避免网络拥塞。

4. 结语

通过本文的讲解,我们详细介绍了 TCP 报文的组成,并深入剖析了 TCP 是如何实现可靠传输的。TCP 的这些机制和特性使得它成为了可靠性较高的传输层协议,广泛应用于各种网络通信场景中。理解 TCP 的工作原理对于深入学习网络通信技术具有重要意义。

猜你喜欢

转载自blog.csdn.net/qq_42978535/article/details/143157208