网络分析实践之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 协议,整体上并不复杂,非常适合初学者练手。在抓包,分析的过程中,不知不觉中便强化了知识的记忆。