Wireshark TS | DNS 案例分析之外的思考

2024-03-24 07:04

本文主要是介绍Wireshark TS | DNS 案例分析之外的思考,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

承接之前一篇《Packet Challenge 之 DNS 案例分析》,在数据包跟踪文件 dnsing.pcapng 中,关于第 4 题(What is the largest DNS response time seen in this trace file? )的分析过程中曾经碰到一个小问题,主要是数据包中存在部分 DNS 查询数据包重传的现象,因此对于 DNS 响应时间的计算可能就有一点不同的见解。

问题

譬如 No.1-4 数据包,No.1 为起始 DNS 查询,No.2 为 DNS 查询的第一次重传,No.3 为 DNS 查询的第二次重传,No.4 为 DNS 响应,那么 DNS 响应时间是 No.4 和 No.1 的差值?还是 No.4 和 No.3 的差值?

关于上述问题的场景,实际上类似 TCP 超时重传中关于 RTO、RTT 如何选取的问题,如下图。

image.png

重传时间的选择是 TCP 最复杂的问题之一,本篇不再展开。

而对于像 dns.timehttp.time 等这些关乎应用性能指标的字段值,倒是没有那么讲究。在 Wireshark 中这样的类似字段,以 [ ] 标注的,实际上并不是数据包本身的实际字段。对比数据包 DNS 响应中的 Transaction IDFlags 等真实字段,可以看到如下:

  1. [Request In: 7] Wireshark 根据上下文提示该 DNS 响应数据包所对应的请求在 No.7 数据包;
  2. [Time:0.037583000 seconds] Wireshark 根据上下文计算出该 DNS 响应数据包和请求数据包之间的时间间隔为 0.037583000 秒。

image.png

分析

再回到 DNS 这个案例上,Wireshark 根据 Transaction ID0x0f39 对应出 No.7-9 为一组 DNS 请求和响应,其中 No.7 为第一次查询,No.8 为第二次查询(也就是重传,Wireshark 会标记提示为 DNS 查询重传,原始请求在 No.7),No.9 为查询响应。

Wireshark 对于 dns.time的取值是 0.037583000 秒,这个是 No.9 和 No.7 的时间间隔,也就是 0.015479000 加上 0.022104000 的结果,因此 Wireshark dns.time 的算法是第一次查询以及响应数据包之间的间隔时间

image.png

其次根据显示过滤表达式,可过滤出和域名相关的所有 DNS 请求和响应,如下。

dns.qry.name == "www.paypal.com"

包括 6 次完整请求和响应,且每次均有重传请求,其中第 5 次还包含有两次请求重传,因此 dns.time 时间较长,超过了 1 秒。

image.png

在 Statistics -> DNS 中,也可以看到相关请求-响应时间,最小 36.8ms 至最长 1041.9ms,平均 212.63ms。

image.png

通过 tshark 也可以输出相关 dns 字段值。

λ tshark -r dnsing.pcapng -Y 'dns.qry.name == "www.paypal.com"' -T fields -e frame.number -e dns.id -e dns.flags.response -e dns.time
7       0x0f39  0
8       0x0f39  0
9       0x0f39  1       0.037583000
10      0x5644  0
11      0x5644  0
12      0x5644  1       0.036807000
40      0x4fa0  0
41      0x4fa0  0
42      0x4fa0  1       0.039575000
88      0x7964  0
89      0x7964  0
90      0x7964  1       0.042819000
110     0xaf9f  0
111     0xaf9f  0
112     0xaf9f  0
113     0xaf9f  1       1.041903000
119     0xc8c8  0
122     0xc8c8  0
125     0xc8c8  1       0.077093000

深入

实际上,对于 DNS 请求和响应的关联,我更愿理解是最后一次 DNS 重传请求和响应之间是对应关系,这样所计算出来的 dns.time 会更小,理论上应该也更精确。

因此对于 DNS Transaction ID 值 0x0f39 的一组,计算 No.8 和 No.9 的间隔时间,也就是 dns.time 的值 22ms

image.png

以上都是手工计算,那么对于整个数据包跟踪文件中,存在很多 DNS 请求响应对的,如何得出所有的 dns.time,可通过如下方式输出相关过滤后的数据包。

tshark -r dnsing.pcapng -w test1.pcapng -Y `tshark -r dnsing.pcapng -Y 'dns.qry.name == "www.paypal.com"' -T fields -e frame.number -e dns.id -e dns.flags.response | sort -rn  | uniq -f 1 | sort -n | awk '{printf("%sframe.number==%d",sep,$1);sep="||"}'`

image.png

通过 tshark 也可以输出相关 dns 字段值。

λ tshark -r test1.pcapng -T fields -e frame.number -e dns.id -e dns.flags.response -e dns.time
1       0x0f39  0
2       0x0f39  1       0.022104000
3       0x5644  0
4       0x5644  1       0.021225000
5       0x4fa0  0
6       0x4fa0  1       0.023975000
7       0x7964  0
8       0x7964  1       0.027038000
9       0xaf9f  0
10      0xaf9f  1       0.026070000
11      0xc8c8  0
12      0xc8c8  1       0.061571000

进阶

在上述分析章节中说到,Wireshark dns.time 的算法是第一次查询以及响应数据包之间的间隔时间,也就是说默认没有考虑有重传请求的存在。

但终究 Wireshark 还是考虑到了这样的场景,在 Perferences -> Protocols -> DNS 中,有如下的选项可以使用:

image.png

也就是说重传之间允许的秒数,该选项默认是 5s,也就是 5s 以内的相同请求,都算成是重传请求,而如果全是重传请求的话,则 dns.time 就是第一次查询以及响应数据包之间的间隔时间。

如下,默认 5s 的情况,No.112 在 2s 之内,所以仍是重传请求,dns.time 值 No.113 和 No.110 的间隔时间为 1.041s

image.png

如果选项 Number of seconds allowed between retransmissions 值改为 1s 呢,那么结果如下,No.112 在 1s 之外,所以不再是重传请求,因此 dns.time 值就变成 No.113 和 No.112 的间隔时间为 0.026s

image.png

那么再如果选项 Number of seconds allowed between retransmissions 值改为 0 呢,那么结果如下,自然也就不存在所谓的重传请求,这样也就直接达到了深入章节中的脚本效果。

image.png

image.png

总结

以上就是在之前 DNS 案例分析中延伸出来的一点思考,选项 Number of seconds allowed between retransmissions 供参考使用。

这篇关于Wireshark TS | DNS 案例分析之外的思考的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/840805

相关文章

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Java 正则表达式的使用实战案例

《Java正则表达式的使用实战案例》本文详细介绍了Java正则表达式的使用方法,涵盖语法细节、核心类方法、高级特性及实战案例,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录一、正则表达式语法详解1. 基础字符匹配2. 字符类([]定义)3. 量词(控制匹配次数)4. 边

Python Counter 函数使用案例

《PythonCounter函数使用案例》Counter是collections模块中的一个类,专门用于对可迭代对象中的元素进行计数,接下来通过本文给大家介绍PythonCounter函数使用案例... 目录一、Counter函数概述二、基本使用案例(一)列表元素计数(二)字符串字符计数(三)元组计数三、C

Spring Boot 整合 SSE(Server-Sent Events)实战案例(全网最全)

《SpringBoot整合SSE(Server-SentEvents)实战案例(全网最全)》本文通过实战案例讲解SpringBoot整合SSE技术,涵盖实现原理、代码配置、异常处理及前端交互,... 目录Spring Boot 整合 SSE(Server-Sent Events)1、简述SSE与其他技术的对

MySQL 临时表与复制表操作全流程案例

《MySQL临时表与复制表操作全流程案例》本文介绍MySQL临时表与复制表的区别与使用,涵盖生命周期、存储机制、操作限制、创建方法及常见问题,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随小... 目录一、mysql 临时表(一)核心特性拓展(二)操作全流程案例1. 复杂查询中的临时表应用2. 临时

MySQL 数据库表与查询操作实战案例

《MySQL数据库表与查询操作实战案例》本文将通过实际案例,详细介绍MySQL中数据库表的设计、数据插入以及常用的查询操作,帮助初学者快速上手,感兴趣的朋友跟随小编一起看看吧... 目录mysql 数据库表操作与查询实战案例项目一:产品相关数据库设计与创建一、数据库及表结构设计二、数据库与表的创建项目二:员

Android 缓存日志Logcat导出与分析最佳实践

《Android缓存日志Logcat导出与分析最佳实践》本文全面介绍AndroidLogcat缓存日志的导出与分析方法,涵盖按进程、缓冲区类型及日志级别过滤,自动化工具使用,常见问题解决方案和最佳实... 目录android 缓存日志(Logcat)导出与分析全攻略为什么要导出缓存日志?按需过滤导出1. 按

C#中的Drawing 类案例详解

《C#中的Drawing类案例详解》文章解析WPF与WinForms的Drawing类差异,涵盖命名空间、继承链、常用类及应用场景,通过案例展示如何创建带阴影圆角矩形按钮,强调WPF的轻量、可动画特... 目录一、Drawing 是什么?二、典型用法三、案例:画一个“带阴影的圆角矩形按钮”四、WinForm

DNS查询的利器! linux的dig命令基本用法详解

《DNS查询的利器!linux的dig命令基本用法详解》dig命令可以查询各种类型DNS记录信息,下面我们将通过实际示例和dig命令常用参数来详细说明如何使用dig实用程序... dig(Domain Information Groper)是一款功能强大的 linux 命令行实用程序,通过查询名称服务器并输

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、