写在前面
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呢?
我猜测有两个原因:
- 技术层面:
udp也可以做超时重传,ACK确认,确保消息不丢失,这是保证服务可用性和稳定性的最低标准。只不过不需要像tcp那样三次握手,维持长链接。
- 历史原因。
从这两款软件发布时间我们可以知道。微信发布于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