网络分析实践之Dukto

最近在学习 wireshark 抓包进行网络分析,粗略地翻阅了几本相关的书籍后总感觉影响不够深刻,对于工具性的技术,最好的办法就是在实践中运用。刚好一直对于一直在用的一个工具Dukto的工作原理一直比较好奇,今天就来通过 wireshark 一探究竟。
Dukto是一款用于局域网文本/文件传输的小工具,自带局域网发现功能。本文主要分析Dukto如何实现局域网发现和数据传输。

抓包

第一次打开 wireshark 兴致勃勃的准备抓包时,发现满屏的包不断地刷新,根本就无法找到想要的包。怎么样过滤掉无关软件的包呢,难道要把软件一个一个关闭么?此时我注意到很多数据包都是从本地的某几个端口发出的,只要知道这几个端口是哪个软件占用的,然后把对应的软件退出就可以了。在 Linux 下我们可以通过sudo netstat ano | grep [<本地端口号>]命令获取端口对应的程序。经过处理后,干扰数据包少了很多。
下面是过滤后的抓包结果。相关的 wireshark 抓包文件可点此下载
Wireshark抓包结果
操作流程是先开启 Wireshark 抓包,然后运行电脑(IP: 192.168.100.19)上的 Dukto,接着运行手机(IP: 192.168.100.15)上的 Dukto,然后在电脑端向手机端的 Dukto 发送一串文本123,最后先关闭手机端的 Dukto,再关闭电脑端的 Dukto。

分析

局域网发现

首先我们先分析 Dukto 是如何进行局域网发现的。下图是对上面抓取的包进行二次过滤的结果。
Dukto局域网发现数据包
首先可以看到电脑先向 192.168.100.255 发送了两个一模一样的 UDP 数据包(序号为 1 和 2),使用的端口号为 4644,目标端口也是 4644,数据包中的内容为Xyz1001 at xyz1001-pc (Linux),其中包含了我的用户名(Xyz1001),设备名(xyz1001-pc)和操作系统(Linux)。这里用到了 UDP 广播。其中 192.168.100.255 是广播地址,由本机 IP 和子网掩码相与得到。发往该 IP 的 UDP 数据包都会被发送给同一子网下的所有设备的给定端口,这个特点经常被用来做局域网发现。这里一个值得注意的点是 Dukto 发送了两个相同的 UDP 广播数据包,这个可能是为了避免丢包导致无法发现。发送多个重复的 UDP 数据包来减少丢包率是一种比较常见的处理方式。由于此时同一子网下的其他设备并没有运行 Dukto,因此这两个包发出去后没有任何回复。
然后手机端的 Dukto 被运行,同样向广播地址发送了 UDP 广播(序号为 16)。内容为User at ONEPLUS-A5000 (Android),和电脑端大同小异。这里我们发现和电脑的 Dukto 相比,手机端的 Dukto 只发送了一个 UDP 广播,注意到电脑端的 Dukto 发送的两个 UDP 广播之间存在 370 毫秒的延时,猜测可能是如果发送了一个 UDP 广播后一段时间内没有收到任何回复,那么就在发送一个确保不是由于丢包导致。而手机端的 Dukto 在发出第一个 UDP 广播后,很快(不到 1 毫秒)就收到了来自电脑端 Dukto 的回复(序号为 17),因此也就没有必要再发送一次 UDP 广播。当然也可能是手机端的 Dukto 在实现上就只会发送一个广播包。在收到手机端 Dukto 的广播后,电脑端的回复和其发出的 UDP 广播是相同的。此时在电脑端和手机端的应用上都出现了对方的设备信息。
接着在发送数据后我关闭了手机端的 Dukto,可以看到手机端的 Dukto 向广播地址发送了一个数据内容为Bye Bye的广播包(序号为 46)。电脑端的 Dukto 在收到这个包后将这台设备从设备列表中移除了。
最后我关闭了电脑端的 Dukto,其发送了两个 Dukto 广播包(序号为 47 和 48),内容和手机端 Dukto 退出时的相同。

数据传输

然后我们分析 Dukto 是如何进行数据传输的。我们可以通过追踪流->TCP流的方式进行过滤。
Dukto数据传输数据包
前三个包(序号 38,39,40)是典型的 TCP 三次握手,不再赘述。三次握手后,电脑端向手机端发送了一个包含了发送数据类型的包,内容为___DUKTO___TEXT___,表示接下来要发送文本内容。接下来的包既是一个数据包,也是一个断开连接时的挥手包。这个包包含了是真正要发送的数据,也就是字符串123,为了提高效率,这里将两个包合并了。这也说明 Dukto 是在要发送数据时临时创建一个 TCP Socket,数据发送完成时便立即关闭。这样可能效率上会低一点,但由于不用一致保持一个 Socket 连接,资源占有率会低一些。

其他

在整个过程中还有很多其他的数据包,值得注意的有两处,一处(序号 3-13)是刚启动时 Dukto 会查询www.msec.it的 DNS 地址,并请求了http://www.msec.it/dukto/r5check.php?ver=6.0&locale=zh_CN&os=linux&osver=这个网址,猜测可能是用于检测更新。
另一处(序号 18-33)是在手机端 Dukto 启动并发现后不久,有多次手机端向电脑端 4645 端口请求建立连接但三次握手失败的数据包。经查看,电脑端 Dukto 并没有监听 4645 端口,这里的原因不得而知。

结论

经过 Wireshark 抓包,终于对 Dukto 的一个大致实现原理有了了解,其局域网发现利用了 UDP 广播的特性,数据传输使用了基本的 TCP 协议,整体上并不复杂,非常适合初学者练手。在抓包,分析的过程中,不知不觉中便强化了知识的记忆。

文章目录
  1. 1. 抓包
  2. 2. 分析
    1. 2.1. 局域网发现
    2. 2.2. 数据传输
    3. 2.3. 其他
  3. 3. 结论
|