wireshark 抓取的tcp 数据报文

本文详细解析了Wireshark抓取的TCP数据报文,包括以太网头部、IP头部和TCP头部的各项字段,如源端口、目的端口、序号、确认号、紧急比特、确认比特、复位比特、同步比特、终止比特、窗口字段、检验和等,并解释了其作用和意义。
图1:wireshark 抓取的tcp 数据报文
0000 34 17 eb a9 73 88 58 69 6c 27 77 16 08 00 45 00
0010 00 34 00 00 40 00 3d 06 56 72 c0 a8 3d df c0 a8
0020 28 22 1f 98 ca 50 a3 e6 0a c4 74 47 e4 f7 80 12
0030 39 08 5c d4 00 00 02 04 05 b4 01 01 04 02 01 03
0040 03 07

TCP 报文 =以太网头部(14字节)+IP 头部(20个字节)+TCP 头部(20字节)+TCP数据部分

源端口和目的端口字段 —— 各占 2 字节。端口是传输层与应用层的服务接口。传输层的复用和分用功
能都要通过端口才能实现。
序号字段 —— 占 4 字节。 TCP 连接中传送的数据流中的每一个字节都编上一个序号。序号字段的值
则指的是本报文段所发送的数据的第一个字节的序号。
确认号字段 —— 占 4 字节,是期望收到对方的下一个报文段的数据的第一个字节的序号。
数据偏移 —— 占 4bit ,它指出 TCP 报文段的数据起始处距离 CP 报文段的起始处有多远。“数据偏
移 ”的单位不是字节而是 32bit 字( 4 字节为计算单位)。
保留字段 —— 占 6bit ,保留为今后使用,但目前应置为 0。
紧急比特 URG —— 当 URG =1 时,表明紧急指针字段有效。它告诉系统此报文段中有紧急数据,应
尽快传送 (相当于高优先级的数据 )。
确认比特 ACK—— 只有当 ACK=1 时确认号字段才有效。当 ACK=0 时,确认号无效。
复位比特 RST(Reset) —— 当 RST =1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他
原因),必须释放连接,然后再重新建立运输连接。
同步比特 SYN—— 同步比特 SYN 置为 1,就表示这是一个连接请求或连接接受报文。
终止比特 FIN(FINal) —— 用来释放一个连接。 当 FIN=1 时,表明此报文段的发送端的数据已发送完
毕,并要求释放运输连接。
窗口字段 —— 占 2 字节。窗口字段用来控制对方发送的数据量,单位为字节。 TCP 连接的一端根据
设置的缓存空间大小确定自己的接收窗口大小,然后通知对方以确定对方的发送窗口的
上限。
检验和 —— 占 2 字节。检验和字段检验的范围包括 首部 和数据 这两部分。在计算检验和时,要在
TCP报文段的前面加上 12 字节的伪首部。
紧急指针字段 —— 占 16bit 。紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。
选项字段 —— 长度可变。 TCP 首部可以有多达 40 字节的可选信息,用于把附加信息传递给终点,或
用来对齐其它选项。
填充字段 —— 这是为了使整个首部长度是 4 字节的整数倍。
解析TCP头部数据20字节固定首部:
1f 98 ca 50 a3 e6 0a c4 74 47 e4 f7 80 12 39 08 5c d4 00 00
源端口占2个字节: 1f 98 ;0x1f98转化为十进制为8088 ;发送tcp包的进程端口为8088
目的端口占2个字节: ca 50; 0xca50转化为十进制为51792 ;接受tcp包的进程端口为51792
序号字段占4个字节:a3 e6 0a c4;
确认号字段占4个字节:74 47 e4 f7;
数据偏移占4bit(位):0x80 转化为2进制为 1000 0000 数据偏移为1000 为8;数据偏移的单位为4字节;数据偏移=4*8=32字节
保留字段 占6位:0x80 0x12; 0x80 的低4位和0x12 的高2位;1000 0000 0001 0010 绿色的字段表示的保留字段
01 0010 这6位的数据解析:
第1位:URG(紧急比特)当 URG =1 时,表明紧急指针字段有效.它告诉系统此报文段中有紧急数
据,应尽快传送 (相当于高优先级的数据 )。
第2位:ACK(确认比特)只有当 ACK=1 时确认号字段才有效。当 ACK=0 时,确认号无效。
第4位:RST(复位比特) 当 RST =1 时,表明 TCP 连接中出现严重差错(如由于主机崩溃或其他
原因),必须释放连接,然后再重新建立运输连接。
第5位:SYN(同步比特)同步比特 SYN 置为 1,就表示这是一个连接请求或连接接受报文。
第6位: FIN (终止比特) 用来释放一个连接。 当 FIN=1 时,表明此报文段的发送端的数据已发送完毕,
并要求释放运输连接。
窗口字段占2个字节:0x39 0x08; 0x3908转化十进制为 14600;窗口字段是用来控制对方发送的数据
量,单位字节,tcp 连接的一端根据设置的缓存空间大小确定自己的接收窗大小,
然后通知对方以确定对方发送窗口的上限。
检验和占2个字节:检验和字段检验的范围包括 首部 和数据 这两部分。在计算检验和时,要在 TCP报
文段的前面加上 12 字节的伪首部。 0x5c ,0xd4
紧急指针字段: 占 2个字节 ,紧急指针指出在本报文段中的紧急数据的最后一个字节的序号。
0x00,0x00.
选项字段 : 长度可变。 TCP 首部可以有多达 40 字节的可选信息,用于把附加信息传递给终点,或
用来对齐其它选项 , 此报文选项字段占12个字节02 04 05 b4 01 01 04 02 01
03 03 07
填充字段 : 这是为了使tcp整个首部长度是 4 字节的整数倍
IP头部信息的分析
IP数据包格式
45 00 00 34 00 00 40 00 3d 06 56 72 c0 a8 3d df c0 a8 28 22
版本字段:占4位。0x45;版本字段=4 说明当前的IP协议的版本为4,通常称为IPV4,下一个版本为6,
通常称为IPv6;
首部长度:占4位。0x45; IP报文的首部长度=5 单位为4个字节;IP首部字节数=5*4=20个字节;IP首
部长度都是4的整数倍
服务类型:占 8 位,服务类型
0 1 2 3 4 5 6 7

优先级:占3位,用于表示数据报文的重要程度,优先级取值0(普通优先级)~7(网络控制高优先级)
D、T 和 R 位表示本数据报希望的传输类型。
D 表示低时延( Delay)需求
T 表示高吞吐量( Throughput )要求
R 代表高可靠性( Reliability )要求
总长度字段:占2个字节,因此数据报文的最大长度为2 ^16 -1=65535 字节; 0x00 0x34 表示总长度
(首部与数据之和长度)=0x0034=52字节=IP 首部(20个字节)+TCP首部(20个字
节)+TCP(选项长度12个字节)
标识(identification):占用2个字节;0x00 0x00; IP 软件在存储器中维持一个计数器,每产生一个
数据报,计数器就加 1,并将此值赋给标识字段。但这个 “标识 ”并不是序
号, 因为 IP 是无连接服务,数据报不存在按序接收的问题。当数据报由于长
度超过网络的 MTU 而必须分片时,这个标识字段的值就被复制到所有的数据
报的标识字段中。 相同的标识字段的值使分片后的各数据报片最后能正确地
重装成为原来的数据报.
标志: 占3位,目前只有2位有意义;0x40=0100 0000 ->MF =0,DF=1
标志字段中的最低位记为 MF(More Fragment) ,MF=1 即表 示后面 “还有分片 ”的数据
报。MF=0 表示这已是若干数据报片中的最后一个。
标志字段中间的一位记为 DF(Don’t Fragment),意思是 “不能分片 ”。只有当 DF=0 时
才允许分片。
片偏移:0x40,0x00(0100 0000 0000 0000)占13位,片偏移表示的是:较长的分组在分片后,某片
在原分组中的相对位置。 也就是说, 相对用户数据字段的起点,该片从何处开始。片偏移以
8 个字节为偏移单位。这就是说,每 个分片的长度一定是 8 字节( 64 位)的整数倍。
寿命(生存时间): 占 8 位 ,0x3d,生存时间字段常用的的英文缩写是 TTL(Time To Live) ,表明是数据报在网络中的寿命。 由发出数据报的源点设置这个字段。 其目的是防止无法交付的数据报无限制地在因特网中兜圈子,因而白白消耗网络资源。最初的设计是以秒作为 TTL 的单位。每经过一个路由器时,就把 TTL 减去数据报在路由器消耗掉的一段时间。若数据报在路由器消耗的时间小于 1 秒,就把 TTL 值减 1。当 TTL 值为 0 时,就丢弃这个数据报。
协议 :占 8 位,0x06;协议字段指出此数据报携带的数据是使用何种协议,以便使目的主机的 IP层知
道应将数据部分上交给哪个处理过程。
首部检验和:占2个字节,0x56,0x72;这个字段只检验数据报的首部,但不包括数据部分。这是因为数
据报每经 一个路由器, 路由器都要重新计算一下首部检验和 (一些字段, 如生存时
间、 标志、片 偏移等都可能发生变化) 。不检验数据部分可减少计算的工作量。
源地址: 占 32 位。 c0 a8 3d df =192.168. 61.223
目的地址:占 32 位。 c0 a8 28 22 =192.168.40.34
IP 数据报首部的可变部分:IP 首部的可变部分就是一个可选字段。选项字段用来支持排错、测量以及安
全等措施,内容很丰富。此字段的长度可变,从 1 个字节到 40 个字节不等,取决于所选择的
项目。某些选项项目只需要 1 个字节,它只包括 1 个字节的选项代码。但还有些选项需要多个
字节,这些选项一个个拼接起来, 中间不需要有分隔符, 最后用全 0 的填充字段补齐成为 4
字节的整数倍。增加首部的可变部分是为了增加 IP 数据报的功能, 但这同时也使得 IP 数据报
的首部长度成为可变的。这就增加了每一个路由器处理数据报的开销。实际上这些选项很少被
使用。新的 IP 版本 IPv6 就将 IP 数据报的首部长度做成固定的。
目前,这些任选项定义如下:
(1)安全和处理限制(用于军事领域)
(2)记录路径(让每个路由器都记下它的 IP 地址)
(3)时间戳(让每个路由器都记下它的 IP 地址和时间)
(4)宽松的源站路由(为数据报指定一系列必须经过的 IP 地址)
(5)严格的源站路由(与宽松的源站路由类似,但是要求只能经过指定的这些地址,不能经过其他的
地址)
这些选项很少被使用,并非所有主机和路由器都支持这些选项。
图2 : wireshark 对抓取的数据报文的分析数据

### Wireshark 数据包首部结构及字段含义 Wireshark 是一种非常强大的网络封包分析工具,能够捕获并解析网络流量中的各个层次的数据包[^1]。通过 Wireshark 的界面,用户可以深入观察数据包的头部信息及其具体字段的意义。 #### 1. **帧头 (Frame Header)** 帧头是数据链路层的一部分,包含了关于该帧的基本元数据。其主要字段包括但不限于以下几个方面: - **Length**: 表示整个帧的长度(字节数),用于计算传输过程中的开销和效率[^3]。 - **Source and Destination MAC Addresses**: 这些字段分别表示源设备和目的设备的硬件地址(MAC 地址)。它们帮助交换机或其他二层设备识别数据应该转发给哪个端口。 - **Type/Length Field**: 此字段通常有两种用途——如果值小于等于 1500,则代表的是以太网 II 中的有效载荷长度;如果是大于 1536 的十六进制数,则表明这是更高层协议类型(如 IPv4 或 ARP 请求)。 #### 2. **IP 首部 (IP Header)** 当进入网络层时,会看到 IP 文的具体构成。以下是 IP 数据的主要组成部分以及对应的解释[^4]: - **Version**: 显示当前使用的版本号,目前最常见的是 IPv4 和 IPv6。 - **Header Length (IHL)**: 定义了 IP 头的实际长度,单位是以 4 字节为基数计数,默认情况下 IPv4 的固定部分占用了 20 字节。 - **Differentiated Services Code Point (DSCP) & Explicit Congestion Notification (ECN)**: DSCP 提供服务质量标记支持,而 ECN 则允许路由器通知主机存在拥塞情况。 - **Total Length**: 整个 IP 分组总长度,包括头部和有效负载两部分内容之和。 - **Identification**: 主要应用于分片重组过程中唯一标识每一个 datagram。 - **Flags**: 控制标志位,主要用于指示是否允许分片操作等特性。 - **Fragment Offset**: 如果发生了分片现象的话,此字段记录每一片相对于原始 packet 起始位置偏移量的信息。 - **Time To Live (TTL)**: 设置跳转次数上限来防止循环路由问题的发生,在每次经过一个路由器之后都会减去一定数值直到达到零为止即丢弃相应 packets。 - **Protocol**: 指定下一个高层协议是什么形式,比如 TCP(6), UDP(17),ICMP等等。 - **Checksum**: 计算校验码验证 ip header 是否损坏丢失等情况发生以便采取纠正措施恢复原样或者重新请求发送新的 copies. - **Source Address / Destination Address**: 分别存储着发送方与接收方公网上的逻辑地址(IPv4 address). #### 3. **TCP 首部 (TCP Header)** 除了上述提到的基础层面外,还有更复杂的传输控制协议(TCP)相关内容值得注意: - **Port Numbers**: 包含两个短整型变量分别作为 source port number 和 destination port number 使用从而实现多路复用功能区分不同应用程序之间通讯连接关系。 - **Sequence Number**: 发送者分配的一个初始序列编号用来跟踪所传递出去的所有 bytes 并确保按顺序组装成完整的 message 流程图。 - **Acknowledgment Number**: 当 ACK flag 设立起来以后才生效,意味着已经成功接收到前序指定数量 byte 后准备继续读取后续未完成的部分直至全部结束为止。 - **Data Offset**: 类似于 IHL ,指出 tcp segment headers 所占用的空间大小范围一般介于五个到六十四个 octets 不等取决于选项区是否存在扩展参数配置与否决定最终结果如何呈现出来给人看明白就好啦! - **Reserved Bits**: 总共保留六个比特位暂时没有任何实际作用留待将来可能新增加的功能需求再做进一步开发完善工作吧😊。 - **Control Flags**: 包括 URG,ACK,PUSH,RST,SYN,FIN 六种不同类型的操作命令信号灯开关状态切换机制设计精巧合理高效实用性强👍。 - **Window Size**: 展现滑动窗口尺寸限制条件约束双方交互速率保持同步协调一致避免因速度差异过大造成资源浪费现象出现❌。 - **Check Sum**: 对tcp segments整体进行错误检测运算得出最后结论判断是否有误传错乱等问题存在⚠️。 - **Urgent Pointer**: 若设置了URG bit则此项指明紧急数据所在确切位置方便快速定位处理事务优先级高的任务事项💼。 --- ### 示例代码:抓取并打印第一个 TCP 数据包的详细信息 下面是一个简单的 Python 脚本例子,演示如何利用 `scapy` 库模拟 wireshark 功能获取首个 tcp 数据包包头详情: ```python from scapy.all import sniff def process_packet(packet): if packet.haslayer('TCP'): src_port = packet['TCP'].sport dst_port = packet['TCP'].dport seq_num = packet['TCP'].seq ack_num = packet['TCP'].ack flags = packet['TCP'].flags print(f"Src Port: {src_port}, Dst Port: {dst_port}") print(f"Seq Num: {seq_num}, Ack Num: {ack_num}") print(f"Flags: {flags}") sniff(prn=process_packet, count=1) ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值