欢迎大家订阅【计算机网络】学习专栏,开启你的计算机网络学习之旅!
文章目录
- 前言
- 1 TCP 报文段的基本结构
- 2 固定部分
- 2.1 源端口与目的端口
- 2.2 序号
- 2.3 确认号
- 2.4 数据偏移
- 2.5 保留字段
- 2.6 控制位
- 2.7 窗口
- 2.8 检验和
- 2.9 紧急指针
- 3 可变部分
- 3.1 选项
- 3.2 填充
前言
本篇文章详细分析了 TCP 报文段首部的结构,并介绍其各字段的作用与相关选项,进一步理解 TCP 如何在不可靠的网络环境中实现可靠的数据传输。
1 TCP 报文段的基本结构
TCP(传输控制协议)是现代计算机网络中重要的协议之一,主要负责在网络中提供可靠的字节流传输。尽管 TCP 本身是面向字节流的,但它通过报文段的方式进行数据的封装与传输。TCP 的所有控制和功能机制都体现在报文段的首部字段中。
TCP 报文段的首部由固定部分和可选部分组成。固定部分的长度为 20 字节,可选部分的长度可以变化,最大可达到 40 字节。
最小的 TCP 报文段首部长度为 20 字节,包含了实现数据传输所需的所有基本字段。
2 固定部分
2.1 源端口与目的端口
每个端口字段占 2 字节。端口号用于实现应用层协议和传输层协议之间的复用和分用。
- 源端口:发送端的端口号。
- 目的端口:接收端的端口号。
2.2 序号
序号占 4 字节。每个 TCP 连接中传输的数据字节都有一个唯一的序号。
序号字段表示当前报文段中数据部分的第一个字节的序号。在连接的初始阶段,序号从 1 开始递增。通过序号,接收方能够按序接收数据并确保数据完整性。
【示例】
2.3 确认号
确认号占 4 字节。当 ACK 控制位被设置为 1 时,确认号字段才有效。
确认号字段指示接收方期望收到的下一个字节的序号。
TCP规定,在建立连接后所有传送的TCP报文段都必须把ACK置为1。
如果确认号为 N,则说明接收方已经正确收到序号为 N-1 之前的所有字节。
2.4 数据偏移
数据偏移占 4 位。该字段指示 TCP 报文段中数据部分的起始位置,单位是 32 位字(即 4 字节)。
数据偏移字段告诉接收方,首部有多少字节,并指示数据部分的起始位置。
2.5 保留字段
保留字段占 6 位。该字段目前保留为 0,供将来使用。
TCP 报文段中的其他控制位没有对应字段时,保留字段可用于扩展。
2.6 控制位
控制位用于指示不同的连接控制操作和报文段的状态。
TCP 报文段有六个控制位,其中每个位的意义如下:
- URG(紧急):占 1 位。当 URG = 1 时,表示当前报文段包含紧急数据,系统应尽快处理该数据,具有较高优先级。
- ACK(确认):占 1 位。只有当 ACK = 1 时,确认号字段才有效。用于确认数据的接收。
- PSH(推送):占 1 位。当 PSH = 1 时,接收方会立即将接收到的数据交付给应用程序,而不是等到缓存满了再处理。
- RST(复位):占 1 位。当 RST = 1 时,表示连接发生错误或出现异常,需要复位连接。
- SYN(同步):占 1 位。同步 SYN = 1 表示这是一个连接请求或连接接受报文。;当 SYN = 1,ACK = 0 时,表明这是一个连接请求报文段;当 SYN = 1,ACK = 1 时,表明这是一个连接接受报文段。
- FIN(终止):占 1 位。当 FIN = 1 时,表示发送端已经完成数据传输,并要求释放连接。
2.7 窗口
窗口占2 字节。窗口字段指示接收方当前能接受的字节数。
接收方的窗口大小会随接收缓冲区的空闲情况动态调整,以告知发送方可以继续发送的数据量。窗口值的大小直接影响了 TCP 的吞吐量。
2.8 检验和
检验和占 2 字节。检验和字段用于检测 TCP 报文段中的数据是否发生错误。
检验和的计算不仅包括 TCP 报文段的内容,还包括一个临时的“伪首部”,该伪首部包含源 IP 地址、目的 IP 地址、协议类型等信息,用来确保数据的完整性。
2.9 紧急指针
紧急指针占 2 字节。当 URG = 1 时,紧急指针字段有效。该字段指示紧急数据的最后一个字节相对于报文段起始位置的偏移量。
紧急指针用于标识数据流中哪些部分应优先处理。
3 可变部分
3.1 选项
选项字段长度可变,最长可达 40 字节。
选项用于扩展 TCP 协议的功能,常见的选项包括:
- 最大报文段长度(MSS):TCP 协议中用于控制每个报文段数据字段最大长度的选项,计算方式为TCP 报文段长度 - TCP 首部长度。
- 窗口扩大因子(Window Scale):在标准 TCP 协议中,窗口字段为 16 位,窗口大小最大为 64KB,窗口扩大因子选项允许增加窗口大小,最多支持到 1GB。
- 时间戳(Timestamp):占 10 字节,包含时间戳值和时间戳回送字段,可用于计算往返时间 RTT以及防止序号重复。
3.2 填充
TCP 报文段的头部长度必须是 4 字节的整数倍。因此,如果选项字段长度不足 4 字节的倍数,填充字段会被添加到报文段的末尾。