(一) TCP 协议之数据报

453 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

TCP 协议是一种面向连接的、可靠的、基于字节流的传输层通信协议。TCP 是为了在不可靠的互联网络上提供可靠的端到端字节流而专门设计的一个传输协议。

应用层向TCP层发送用于网间传输的、用8位字节表示的数据流,然后TCP把数据流分区成适当长度的报文段)。然后TCP把报文段传给IP层,由它来通过网络将包传送给接收端实体的TCP层。

1. 报文段

TCP 协议传输数据的单元称为报文段。一个TCP报文段 = TCP首部 + TCP数据。

IP 协议传输数据的单元是数据报,IP 数据报 = IP 首部 + IP 数据部分(整个 TCP 报文段)。

TCP 报文段格式如下:

img

(图片来源于网络)

2. TCP 头部

TCP 头部是20字节(不包括选项,选项的长度不定)。TCP 头部带选项的话,可以有60字节的长度。

  • 头部中的源端口号和目的端口号:指明的是连接的双方的端口号。IP 数据报头部中包含的源IP地址和目的IP地址。两个IP地址和端口号唯一标识了一个连接。一个IP地址和端口号有时被称为一个端点(endpoint)或套接字(Socket)。所以,每个TCP连接由一对套接字或端点(四元组)唯一标识。

  • 序列号:是一个32位的无符号数,从0 \longrightarrow 23212^{32}-1 \longrightarrow 0。TCP 传输过程中报文段携带的数据,序列号可以标识该数据的第一个字节。TCP 会给每个字节一个序列号。初始序列号是随机选择的,会随时间而改变。

  • ACK:确认号,它的值是接收方(也是发送ACK的一方)希望接收的下一个序列号。所以,可以用于除了初始和末尾报文段的其他报文段。发送一个 ACK 和发送一个 TCP 报文段是一样的,所用的开销也一样。

  • 选项:选项长度可以达到40字节。常见的选项有最大段的大小,时间戳,窗口缩放,选择性ACK等。

3. TCP 数据

TCP 数据是携带要传输的数据。TCP 数据部分的长度计算如下:

IP数据报长度IP数据包首部(20字节或40字节)TCP报文段首部(20字节)IP 数据报长度 - IP 数据包首部(20字节或40字节) - TCP报文段首部(20字节)

在 IP 数据报中,有一个字段是总长度,表示数据报的总长度是多少(以字节位单位),它是一个16位的字段。所以IP数据报的最大长度是 2161=655352^{16}-1=65535 字节。然后可以计算出 TCP 数据部分的最大长度。所以,

如果是Ipv4 协议,IP数据包首部是20字节,那么 TCP 数据部分的最大长度是 65535-20-20 = 65495 (字节);

如果是Ipv6 协议,IP数据包首部是40字节,那么 TCP 数据部分的最大长度是 65535-40-20 = 65475 (字节);

IP 数据报16位为什么是 21612^{16}-1 ??

因为16位的二进制表示的最大数是16个1,也就是 1+21+22+...+215=21611 + 2^{1} + 2^{2} + ... + 2^{15} = 2^{16} - 1