- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试制作一个 protobuf 类,它可以更有效地流式传输使用 TCPDump 捕获的 DNS 数据包。
我想知道这个库中提供的所有可能字段的类型:
DNSPacket Fields:
QUERYID
QR
OPCODE
RCODE
QUESTION
QNAME
QTYPE
ANSWER
AUTHORITY
ADDITIONAL
Packet Fields:
TIMESTAMP
TIMESTAMP_USEC
TIMESTAMP_MICROS
TTL
IP_VERSION
IP_HEADER_LENGTH
IP_FLAGS_DF
IP_FLAGS_MF
IPV6_FLAGS_M
FRAGMENT_OFFSET
FRAGMENT
LAST_FRAGMENT
PROTOCOL
SRC
DST
ID
SRC_PORT
DST_PORT
TCP_HEADER_LENGTH
TCP_SEQ
TCP_ACK
LEN
UDPSUM
UDP_LENGTH
TCP_FLAG_NS
TCP_FLAG_CWR
TCP_FLAG_ECE
TCP_FLAG_URG
TCP_FLAG_ACK
TCP_FLAG_PSH
TCP_FLAG_RST
TCP_FLAG_SYN
TCP_FLAG_FIN
/*Not sure bout these two*/
REASSEMBLED_TCP_FRAGMENTS
REASSEMBLED_DATAGRAM_FRAGMENTS
我的应用程序是在 Scala 中,我尝试对我捕获的一些数据包进行简单反射,但是很多字段都是空的,这没有帮助。
库可以在 GitHub 上找到 here
有没有一种简单的方法可以获得这些字段的 ALL 类型? (以编程方式或通过文本源)
谢谢,远程数据服务
最佳答案
我以最直接明显的方式处理了这个问题。
我决定使用绝对数量的数据包来解决这个问题,使用 Wireshark 捕获了大约 100,000 个 DNS 数据包,然后将捕获的数据保存为 .pcap
文件。
然后我在文件上运行了以下命令:
try {
var dataInStream: DataInputStream = null
//Open the file and set up the DataInputStream
val f = new File(pCapFileName)
if (f.getAbsoluteFile.exists) {
val fis = new FileInputStream(f)
dataInStream = new DataInputStream(fis)
val dnsPcapReader = new DnsPcapReader(dataInStream)
val pktIter = dnsPcapReader.iterator
var counter = 0
while (pktIter.hasNext) {
counter += 1
if (counter % 100 == 0) println(counter)
val pCapFile = pktIter.next.asInstanceOf[DnsPacket]
for (i <- 0 until types.length) {
val tuple = types(i)
val fieldName = tuple._1
var className = Option(pCapFile.get(fieldName)).map(_.getClass).toString
var numOccurances = tuple._3
if(className.equals("None"))
className = tuple._2.asInstanceOf[String]
else
numOccurances += 1
val newTuple = (fieldName, className, numOccurances)
types = types.updated(i, newTuple)
}
}
}
for {
tuple <- types
} printf("%s%-25s%-25s%-25s\n%s\n", "\t", tuple._1 + ":", tuple._2,
"[" + tuple._3 + "]", spacer)
//Close the stream
dataInStream.close
} catch {
case e: Exception => e.printStackTrace()
}
本质上,对于每个字段名称,它都会检查一个值,然后还会检查该值的类。每次更新列表中的相应空间以反射(reflect)该字段(不太优雅但它以合理的方式获得结果)。此外,查看哪些字段常见哪些不常见也很方便。
结果如下:
dst: Some(class java.lang.String)[98823]
dst_port: Some(class java.lang.Integer)[98614]
fragment: Some(class java.lang.Boolean)[98823]
fragment_offset: Some(class java.lang.Long)[98799]
id: Some(class java.lang.Long)[98799]
ip_flags_df: Some(class java.lang.Boolean)[98799]
ip_flags_mf: Some(class java.lang.Boolean)[98799]
ip_header_length: Some(class java.lang.Integer)[98823]
ip_version: Some(class java.lang.Integer)[98823]
ipv6_flags_m: null [0]
last_fragment: null [0]
len: Some(class java.lang.Integer)[98823]
protocol: Some(class java.lang.String)[98618]
reassembled_datagram_fragments:null [0]
reassembled_tcp_fragments:Some(class java.lang.Integer)[835]
src: Some(class java.lang.String)[98823]
src_port: Some(class java.lang.Integer)[98614]
tcp_ack: Some(class java.lang.Long)[96106]
tcp_flag_ack: Some(class java.lang.Boolean)[96106]
tcp_flag_cwr: Some(class java.lang.Boolean)[96106]
tcp_flag_ece: Some(class java.lang.Boolean)[96106]
tcp_flag_fin: Some(class java.lang.Boolean)[96106]
tcp_flag_ns: Some(class java.lang.Boolean)[96106]
tcp_flag_psh: Some(class java.lang.Boolean)[96106]
tcp_flag_rst: Some(class java.lang.Boolean)[96106]
tcp_flag_syn: Some(class java.lang.Boolean)[96106]
tcp_flag_urg: Some(class java.lang.Boolean)[96106]
tcp_header_length: Some(class java.lang.Integer)[96106]
tcp_seq: Some(class java.lang.Long)[96106]
ts: Some(class java.lang.Long)[100258]
ts_micros: Some(class java.lang.Long)[100258]
ts_usec: Some(class java.lang.Double)[100258]
ttl: Some(class java.lang.Integer)[98823]
udp_length: Some(class java.lang.Integer)[2508]
udpsum: Some(class java.lang.Integer)[2508]
dns_additional: Some(class java.util.ArrayList)[320]
dns_answer: Some(class java.util.ArrayList)[320]
dns_authority: Some(class java.util.ArrayList)[320]
dns_flags: Some(class java.lang.String)[320]
dns_opcode: Some(class java.lang.String)[320]
dns_qname: Some(class java.lang.String)[320]
dns_qr: Some(class java.lang.Boolean)[320]
dns_qtype: Some(class java.lang.Integer)[320]
dns_queryid: Some(class java.lang.Integer)[320]
dns_question: Some(class java.lang.String)[320]
dns_rcode: Some(class java.lang.String)[320]
仍然有 3 个字段出现次数为 0,因此它们的类类型仍然未知: ipv6_flags_m
、last_fragment
和reassembled_datagram_fragments
鉴于 ipv6_flags_m
是一个标志,它可能是一个 boolean 值,我假设它留下了两个字段。由于在 100,000 个数据包中没有出现,我认为这些字段无关紧要,因此将它们完全从我的列表中删除。
关于java - Hadoop-PCap-Lib 字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31139813/
在有些场景下,我们需要对我们的varchar类型的字段做修改,而修改的结果为两个字段的拼接或者一个字段+字符串的拼接。 如下所示,我们希望将xx_role表中的name修改为name+id。
SELECT incMonth as Month, SUM( IF(item_type IN('typ1', 'typ2') AND incMonth = Month, 1, 0 ) )AS
我最近读到 volatile 字段是线程安全的,因为 When we use volatile keyword with a variable, all the threads read its va
我在一些模型中添加了一个 UUID 字段,然后使用 South 进行了迁移。我创建的任何新对象都正确填充了 UUID 字段。但是,我所有旧数据的 UUID 字段为空。 有没有办法为现有数据填充 UUI
刚刚将我的网站从 mysql_ 更新为 mysqli,并破坏了之前正常运行的查询。 我试图从旋转中提取 id,因为它每次都会增加 1,但我不断获取玩家 id,有人可以告诉我我做错了什么吗?我尝试了将
我在 Mac OS X 上使用带有 Sequel Pro 的 MySQL。我想将一个表中的一个字段(即名为“GAME_DY”的列)复制到另一个名为“DAY_ID”的表的空字段中。两个表都是同一数据库的
问题: 是否有可能有一个字段被 JPA 保留但被序列化跳过? 可以实现相反的效果(JPA 跳过字段而序列化则不会),如果使用此功能,那么相反的操作肯定会很有用。 类似这样的事情: @Entity cl
假设我有一个名为“dp”的表 Year | Month | Payment| Payer_ID | Payment_Recipient | 2008/2009 | July
我将尝试通过我的 Raspberry Pi 接入点保证一些 QoS。 开始之前,我先动手:我阅读了有关 tcp、udp 和 ip header 的内容。在IP header description我看
如果你能弄清楚如何重命名这个问题,我愿意接受建议。 在 Dart 语言中,可以编写一个带有 final 字段的类。这些是只能设置的字段构造函数前 body 跑。这可以在声明中(通常用于类中的静态常量)
你怎么样? 我有两个带有两个字段的日期选择器 我希望当用户选择 (From) 时,第二个字段 (TO) 将是 next day 。比如 booking.com 例如:当用户选择From 01-01-2
我想我已经看到了这个问题的一些答案,这些答案可能与我需要的相差不远,但我对 mysql 的了解还不够确定,所以我会根据我的具体情况提出问题。 我有一个包含多个表的数据库,为此,如果“image”表上的
我在 mySQL 数据库中有 2 个表: customers ============ customer_id (1, 2 ) customer_name (john, mark) orders ==
我正在开发一个员工目标 Web 应用程序。 领导/经理在与团队成员讨论后为他们设定目标。这是一年/半年/季度,具体取决于组织遵循的评估周期。 现在的问题是添加基于时间段的字段或存档上一季度/年度数据的
我正在寻找允许内容编辑器从媒体库中选择多个文件的东西,这些文件将在渲染中列出。他们还需要能够上传文件和搜索。它必须在页面编辑器(版本 8 中称为体验编辑器)中工作。 到目前为止我所考虑的: 一堆文件字
现在,我有以下由 original.df %.% group_by(Category) %.% tally() %.% arrange(desc(n)) 创建的 data.frame。 DF 5),
我想知道是否有一些步骤/解决方案可以处理错误消息并将它们放入 Pentaho 工具中的某个字符串或字段中?例如,如果连接到数据库时发生某些错误,则将该消息从登录到字符串/字段。 最佳答案 我们在作业的
如何制作像短信应用程序一样的“收件人”字段?例如,右侧有一个“+”按钮,当添加某人时,名称将突出显示并可单击,如圆角矩形等。有没有内置的框架? 最佳答案 不,但请参阅 Three20 的 TTMess
是否可以获取记录的元素或字段的列表 通过类型信息类似于类的已发布属性的列表吗? 谢谢 ! 最佳答案 取决于您的delphi版本,如果您使用的是delphi 2010或更高版本,则可以使用“新rtti”
我正在构建一个 SQLite 数据库来保存我的房地产经纪人的列表。我已经能够使用外键来识别每个代理的列表,但我想在每个代理的记录中创建一个列表;从代理商和列表之间的一对一关系转变为一对多关系。 看这里
我是一名优秀的程序员,十分优秀!