22、TCP 报文的格式,字段的意义

本文深入探讨了TCP报文段的组成,包括首部和数据两部分,详细解释了每个字段的意义及其作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCP报文段分为首部和数据两部分。


     TCP报文段首部的前20个字节是固定的,后面有4N字节是根据需要而增加的选项(N是整数)。因此TCP首部的最小长度是20字节。
首部固定部分各字段的意义如下:
  • 源端口和目的端口:各占2个字节,分别写入源端口号和目的端口号。
  • 序号:占4个字节。序号使用mod运算。TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号。故该字段也叫做“报文段序号”。
  • 确认序号:占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号。若确认序号=N,则表明:到序号N-1为止的所有数据都已正确收到。
  • 数据偏移:占4位,表示TCP报文段的首部长度。注意,“数据偏移”的单位是32位字(即以4字节长的字为计算单位)。故TCP首部的最大长度为60字节。
  • 保留:占6位,保留为今后使用,目前置为0;
  • 紧急URG:当URG=1,表明紧急指针字段有效。这时发送方TCP就把紧急数据插入到本报文段数据的最前面,而在紧急数据后面的数据仍是普通数据。
  • 确认ACK:当ACK=1时,确认字段才有效。当ACK=0时,确认号无效。TCP规定,在连接建立后所有传送的报文段都必须把ACK置1。
  • 推送PSH:接收方TCP收到PSH=1的报文段,就尽快地交付给接收应用进程,而不再等到整个缓存都填满了后再向上交付。
  • 复位RST:当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立运输连接。
  • 同步SYN:在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文段。对方若同意建立连接,则应在响应的报文段中使SYN=1和ACK=1。故SYN置为1,就表示这是一个连接请求和连接接收报文。
  • 终止FIN:用来释放连接。当FIN=1时,表明此报文段的发送方的数据已发送完毕,并要求释放运输连接。
  • 窗口:占2个字节。窗口值作为接收方让发送方设置其发送窗口的依据。
  • 检验和:占2字节。检验和字段检验的范围包括首部和数据这两部分。和UDP数据报一样,在计算检验和时,也要在TCP报文段的前面加上12字节的伪首部。伪首部的格式与UDP用户数据报的伪首部一样,但要将伪首部第四个字段中的17 改为6(协议号),把第5字段中的UDP长度改为TCP长度。
  • 紧急指针:占2字节。紧急指针仅在URG=1时才有意义,它指出本报文段中的紧急数据的字节数。
### TCP 报文格式详解 TCP 报文段的结构由固定部分和可选部分组成,其具体字段如下: #### 1. 源端口号(Source Port) - 长度:16 比特 - 功能:标识发送方的应用程序端口。 - 这一字段用于区分同一台主机上的不同应用程序[^1]。 #### 2. 目的端口号(Destination Port) - 长度:16 比特 - 功能:标识接收方的应用程序端口。 - 它确保数据能够正确传递到目标主机上的特定应用层服务[^1]。 #### 3. 序列号(Sequence Number) - 长度:32 比特 - 功能:表示本报文段中第一个数据字节的序列号。 - 在连接建立时,双方会协商初始序列号(ISN),之后每个字节的数据都会有一个唯一的序列号[^2]。 #### 4. 确认号(Acknowledgment Number) - 长度:32 比特 - 功能:当 ACK 标志位被设置为 1 时,该字段有效。它表示期望收到的下一个数据字节的序列号。 - 例如,如果确认号为 501,则意味着已成功接收到序列号为 500 的所有数据[^2]。 #### 5. 数据偏移(Data Offset) - 长度:4 比特 - 功能:表示 TCP 报头的长度,以 32 比特为单位。 - 如果没有选项字段,报头长度值为 5,即 20 字节;如果有选项字段,则长度会增加[^1]。 #### 6. 标志位(Flags) - 长度:6 比特 - 功能:控制 TCP 连接状态和数据传输行为。包括以下标志位: - URG:紧急指针是否有效。 - ACK:确认号字段是否有效。 - PSH:要求接收方立即提交数据给应用层。 - RST:强制终止异常连接。 - SYN:发起连接请求。 - FIN:关闭连接请求[^2]。 #### 7. 窗口大小(Window Size) - 长度:16 比特 - 功能:表示当前允许发送方发送的数据量,用于流量控制。 - 接收方通过调整窗口大小来通知发送方其缓冲区的可用空间。 #### 8. 校验和(Checksum) - 长度:16 比特 - 功能:用于检测 TCP 报文段在传输过程中是否发生错误。 - 校验范围包括伪头部、TCP 报头和数据部分[^1]。 #### 9. 紧急指针(Urgent Pointer) - 长度:16 比特 - 功能:仅在 URG 标志位为 1 时有效,表示紧急数据的结束位置。 - 它帮助接收方快速定位需要优先处理的数据[^1]。 #### 10. 选项字段(Options) - 长度:可变 - 功能:用于实现各种功能扩展,如最大分段长度(MSS)、时间戳等。 - 如果没有选项字段TCP 报头长度为 20 字节[^1]。 ```python # 示例:创建一个简单的 TCP 报文段结构 class TCPHeader: def __init__(self, source_port, destination_port, sequence_number, acknowledgment_number, flags, window_size, checksum, urgent_pointer): self.source_port = source_port self.destination_port = destination_port self.sequence_number = sequence_number self.acknowledgment_number = acknowledgment_number self.flags = flags self.window_size = window_size self.checksum = checksum self.urgent_pointer = urgent_pointer ``` ### 总结 TCP 报文段的结构设计充分考虑了可靠性和灵活性的需求。通过固定字段与可选字段的结合,TCP 能够支持复杂的网络通信场景[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值