一、打开QQ客户端,出现登录界面并查看相关进程
启动QQ客户端后,使用如下命令查看本机所有网络连接的详细信息:
netstat -ano
通过筛选掉 127.0.0.1 的本地回环地址,可以锁定与外部通信的QQ进程。如下图所示,PID为 20136 的进程处于 ESTABLISHED 状态,使用的是 TCP 协议,并连接了外部端口号为 32176 的服务。
二、点击登录,再次查看进程信息
登录操作完成后,观察到如下变化: •系统中新增加了两个与 QQ 相关的进程; •原先 PID 为 20136 的进程新增了两个 ESTABLISHED 状态的 TCP 连接。
这说明 QQ 在登录后与多个服务器建立连接以维持服务。
三、选择一位好友,打开其聊天窗口
进一步操作——打开某位好友的聊天窗口。再次执行 netstat -ano,发现: •新增了一个 QQ 子进程; •但只有 PID 为 20136 的进程仍然显示活跃的网络连接,说明实际网络通信由此主进程统一完成。
与QQ相关的进程只有PID为20136这一个有网络状态的显示
四、在wireshark中添加过滤信息,进行抓包分析
在向好友发送两条文字消息后,Wireshark 显示出每条消息会触发 4 个 TCP 包:
PSH + ACK
ACK
PSH + ACK
ACK
五、打开wireshark的追踪流的TCP Stream
使用 Wireshark 的 Follow TCP Stream 功能,可以聚焦分析 QQ 与服务器之间的完整通信会话。
在其中看见了自己的QQ号2286581631
图中红色部分为本机发出的数据,蓝色表示本机收到的消息。
出现了Hearbeat.Alive心跳请求
心跳请求是客户端和服务器之间定期发送的一种“保活消息”,用于检测双方是否还在线、网络连接是否仍然有效,间隔一段时间发出一个包,如果对方回应,就说明连接还活着。
还出现client_conn_seq和后面的数字,是客户端连接序列号
但是数据本体已通过加密,无法直接获取明文内容。
六、总结
通过本次实验抓包分析可以确认,QQ客户端的文字消息传输是基于TCP协议实现的。这体现在以下几个方面:
Wireshark 抓包显示消息传输由多个 TCP 报文构成: 每发送一条文字消息,都会产生多个 TCP 数据包,依次完成数据推送(PSH)、确认(ACK)等步骤,体现出 TCP 的可靠性和有序传输特性。
使用 TCP Stream 追踪通信会话: Wireshark 中的 “Follow TCP Stream” 功能仅适用于 TCP 连接,而我们成功通过此功能观察到 QQ 消息通信过程,进一步验证其基于 TCP。
因此可以明确,QQ 的聊天协议(不论是否加密)是建立在 TCP 传输层之上的应用层协议。
尽管具体应用层协议未公开,但其底层传输通道可以明确为 TCP。