网络:传输层 TCP报文格式解析

一、TCP报文格式


1、为了提供可靠的数据传输,TCP报文首部字段有较多的字段,TCP报文格式如下图:


图2 TCP报文格式

16位源和目标端口(16位):用于多路复用/多路分解来自或送至上层应用的数据,可以这样理解,端口用来标识同一台计算机的不同进程。

16位源端口号Source Port):16位的源端口字段包含初始化通信的端口号。源端口和IP地址的作用是标识报文的返回地址。

16位目的端口(Destination Port):16位的目的端口字段定义传输的目的。这个端口指明接收方计算机上的应用程序接口。

32位序列号和32位确认号

这两个字段是TCP可靠传输服务的关键部分,序列号是该报文段首字节的字节流编号(TCP把数据看成是有序的字节流,TCP隐式地对数据流的每个字节进行编号)。这样理解可能更直观,当报文被分解成多个报文段时,序列号就是报文段首字节在整个报文的偏移量。确定号指定下一个期待的字节

32位序列号(Sequence Number该字段用来标识TCP源端设备向目的端设备发送的字节流,它表示在这个报文段中的第几个数据字节。序列号是一个32位的数。

32位确认号(Acknowledge Number):TCP使用32位的确认号字段标识期望收到的下一个段的第一个字节,并声明此前的所有数据已经正确无误地收到,因此,确认号应该是上次已成功收到的数据字节序列号加1。收到确认号的源计算机会知道特定的段已经被收到。确认号的字段只在ACK标志被设置时才有效。


首部长度(4位)

因为选项是不定长的,这就需要标识整个首部字段的长度(单位是32位字),即5+选项个数。4位,单位是32位字,所以首部最长是15*4=60字节,即选项最长是40字节(10个选项)。

保留(6位)

6位值域,必须全0,为定义新的用途而保留。

6位标志

URG

指示报文段里存在着被发送方的上层实体标记为”紧急”数据,当URG=1时,其后的紧急指针指示紧急数据在当前数据段中的位置(相对于当前序列号的字节偏移量),TCP接收方必须通知上层实体。

ACK

当ACK=0时,表示该数据段不包含确认信息,当ACK=1时,表示该报文段包括一个对已被成功接收报文段的确认。

PSH

当PSH=1时,接收方在收到数据后立即将数据交给上层,而不是直到整个缓冲区满。

RST

用于重置一个已经混乱的连接(如主崩溃),也可用于拒绝一个无效的数据段或者拒绝一个连接请求。一般而言,如果你得到的数据段被设置了RST位,那说明你这一端有问题了。

SYN

用于建立连接过程,在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1

注:捎带是指对客户机到服务器数据的确认被装载在一个承载服务器到客户机的数据报文段中。

FIN

用于释放一个连接,表示发送方已经没有数据要传输了。此时,接收方可能继续接收数据,好在SYN和FIN数据段都有序列号,从而保证了这两种数据段以正确顺序被处理。

16位窗口大小

用于流控制(确保连接的任何一方都不会过快地发送过量的分组而淹没另一方),窗口大小指定了从被确认的字节算起可以发送多少个字节。

16位校验和

2个字节,校验的范围包括首部和数据两个部分,计算校验和时需要在报文段前加上12字节的伪首部。

16位紧急指针

参考标志字段的URG位。

选项

选项部分是为了适合复杂网络环境和更好地服务于应用层设计的。TCP选项最长是40字节(见下文)。

数据

无任何数据的TCP段也是合法的,通常用于确认和控制信息。

2 、选项字段[2]

TCP选项部分很好出现在已经建立连接的会话中,只要出现在TCP连接建立阶段,即三次握手。TCP选项部分实际运用有以下几种:

(1)最大报文传输段(MMS, Maximum Segment Size)

用于发送发与接收方协商最大报文段长度(仅仅是净荷数据,不包括TCP首部字段)。TCP在三次握手中,每一方都会通告期望收到的MSS(MSS只出现在SYN数据包中),如果一方不接受另一方的MSS值,则使用默认的536字节净荷数据,即主机能够接受20+536字节的TCP报文段。

(2)窗口扩大选项(Window scaling)

TCP报文的窗口大小字段占16位,即最大值是65535,但随着时延和带宽比较大的通信产生(如卫星通信),需要更大的窗口满足性能和吞吐率,这就是窗口扩大选项存在的意义。例子见参考资料[2]。

Windows scaling占3个字节,最后一个字节是移位值(Shift count),即首部的窗口位数16向左移动,如移位值为14,则新的窗口最大值增大到65535*(2^14)。

窗口扩大选项是在TCP建立之初进行协商,如果已实现了窗口扩大,当不再需要扩大窗口时,发送移位值=0就可以恢复到原窗口大小,即65535。

(3)选择确认选项(SACK, Selective Acknowledgements)

考虑这样情况,主机A发送报文段12345,主机B收到135且报文无差错,SACK用来确保只重传缺少的报文段,而不是重传所有报文段。

SACK选项需要2个功能字节,一个用来指明使用SACK选项(SACK Permission),另一指明这个选项占多少字节。

那怎么形容丢失的报文段2,说明2的左右边界分别是1、3。TCP的数据报文是有字块边界的,而这种边界是由序列号表示的。

最多能指明多少个字节块的边界信息呢?答案是4个。这是因为选项字段最大是40字节,去除2个功能字节,序列号是32位即4字节,并且需要左右边界,所以(40-2)/8 = 4。

(4)时间戳选项(timestamps)

时间戳选项用来计算往返时间RTT,发送方在发送报文段时把当前时钟的时间值放入时间戳字段,接收方将该时间戳字段的值复制到确认报文中,当接收方收到确认报文,对比确认报文的时间戳(等于发送方发送报文段的时间戳)和现在的时钟,即可算出RTT。

时间戳选项还可用于防止回绕序号PAWS。序列号只有32位,每2^32个序列号就会回绕(想想环形队列),采用时间戳选项很容易区分相同序列号的报文段。

(5)NOP(NO-Operation)

TCP的头部必须是4字节的倍数,而大多数选项不是4字节倍数,不足的用NOP填充。除此之外,NOP也用于分割不同的选项数据,如窗口扩大选项和SACK之间使用NOP隔离(下面的实例将看到这一点)。



3、URG(紧急标志)和PSH(推标志)

URG:

指示报文段里存在着被发送方的上层实体标记为”紧急”数据,当URG=1时,

系统此报文段中有紧急数据,应尽快传送,而不要按原来的排队顺序来传送,

其后的紧急指针指示紧急数据在当前数据段中的位置(相对于当前序列号的字节偏移量,数据从第一个字节到指针所指的字节就是紧急数据),紧急数据不进入

接收缓冲区直接交给上层进程,TCP接收方必须通知上层实体。

PSH:

发送方TCP把PSH置1,并立即创建一个报文端发送出去。接收方TCP收到PSH=1的报文段,接收方在收到数据后立即将数据交给上层,而不是直到整个缓冲区满。


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TCP/IP详解,卷1:协议》(共3卷,其他卷请到我的空间下载)是一本完整而详细的TCP/IP协议指南。描述了属于每一层的各个协议以及它们如何在不同操作系统中运行。作者用Lawrence Berkeley实验室的tcpdump程序来捕获不同操作系统和TCP/IP实现之间传输的不同分组。对tcpdump输出的研究可以帮助理解不同协议如何工作。 本书适合作为计算机专业学生学习网络的教材和教师参考书。也适用于研究网络的技术人员。 目 录 译者序 前言 第1章 概述 1 1.1 引言 1 1.2 分层 1 1.3 TCP/IP的分层 4 1.4 互联网的地址 5 1.5 域名系统 6 1.6 封装 6 1.7 分用 8 1.8 客户-服务器模型 8 1.9 端口号 9 1.10 标准化过程 10 1.11 RFC 10 1.12 标准的简单服务 11 1.13 互联网 12 1.14 实现 12 1.15 应用编程接口 12 1.16 测试网络 13 1.17 小结 13 第2章 链路层 15 2.1 引言 15 2.2 以太网和IEEE 802封装 15 2.3 尾部封装 17 2.4 SLIP:串行线路IP 17 2.5 压缩的SLIP 18 2.6 PPP:点对点协议 18 2.7 环回接口 20 2.8 最大传输单元MTU 21 2.9 路径MTU 21 2.10 串行线路吞吐量计算 21 2.11 小结 22 第3章 IP:网际协议 24 3.1 引言 24 3.2 IP首部 24 3.3 IP路由选择 27 3.4 子网寻址 30 3.5 子网掩码 32 3.6 特殊情况的IP地址 33 3.7 一个子网的例子 33 3.8 ifconfig命令 35 3.9 netstat命令 36 3.10 IP的未来 36 3.11 小结 37 第4章 ARP:地址解析协议 38 4.1 引言 38 4.2 一个例子 38 4.3 ARP高速缓存 40 4.4 ARP的分组格式 40 4.5 ARP举例 41 4.5.1 一般的例子 41 4.5.2 对不存在主机的ARP请求 42 4.5.3 ARP高速缓存超时设置 43 4.6 ARP代理 43 4.7 免费ARP 45 4.8 arp命令 45 4.9 小结 46 第5章 RARP:逆地址解析协议 47 5.1 引言 47 5.2 RARP的分组格式 47 5.3 RARP举例 47 5.4 RARP服务器的设计 48 5.4.1 作为用户进程的RARP服务器 49 5.4.2 每个网络有多个RARP服务器 49 5.5 小结 49 第6章 ICMP:Internet控制报文协议 50 6.1 引言 50 6.2 ICMP报文的类型 50 6.3 ICMP地址掩码请求与应答 52 6.4 ICMP时间戳请求与应答 53 6.4.1 举例 54 6.4.2 另一种方法 55 6.5 ICMP端口不可达差错 56 6.6 ICMP报文的4.4BSD处理 59 6.7 小结 60 第7章 Ping程序 61 7.1 引言 61 7.2 Ping程序 61 7.2.1 LAN输出 62 7.2.2 WAN输出 63 7.2.3 线路SLIP链接 64 7.2.4 拨号SLIP链路 65 7.3 IP记录路由选项 65 7.3.1 通常的例子 66 7.3.2 异常的输出 68 7.4 IP时间戳选项 69 7.5 小结 70 第8章 Traceroute程序 71 8.1 引言 71 8.2 Traceroute 程序的操作 71 8.3 局域网输出 72 8.4 广域网输出 75 8.5 IP源站选路选项 76 8.5.1 宽松的源站选路的traceroute 程序示例 78 8.5.2 严格的源站选路的traceroute 程序示例 79 8.5.3 宽松的源站选路traceroute程序 的往返路由 80 8.6 小结 81 第9章 IP选路 83 9.1 引言 83 9.2 选路的原理 84 9.2.1 简单路由表 84 9.2.2 初始化路由表 86 9.2.3 较复杂的路由表 87 9.2.4 没有到达目
Modbus TCP是基于TCP/IP协议的Modbus协议的一种实现方式。在Modbus TCP中,报文采用了标准的Modbus协议格式,并通过TCP/IP进行传输。 Modbus TCP报文的解析包括以下几个步骤: 1. 解析TCP首部:首先需要解析TCP首部,包括源端口号、目标端口号、序列号、确认号等信息。这些信息可以用来确定报文的发送者和接收者。 2. 解析Modbus应用协议头:Modbus报文的应用层协议头包括从站地址、功能码、数据长度等字段。从站地址用于标识Modbus设备,功能码用于指示所要执行的操作,数据长度表示后续数据的长度。 3. 解析数据部分:根据数据长度字段可以确定数据部分的长度,然后按照功能码的不同进行解析。例如,如果功能码是读取保持寄存器的操作,那么需要解析请求的起始地址和寄存器数量。如果功能码是写单个保持寄存器的操作,那么需要解析要写入的寄存器地址和数值。 4. 校验和验证:Modbus协议中包含了一个校验和字段,用于验证报文的完整性。通常使用CRC校验算法对报文进行校验。 需要注意的是,Modbus TCP报文是以字节流的形式进行传输的,因此在解析过程中需要按照字节的顺序进行解析。此外,由于Modbus协议支持多种功能码和数据类型,对不同类型的报文需要采用不同的解析方式。具体的解析方法可以参考Modbus协议的相关文档或库。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值