golang拥有wireshark数据包解析能力

golang拥有wireshark数据包解析能力

    • 1. 功能和实现

wireshark拥有世界上最全面的协议解析能力并且还在不断更新中,通过调研,没有办法找到与wireshark同水平的解析工具。

为了使得golang语言可以拥有wireshark一样强大的协议解析能力,库 gowireshark通过golang --wrap–> c --wrap–> wireshark dll的形式做到了这点。

1. 功能和实现

简单来看下这个库的功能,并分析它的实现:

  • 可以读取离线pcap文件或者抓取指定网卡数据包并解析

    其中c封装的接口在include/目录的lib.hoffline.honline.h中,print_xxx开头的接口调用的是原生的wireshark接口proto_tree_print打印协议树,print_hex_data打印十六进制;
    get_proto_tree_json接口封装的get_proto_tree_json函数明显是改变自原生wireshark接口write_json_proto_tree(print.c文件中),原本write_json_proto_tree生成和输出json结果使用的是jdump对象,修改后使用cJson替代。

  • 支持像wireshark一样解析各种协议,并输出为json格式,字段也能翻译成wireshark一样的解释性文字:

json结果:

{
	"_index": "packets-2020-12-14",
	"_type": "doc",
	"_score": {},
	"offset": ["0000", "0010", "0020", "0030", "0040", "0050", "0060"],
	"hex": ["00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 02", "00 58 00 01 40 00 40 84 3c 1d 7f 00 00 01 7f 00", "00 01 98 3a 96 48 a6 25 c3 63 00 00 00 00 00 03", "00 38 e3 0b 04 a7 00 00 00 00 00 00 00 3e 40 01", "00 0e 00 00 02 00 4e 00 02 00 14 00 00 00 01 00", "00 00 00 00 00 00 00 00 00 00 00 00 00 00 d0 55", "79 4b 65 55 00 00                              "],
	"ascii": ["..............E.", ".X..@.@.<.......", "...:.H.%.c......", ".8...........>@.", "......N.........", "...............U", "yKeU.."],
	"_source": {
		"layers": {
			"frame": {
				"frame.section_number": "1",
				"frame.interface_id": "0",
				"frame.encap_type": "Ethernet (1)",
				"frame.time": "Dec 14, 2020 16:01:11.974420814 UTC",
				"frame.offset_shift": "0.000000000 seconds",
				"frame.time_epoch": "1607961671.974420814 seconds",
				"frame.time_delta": "0.000021538 seconds",
				"frame.time_delta_displayed": "0.000021538 seconds",
				"frame.time_relative": "0.000000000 seconds",
				"frame.number": "5",
				"frame.len": "102",
				"frame.cap_len": "102",
				"frame.marked": "False",
				"frame.ignored": "False",
				"frame.protocols": "eth:ethertype:ip:sctp:f1ap"
			},
			"eth": {
				"eth.dst": "00:00:00:00:00:00 (00:00:00:00:00:00)",
				"eth.dst_tree": {
					"eth.dst_resolved": "00:00:00:00:00:00",
					"eth.dst.oui": "00:00:00",
					"eth.addr": "00:00:00:00:00:00 (00:00:00:00:00:00)",
					"eth.addr_resolved": "00:00:00:00:00:00",
					"eth.addr.oui": "00:00:00",
					"eth.dst.lg": "Globally unique address (factory default)",
					"eth.lg": "Globally unique address (factory default)",
					"eth.dst.ig": "Individual address (unicast)",
					"eth.ig": "Individual address (unicast)"
				},
				"eth.src": "00:00:00:00:00:00 (00:00:00:00:00:00)",
				"eth.src_tree": {
					"eth.src_resolved": "00:00:00:00:00:00",
					"eth.src.oui": "00:00:00",
					"eth.addr": "00:00:00:00:00:00 (00:00:00:00:00:00)",
					"eth.addr_resolved": "00:00:00:00:00:00",
					"eth.addr.oui": "00:00:00",
					"eth.src.lg": "Globally unique address (factory default)",
					"eth.lg": "Globally unique address (factory default)",
					"eth.src.ig": "Individual address (unicast)",
					"eth.ig": "Individual address (unicast)"
				},
				"eth.type": "IPv4 (0x0800)"
			},
			"ip": {
				"ip.version": "4",
				"ip.hdr_len": "20",
				"ip.dsfield": "0x02",
				"ip.dsfield_tree": {
					"ip.dsfield.dscp": "Default (0)",
					"ip.dsfield.ecn": "ECN-Capable Transport codepoint '10' (2)"
				},
				"ip.len": "88",
				"ip.id": "0x0001 (1)",
				"ip.flags": "0x02",
				"ip.flags_tree": {
					"ip.flags.rb": "Not set",
					"ip.flags.df": "Set",
					"ip.flags.mf": "Not set"
				},
				"ip.frag_offset": "0",
				"ip.ttl": "64",
				"ip.proto": "SCTP (132)",
				"ip.checksum": "0x3c1d",
				"ip.checksum.status": "Unverified",
				"ip.src": "127.0.0.1",
				"ip.addr": "127.0.0.1",
				"ip.src_host": "127.0.0.1",
				"ip.host": "127.0.0.1",
				"ip.dst": "127.0.0.1",
				"ip.dst_host": "127.0.0.1"
			},
			"sctp": {
				"sctp.srcport": "38970",
				"sctp.dstport": "38472",
				"sctp.verification_tag": "0xa625c363",
				"sctp.assoc_index": "65535",
				"sctp.port": "38970",
				"sctp.checksum": "0x00000000",
				"sctp.checksum.status": "Unverified",
				"DATA chunk (ordered, complete segment, TSN: 0, SID: 0, SSN: 0, PPID: 62, payload length: 40 bytes)": {
					"sctp.chunk_type": "DATA (0)",
					"sctp.chunk_type_tree": {
						"sctp.chunk_bit_1": "Stop processing of the packet",
						"sctp.chunk_bit_2": "Do not report"
					},
					"sctp.chunk_flags": "0x03",
					"sctp.chunk_flags_tree": {
						"sctp.data_i_bit": "Possibly delay SACK",
						"sctp.data_u_bit": "Ordered delivery",
						"sctp.data_b_bit": "First segment",
						"sctp.data_e_bit": "Last segment"
					},
					"sctp.chunk_length": "56",
					"sctp.data_tsn": "0",
					"sctp.data_tsn_raw": "3809150119",
					"sctp.data_sid": "0x0000",
					"sctp.data_ssn": "0",
					"sctp.data_payload_proto_id": "F1 AP (62)"
				}
			},
			"f1ap": {
				"per.choice_index": "1",
				"f1ap.F1AP_PDU": "successfulOutcome (1)",
				"f1ap.F1AP_PDU_tree": {
					"f1ap.successfulOutcome_element": {
						"f1ap.procedureCode": "id-F1Setup (1)",
						"per.enum_index": "0",
						"f1ap.criticality": "reject (0)",
						"per.open_type_length": "14",
						"f1ap.value_element": {
							"f1ap.F1SetupResponse_element": {
								"per.extension_bit": "0",
								"per.sequence_of_length": "2",
								"f1ap.protocolIEs": "2",
								"f1ap.protocolIEs_tree": {
									"Item 0: id-TransactionID": {
										"f1ap.ProtocolIE_Field_element": {
											"f1ap.id": "id-TransactionID (78)",
											"per.enum_index": "0",
											"f1ap.criticality": "reject (0)",
											"per.open_type_length": "2",
											"f1ap.value_element": {
												"per.extension_present_bit": "0",
												"f1ap.TransactionID": "20"
											}
										}
									},
									"Item 1: id-Cause": {
										"f1ap.ProtocolIE_Field_element": {
											"f1ap.id": "id-Cause (0)",
											"per.enum_index": "0",
											"f1ap.criticality": "reject (0)",
											"per.open_type_length": "1",
											"f1ap.value_element": {
												"per.choice_index": "0",
												"f1ap.Cause": "radioNetwork (0)",
												"f1ap.Cause_tree": {
													"per.extension_present_bit": "0",
													"per.enum_index": "0",
													"f1ap.radioNetwork": "unspecified (0)"
												}
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
}
  • 目前好像还有内存泄露问题和支持多设备实时读取解析功能,wireshark应该无法在线程或协程层面实现并发读取解析,如果使用这个库,也许可以通过docker启动多个微服务来做到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/73801.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Effective Java笔记(31)利用有限制通配符来提升 API 的灵活性

参数化类型是不变的&#xff08; invariant &#xff09; 。 换句话说&#xff0c;对于任何两个截然不同的类型 Typel 和 Type2 而言&#xff0c; List<Type1 &#xff1e;既不是 List<Type 2 &#xff1e; 的子类型&#xff0c;也不是它的超类型 。虽然 L ist<String…

Django-配置邮箱功能(一):使用django自带的发送邮件功能

一、获取邮箱授权码 以QQ邮箱为例子&#xff1a; 1、进入到设置&#xff0c;找到账户 2、开启POP3等服务&#xff0c;点击管理服务 3、进入管理服务&#xff0c;生成授权码 4、按照要求发送短信就可以了 5、将授权码复制保存&#xff0c;离开界面就看不到了 二、django项目中…

VMware Workstation中安装了Windows7系统但是VMware Tools选项为灰色及无法安装的解决方法

一、问题描述 当我们在使用VMware Workstation安装好了Windows7系统后;该安装好的Windows7系统并不能自动适配WMware的界面,只能在中间显示很小的一部分内容;此时我们就需要给Windows7系统安装VMware Tools工具; 问题一:WMware中的【安装VMware Tools】选项则是灰色的无法…

tomcat的多实例,动静分离(web服务基础结束)

多实例 多实例就是在一台服务器上有多个tomcat的服务&#xff08;核心是改端口&#xff09; 实验&#xff1a;多实例 安装步骤 1.安装好 jdk 2.安装 tomcat cd /opt tar zxvf apache-tomcat-9.0.16.tar.gz mkdir /usr/local/tomcat mv apache-tomcat-9.0.16 /usr/local/tomca…

Git简介

Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或大或小的项目。 Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源代码的版本控制软件。 Git与常用的版本控制工具CVS、Subversion等不同&#xff0c;它采用了分布式版本库的方式&#x…

MySQL基本语法总结

创建数据库 create database 数据库名&#xff1b; -- 字符集要看mysql 版本&#xff0c; 5.7 Latin&#xff0c; 8.0 utf8 create database 数据库名 character set ‘utf8’&#xff1b;-- 指定数据库的字符集 create database IF NOT EXISTS 数据库名 charac…

vue-cli前端工程化——创建vue-cli工程 router版本的创建 目录结构 案例初步

目录 引出创建vue-cli前端工程vue-cli是什么自动构建创建vue-cli项目选择Vue的版本号 手动安装进行选择创建成功 手动创建router版多了一个router 运行测试bug解决 Vue项目结构main.jspackage.jsonvue.config.js Vue项目初步hello案例 总结 引出 1.vue-cli是啥&#xff0c;创建…

企业数字化转型与股利分配(2007-2021年)

参照李滟&#xff08;2023&#xff09;的做法&#xff0c;本团队对来自西南大学学报&#xff08;社会科学版&#xff09;《企业数字化转型与股利分配》一文中的基准回归部分进行复刻。 企业数字化转型已成为我国经济增长的新引擎和新动力。为探究数字化转型对企业财务决策的影…

Spring之事务管理

文章目录 前言一、事务及其参数含义1.事务的四个特性2.事务的传播行为&#xff08;propagation&#xff09;3.事务隔离性4.事务的隔离级别&#xff08;ioslation&#xff09;5.timeout&#xff08;超时&#xff09;6.readOnly&#xff08;是否只读&#xff09;7.rollbackFor&am…

Android面试官:“来给我讲讲View绘制?”

前言 迎面走来的一位中年男子&#xff0c;他一手拿着保温杯&#xff0c;一手抱着笔记本电脑&#xff0c;顶着惺忪的睡眼&#xff0c;不紧不慢地走着&#xff0c;不多的几根头发在他头顶自由飞翔。过了一会&#xff0c;他面对着我坐下&#xff0c;放下电脑和保温杯&#xff0c;…

SPSS多元线性回归操作入门实例

做农情反演的时候往往需要用到SPSS多元线性回归&#xff0c;这里提供一个操作案例 (一)SPSS安装 关于SPSS安装&#xff0c;请参考本人博客&#xff1a;保姆级SPSS图文安装教程_追忆苔上雪的博客-CSDN博客 (二)SPSS多元线性回归实例 在文章ArcGIS入门操作手册_追忆苔上雪的博…

Apache Maven简介安装及系统坏境配置eclipse配置Apache Maven---详细介绍

一&#xff0c;简介 Maven可以简化项目的构建和依赖管理&#xff0c;并提供了一种规范化和可复用的方式来管理Java项目。它广泛应用于Java开发领域&#xff0c;简单来说&#xff1a;它提供了一个简单而强大的方式来管理项目的构建、依赖关系和文档在企业级项目中被广泛采用。 1…

如何预防ssl中间人攻击?

当我们连上公共WiFi打开网页或邮箱时&#xff0c;殊不知此时可能有人正在监视着我们的各种网络活动。打开账户网页那一瞬间&#xff0c;不法分子可能已经盗取了我们的银行凭证、家庭住址、电子邮件和联系人信息&#xff0c;而这一切我们却毫不知情。这是一种网络上常见的“中间…

Java多线程编程中的线程控制:挂起、停止和恢复

Java 线程控制&#xff1a;挂起、停止和恢复 在多线程编程中&#xff0c;对线程进行控制是非常重要的&#xff0c;可以通过挂起、停止和恢复线程来实现对线程的管理。本文将介绍如何使用Java提供的方法对线程进行挂起、停止和恢复操作&#xff0c;以及需要注意的安全性和替代方…

一位年薪50W的测试被开除,回怼的一番话,令人沉思

一位年薪35W测试工程师被开除回怼道&#xff1a;“反正我有技术&#xff0c;在哪不一样” 一技傍身&#xff0c;万事不愁&#xff0c;当我们掌握了一技之长后&#xff0c;在职场上说话就硬气了许多&#xff0c;不用担心被炒&#xff0c;反过来还可以炒了老板&#xff0c;这一点…

【Linux操作系统】深入理解Linux系统编程中的传入参数、传出参数和传入传出参数

在Linux系统编程中&#xff0c;函数的参数扮演着至关重要的角色。参数的传递方式可以分为传入参数、传出参数和传入传出参数。本文将详细解释这三种参数的概念、特点以及如何使用它们来实现灵活和高效的函数调用和数据传递。 文章目录 1. 解释和举例1.1 传入参数&#xff08;i…

Python 3 使用Hadoop 3之MapReduce总结

MapReduce 运行原理 MapReduce简介 MapReduce是一种分布式计算模型&#xff0c;由Google提出&#xff0c;主要用于搜索领域&#xff0c;解决海量数据的计算问题。 MapReduce分成两个部分&#xff1a;Map&#xff08;映射&#xff09;和Reduce&#xff08;归纳&#xff09;。…

电脑合上盖子无线网络不会断开

控制面板\硬件和声音\电源选项\系统设置 最终选择不会采取任何操作 选择不会采取任何操作

限流在不同场景的最佳实践

目录导读 限流在不同场景的最佳实践1. 前言2. 为什么要限流3. 有哪些限流场景3.1 限流场景分类3.2 限流与熔断降级之间的关系3.3 非业务限流3.4 业务限流 4. 有哪些限流算法4.1 计数器限流算法4.2 漏桶限流算法4.3 令牌桶限流算法4.4 滑动时间窗限流算法4.5 限流算法选型 5. 限…

嵌入式 C 语言程序数据基本存储结构

一、5大内存分区 内存分成5个区&#xff0c;它们分别是堆、栈、自由存储区、全局/静态存储区和常量存储区。 1、栈区(stack)&#xff1a;FIFO就是那些由编译器在需要的时候分配&#xff0c;在不需要的时候自动清除的变量的存储区。里面的变量通常是局部变量、函数参数等。 ​…