IP报文格式和实例分析

上面是IP的报文格式,接下来我们先说明各个字段的意义。然后,用Etheral软件转包分析IP的报文格式。

1.版本:ip报文中,版本占了4位,用来表示该协议采用的是那一个版本的ip,相同版本的ip才能进行通信。一般此处的值为4,表示ipv4。


2.头长度:该字段用四位表示,表示整个ip包头的长度,其中数的单位是4字节。即二进制数0000-1111(十进制数0-15),其中一个最小长度为0字节,最大长度为60字节。一般来说此处的值为0101,表示头长度为20字节。


3.Tos服务字段:该字段用8位表示。该字段一般情况下不使用。


4..总长度:该字段表示整个ip报文的长度,单位是1字节。能表示的最大字节为2^16-1=65535字节。不过由于链路层的MTU限制。超过1480字节后就会被分片(以太帧MTU为1500的情况下,除去20字节的包头)


5.标识:该字段是ip软件实现的时候自动产生的,该字段的目的不是为了接受方的按序接受而设置的,而是在ip分片以后,用来标识同一片分片的。方便ip分片的重组。


6.标志:该字段是与ip分片有关的。其中有三位,但只有两位是有效的,分别为MF,DF,MF。MF标识后面是否还有分片,为1时,表示后面还有分片。DF标识是否能分片,为0表示可以分片。


7.片偏移:该字段是与ip分片后,相应的ip片在总的ip片的位置。该字段的单位是8字节。比如,一个长度为4000字节的ip报文,到达路由器。这是超过了链路层的MTU,需要进行分片,4000字节中,20字节为包头,3980字节为数据,需要分成3个ip片(链路层MTU为1500),那么第一个分片的片偏移就是0,表示该分片在3980的第0位开始,第1479位结束。第二个ip片的片偏移为185(1480/8),表示该分片开始的位置在原来ip的第1480位,结束在2959。第三片的片偏移为370(2960/8),表示开始的时候是2960位,结束的时候在3979位。


8.TTL:该片表示生存周期,该值占8位。ip分片每经过一个路由器该值减一,它的出现是为了防止路由环路,浪费带宽的问题。比如,该ip在R1路由器发送到R2路由器。R2路由器又发给R1路由器。防止这种循环。window系统默认为128.


9.协议:该值标识上层的协议。占8位。其中1,标识ICMP、2标识IGMP、6标识TCP、17标识UDP、89标识OSPF。


10校验和:该值是对整个数据包的包头进行的校验。占16位。


11.源地址和目的地址。标识发送ip片的源和目的ip,32位


12.接下来是可选的部分,一般一些特殊的要求会加在这个部分。


13:数据


j接下来,我们用一个具体的ip报文来进行分析。该报文是Etheral报文分析软件抓的包。




这是是ip报文的第一行,Version是版本,Header length是头长度,Differentiated Services Field就是区分服务,Total Lehgth为总长度。




其中,45 00 05 dc 为上面的四个信息的传输过程中的值,这里面一个数代表4位二进制数。其中,4和5分别表示版本,头长度,00表示TOS为0。05,




这是ip报文的第二行,Identification 位标识,FLags为标志,在这里可以看到MF为 set 标识还有分片,DF为not set可以分片。片偏移为0.标识这是初始的ip片




90 ad 20 00 为上面的标识字段,90 ad 标识该ip的标识, 2转换为二进制为0010,其中前三位001位标志,后面的0,是13位的标识的一部分。




这是 TTL  协议 检验和这几部分。可以看到TTL为12,上层协议为ICMP,头部检验和为true.




80 01 ef 05为相应字段的值80位生存时间转换成10进制为128. 01为协议。ef 05为首部检验和。




上面是源和目的IP,

下面是相应的编码



c0 a8 0a 0e 为源ip

c0 a8 0a of 为目的ip


以上就是我对于ip报文的理解。


<think>好的,我现在要帮用户找一个用Lua编写的Wireshark扩展解析器模板,用于解析非TCP/IP类的二进制数据并可视化。首先,我需要回忆一下Wireshark的Lua API相关知识。用户提到的是非TCP/IP协议,所以可能需要从底层比如以太网帧或者自定义的传输层开始解析,而不是基于TCP/UDP端口。 接下来,我得考虑如何构建一个基本的解析器结构。通常,Wireshark的Lua解析器需要定义协议、字段、解析函数,以及注册到解析树中。用户需要的是二进制数据解析,所以可能需要处理字节流,按位解析字段,比如使用tvb:range()tvb:bitfield()等方法。 然后,我需要确保模板符合Lua语法,并且正确使用Wireshark的API。例如,定义Proto对象,创建字段提取器,编写dissector函数来解析数据包,并将该解析器注册到适当的解析流程中,比如添加到以太网类型的DissectorTable中。 用户可能需要处理的是已知格式二进制协议,所以示例中应该包含如何解析固定长度的字段、整数、字符串等。同时,考虑到数据可能有大端或小端格式,需要使用像tvb:le_uint()这样的方法。 另外,需要提醒用户关于调试测试的部分,比如使用Wireshark的Tools -> Lua菜单查看错误,以及如何加载脚本。可能还需要注意Wireshark版本兼容性,因为不同版本的API可能有变化。 最后,根据用户提供的引用,特别是引用[1]提到已知数据格式加密压缩算法,可能需要建议用户在解析前处理解密或解压步骤,但这可能超出Lua解析器的能力,需要外部预处理。 总结步骤:创建Proto对象,定义字段,编写解析函数,注册到DissectorTable,处理字节顺序位操作,提供示例代码,注意事项测试方法。确保代码示例正确,语法无误,并涵盖关键点如字段提取树结构显示。</think>以下是一个基于Lua语言的Wireshark自定义协议解析器模板,适用于非TCP/IP二进制协议的解析: ```lua -- 创建协议对象 local my_proto = Proto("MyProto", "My Custom Protocol") -- 定义协议字段(示例字段) local fields = { header = ProtoField.bytes("myproto.header", "协议头"), version = ProtoField.uint8("myproto.version", "版本号", base.HEX), cmd_type = ProtoField.uint16("myproto.cmd", "命令类型", base.HEX), data_len = ProtoField.uint24("myproto.datalen", "数据长度", base.DEC), payload = ProtoField.bytes("myproto.payload", "有效载荷"), checksum = ProtoField.uint32("myproto.checksum", "校验", base.HEX) } my_proto.fields = fields -- 主解析函数 function my_proto.dissector(tvbuf, pinfo, tree) local offset = 0 local data_len = 0 -- 在Packet List列显示协议标识 pinfo.cols.protocol:set("MYPROTO") -- 创建协议解析树 local subtree = tree:add(my_proto, tvbuf()) -- 解析协议头(假设4字节) subtree:add(fields.header, tvbuf(offset, 4)) offset = offset + 4 -- 解析版本号(1字节) subtree:add(fields.version, tvbuf(offset, 1)) offset = offset + 1 -- 解析命令类型(2字节小端) local cmd = tvbuf(offset, 2):le_uint() subtree:add(fields.cmd_type, tvbuf(offset, 2)):append_text(" ("..cmd..")") offset = offset + 2 -- 解析数据长度(3字节大端) data_len = tvbuf(offset, 3):uint() subtree:add(fields.data_len, tvbuf(offset, 3)) offset = offset + 3 -- 解析有效载荷 if data_len > 0 then subtree:add(fields.payload, tvbuf(offset, data_len)) offset = offset + data_len end -- 解析校验(4字节) subtree:add(fields.checksum, tvbuf(offset, 4)) offset = offset + 4 -- 设置Packet List信息 pinfo.cols.info:set(string.format("Cmd:%d Len:%d", cmd, data_len)) end -- 注册解析器到以太网类型0x8866(示例值) local eth_table = DissectorTable.get("ethertype") eth_table:add(0x8866, my_proto) ``` 关键要素说明: 1. 协议字段定义使用`ProtoField`类型,支持多种数据类型:`uint8/16/24/32`,`bytes`,`string`等 2. 偏移量管理通过`offset`变量实现逐字节解析 3. `tvbuf`对象提供多种数据读取方法: - `tvb(offset, length)`:获取指定位置数据 - `:le_uint()`:读取小端格式整数 - `:bitfield()`:处理位域数据 4. 协议树构建使用`tree:add()`创建层次化显示结构 5. 支持协议列的显示报文信息提示 使用说明: 1. 将文件保存为`myproto.lua` 2. 修改Wireshark配置:编辑`init.lua`文件,添加`dofile("myproto.lua")` 3. 重启Wireshark即可生效 调试技巧: - 使用`Ctrl+L`快捷键重新加载Lua脚本 - 通过`Tools -> Lua`菜单查看运行错误 - 使用`pinfo.visited`标记避免重复解析[^1]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值