TCP协议报文结构

TCP是什么

TCP(传输控制协议)是一种面向连接的、可靠的、全双工的传输协议。它使用头部(Header)和数据(Data)来组织数据包,确保数据的可靠传输和按序传递。

TCP协议报文结构

下面详细阐述TCP协议的结构:

在这里插入图片描述

  1. 源端口号目的端口号:占用2个字节,分别表示发送方和接收方的端口号。
  2. 序列号:占用4个字节,用于标识TCP报文段中的第一个数据字节在整个数据流中的位置。
    序列号是用于数据按序传递的关键。
  3. 确认号:占用4个字节,用于回复对方的序列号,表示期望接收的下一个数据字节的序列号。确认号实现了可靠传输的机制。
  4. 4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4 = 60
  5. 数据偏移:占用4位,表示TCP头部的长度,以4字节为单位。因此,数据偏移的值乘以4等于TCP头部的总长度。
  6. 保留位:占用6位,保留为未来使用,置为0。
  7. 标识位:TCP头部中有6个标识位,分别是:
    • URG: 紧急指针是否有效
    • ACK: 确认号是否有效
    • PSH: 提示接收端应用层立刻从TCP缓冲区读走数据;实际上,在OS层,其作用是让sockfd对应的文件数据处于就绪状态,从而避免其在TCP中继续等待更多的数据。
    • RST: 对方要求重新建立连接; 我们把携带RST标识的称为复位报文段
    • SYN: 请求建立连接; 我们把携带SYN标识的称为同步报文段
    • FIN: 通知对方, 本端要关闭了, 我们称携带FIN标识的为结束报文段
  8. 窗口大小:即滑动窗口占用2个字节,表示接收方允许发送方发送的数据量,用于流量控制。
  9. 校验和:占用2个字节,用于检测TCP头部和数据的传输是否出错。TCP使用校验和来保证数据的完整性,发送端填充, CRC校验. 接收端校验不通过, 则认为数据有问题. 此处的检验和不光包含TCP首部, 也包含TCP数据部分.
  10. 紧急指针:占用2个字节,仅当URG标志位为1时有效,表示紧急数据的偏移量,即标识哪部分数据是紧急数据。
  11. 选项(可选):TCP头部中还可以包含一些可选的选项字段,用于扩展TCP功能。
  12. 数据(可选):TCP数据报中的实际数据部分。这个部分的长度可以是0到最大MTU(最大传输单元)减去TCP头部的长度。

TCP协议的结构使其能够提供可靠的数据传输和连接管理功能,适用于对数据可靠性要求较高的应用,如Web浏览器、电子邮件、文件传输等。

  • TCP选项字段是在TCP报文的报头中的一个特定位置,用于扩展TCP功能。选项字段的长度是可变的,可以根据具体选项内容的大小动态调整。

    例如:

struct tcphdr {
    uint16_t source;
    uint16_t dest;
    uint32_t seq;
    uint32_t ack_seq;
    uint16_t doff;  // 数据偏移,用于标识TCP头部的长度
    uint16_t window;
    uint16_t check;
    uint16_t urg_ptr;
    uint32_t options[];  // 这里是选项字段,大小可变。使用柔性数组实现选项字段,\
    其好处是可以在不浪费额外空间的情况下,灵活地传递选项信息。当TCP报文不需要携带选项时,选项字段可以省略,\
    不占用额外的空间。而当TCP报文需要携带选项时,柔性数组允许动态分配选项内容的空间,以适应具体的选项需求。
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FINS(Factory Interface Network Service)是一种基于TCP/IP的通信协议,用于PLC(Programmable Logic Controller,可编程逻辑控制器)与上位机之间的通信。FINS协议采用了TCP作为传输层协议,并使用了自定义的应用层协议。 FINS协议TCP报文结构如下: | 字段 | 长度(字节) | 描述 | | :----------: | :------------: | :---------------------------------------------------------: | | 代码 | 1 | 协议版本、数据类型和数据长度 | | 目标节点 | 1 | 目标节点地址 | | 目标单元 | 1 | 目标单元地址 | | 源节点 | 1 | 源节点地址 | | 源单元 | 1 | 源单元地址 | | 服务代码 | 2 | 请求或响应服务代码 | | 命令码 | 2 | 请求或响应命令 | | 数据长度 | 2 | 数据长度 | | 数据 | 数据长度(可变) | 请求或响应数据 | | FCS(校验码) | 2 | 用于检验数据的完整性,由数据段的每个字节按位异或得到的16位值 | 其中,代码字段包括协议版本、数据类型和数据长度。协议版本指FINS协议的版本号,数据类型指请求或响应数据类型,数据长度指数据段的长度。目标节点和目标单元字段指目标PLC的节点地址和单元地址,源节点和源单元字段指本PLC的节点地址和单元地址。服务代码和命令码字段指服务请求或响应的类型和具体命令,数据长度字段指数据段的长度,数据字段存储请求或响应的具体数据。最后,FCS字段是用于检验数据的完整性的校验码,由数据段的每个字节按位异或得到的16位值。 以上是FINS协议TCP报文结构解析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值