当前位置: 首页 > news >正文

Wireshark 解析QQ、微信的通信协议|TCP|UDP

写在前面

QQ,微信这样的聊天软件。我们一般称为im,Instant Messaging,即时通讯系统。那大家会不会有疑问,自己聊天内容会不会被黑客或者不法分子知道?这种体量的im是基于tcp还是udp呢?这篇文章我们就来探索这两个疑问。
在这里插入图片描述
涉及两个及其以上的聊天功能就是即使通信系统,做过im系统的同学都知道,这类系统大多是基于TCP来维持长链接,保证可靠传输来进行通信的。根据常识我们知道,TCP是可靠传输,而UDP是尽最大努力交付。对于即时通信这类实时性很强且不能丢数据的系统,也理所应当用TCP来做可靠传输,保证自身数据不丢失。

在这里插入图片描述

但真的是这样吗?我们来对微信和qq做一次实验。用wireshark来抓包看一下这个是什么协议!前排提示,我们只是针对消息发送讨论,不包括视频,文件等通讯方式。

微信抓包

使用wireshark来抓取数据包,电脑使用Wi-Fi连接,所以我们选择WIFI。开始抓包,扫码登录pc端微信,我们可以看到一次很明显dns请求。
在这里插入图片描述
接着就发现了大量的TCP连接,这些长链接推断应该是和聊天窗口进行建立tcp长链接。
在这里插入图片描述

连续发送几条消息测试发现都显示的是 ip地址,不太直观,所以我们可以先设置将ip映射成域名,再做一次测试,这次就明显很多了。
在这里插入图片描述
接着我们再测试发送消息,在这过程中可以看到大量的tcp链接。我们随便看一个数据包,可以发现聊天信息其实是加密传输的,如果要破解就必须知道加密算法和密钥。所以大家不用担心自己的聊天消息被别人截取。

在这里插入图片描述

同时我们可以暂时敲定,微信的文字聊天功能是基于TCP实现的

QQ 抓包

ok!既然微信已经可以确定是基于TCP了。那QQ是不是也是TCP呢?还是一样使用wireshark抓几个数据包。注意我们这里输入ociq,将qq的消息体筛选出来。

在这里插入图片描述
出现了, 居然是UDP,我们打开一个udp的包看一下,emmm,双击,就能看到QQ号。当然消息也是加密的,所以看不出来。但也能初步推断出qq是基于udp通信的。
在这里插入图片描述

这时候就有彦祖会问了?欸!udp不是仅最大努力通信吗?可能丢失数据呀?! udp其实在游戏,视频通信、文件传输用的多。

猜想

但为什么qq用的是udp呢?

我猜测有两个原因:

  1. 技术层面:udp也可以做超时重传,ACK确认,确保消息不丢失,这是保证服务可用性和稳定性的最低标准。只不过不需要像tcp那样三次握手,维持长链接。
  2. 历史原因。

从这两款软件发布时间我们可以知道。微信发布于2011年1月10号,qq发布于 1999 年 2 月 10 日 。好家伙,qq比我还老。
在这里插入图片描述
在qq发布的那个年代,国内的网络基建比较薄弱, 如果用tcp,会经常出现大量三次握手的重连,而大量的重连,也会导致网络更加拥堵。 同时当时的io多路复用、分布式技术也不成熟,维持长链接的成本为很高。
在这里插入图片描述

udp则没有这些繁琐的连接过程,更加符合当时的网络环境。

在这里插入图片描述

问题又来了,20年来,QQ就没打算重构吗?把udp换成tcp嘛?
这个我也不知道。但是从QQ的发展路线我们猜测,估计是QQ打算重构的时候,发现已经重构不动了。互联网的流动性还是很强的。早期的互联网,没有现在的互联网这么规范,包括文档、注释、CR等等。一开始的QQ很难变现,甚至出现了贱卖的情况。自从有了变现途径后,就会专注于变现,而回过头来发现自己的核心模块已经是动不了的大山。

当然这也只是猜测,我也不是腾讯员工,不清楚为啥没重构成TCP。不过也有可能是厂内的udp生态很完善,毕竟游戏大厂,既然UDP也能用,还用的挺好的,也没重构成TCP的必要。

那为啥微信又是TCP呢?微信诞生的年代,网络条件、公司财力、技术架构都比10年前的那个小企鹅强大太多了!

总结

QQ的文字聊天基于UDP、微信的文字聊天基于TCP。

参考

https://www.cnblogs.com/zhaojinhui/p/16802391.html

http://www.lryc.cn/news/452381.html

相关文章:

  • 网络编程(5)——模拟伪闭包实现连接的安全回收
  • C#绘制动态曲线
  • 用Python实现运筹学——Day 10: 线性规划的计算机求解
  • [C++]使用C++部署yolov11目标检测的tensorrt模型支持图片视频推理windows测试通过
  • 霍夫曼树及其与B树和决策树的异同
  • CompletableFuture常用方法
  • 本地化测试对游戏漏洞修复的影响
  • 使用rust实现rtsp码流截图
  • Cpp::STL—string类的模拟实现(12)
  • 一文搞懂SentencePiece的使用
  • 一个简单的摄像头应用程序1
  • 通过PHP获取商品详情
  • 【Android】获取备案所需的公钥以及签名MD5值
  • 看480p、720p、1080p、2k、4k、视频一般需要多大带宽呢?
  • 解决IDEA中@Autowired红色报错的实用指南:原因与解决方案
  • 408知识点自检(一)
  • 负载均衡--相关面试题(六)
  • 【Unity踩坑】Unity更新Google Play结算库
  • Redis:hash类型
  • 力扣9.30
  • kafka下载配置
  • nlp任务之预测中间词-huggingface
  • 《程序猿之Redis缓存实战 · Redis 与数据库一致性》
  • 【无标题】observer: error while loading shared libraries: libmariadb.so.3处理办法
  • 极客兔兔Gee-Cache Day1
  • [MAUI]数据绑定和MVVM:MVVM的属性验证
  • 2024年水利水电安全员考试题库及答案
  • 【快速删除 node_modules 】rimraf
  • 毕业设计选题:基于ssm+vue+uniapp的教学辅助小程序
  • 13-指针和动态内存-内存泄漏