相关原理:

TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。

QQ的文件发送是怎样的过程呢?通常,发送文件的计算机首先要通过消息服务器将其IP地址发送给接收计算机,当接收计算机同意接收的确认消息反馈到消息服务器后,消息服务器将据此设置好文件传输对话。随即,发送计算机与接收计算机就会在确定好的端口范围内,建立起TCP或UDP连接开始文件的检索与传输。

在默认状态下,QQ优先采用了UDP(User Data Protocol,用户数据报协议)协议传送数据,而对可靠性要求高的数据通讯系统往往使用TCP协议传输数据。与TCP协议不同,UDP协议并不提供数据传送的验证机制——在整个文件传输过程中如果出现数据报的丢失,协议本身并不能作出任何的检测或提示。因此,通常人们把UDP协议称为不可靠的传输协议。 UDP协议适用于无须应答、要求时效的软件使用,这样的设计正好与QQ追求的目标相符,所以QQ优先使用了此协议进行一切功能应用。但是,由于UDP协议具有不可靠性,常会因种种原因导致消息或数据的发送失败(很多时候会发现发送文件给对方接收时,对方根本收不到要求接收文件的消息。或是发送聊天消息时,对方根本没有收到过消息)。显然,UDP协议由于排除了信息可靠传递机制,将安全和排序等功能移交给上层应用来完成,极大降低了执行时间,使速度得到了保证。QQ在数据传输上更注重实际性能,为了获得更好的使用效果,往往可以牺牲一定的可靠性。因此,使用QQ来传输数据,在很多时候就成了一个“不错”的选择。(来自互联网)

测试环境:

将手机与电脑连接至同一局域网中。

  • 手机IP:192.168.31.216

    Screenshot_20221004_140105

  • 电脑IP:192.168.31.182

    QQ截图20221004140012

Wireshark抓包

启动WireShark,选择WLAN过滤器:

QQ截图20221004132831

在过滤器中输入:ip.src == 192.168.31.216以捕获/过滤指定ip地址(手机)数据包。

12345664556

此时,我们在手机上发送一张图片给电脑,我们可以看到Wireshark捕获了大量数据包。其中这一项就是我们刚刚发送的图片:

QQ截图20221004135150

右键,选择“追踪流=>TCP流”

QQ截图20221004135442

数据格式选择“原始数据”,然后将其另存为新文件。

QQ截图20221004135514

数据还原

使用16进制编辑器(如WinHex)打开文件,找到jpg格式图片的文件头FF D8 FF,并把文件头前面的数据删除:

QQ截图20221004135748

保存后,将文件后缀改为.jpg,至此,文件得以还原:

QQ截图20221004135901