QQ业务及协议分析
摘要:騰訊 QQ 是物聯網巨頭騰訊公司的重要用戶基礎,具備豐富細致的業務功能。本文分析了騰訊 QQ 的業務情況,介紹了 QQ 所使用的的 TCPF 協議格式,并實際抓包分析了 PC 版 QQ 的登錄和通信過程。
關鍵詞:騰訊;QQ;網絡流量分析;即時通訊;
1. 引言
騰訊公司于1998年11月成立,2004年在香港上市。騰訊公司在最近幾年中與百度、阿里巴巴并稱為互聯網三巨頭“BAT”,它上市14年,股價增長627倍(經后復權),在16年市值就突破2萬億港元,目前市值4.4萬億港元。發展至今,騰訊建立起了復雜的業務體系,包括十幾條業務線、上百種產品,并在眾多領域處于領導地位,是深刻改變了中國社會的最偉大、最受人尊敬、最強大的企業之一。
盡管業務眾多,騰訊的根基在于社交媒體,即時通訊軟件 QQ 是它的基礎,高達9億的高粘性龐大用戶流量是騰訊的核心競爭力,為其他產業的發展提供了肥沃土壤。在1999年,騰訊模仿即時通訊軟件 ICQ 開發了Opening ICQ,即 OICQ ,2000年 OICQ 更名為 QQ ,但通訊協議名稱仍然是 OICQ 。騰訊 QQ 的通信一開始使用不加密的通信,現在已經使用密鑰協商后加密消息傳輸。 QQ 的特點在于使用UDP協議來進行聊天消息通信,因為UDP協議資源消耗小,發送速度快,同時使用消息中轉服務器保證可靠傳輸。
本文在第2節中分析騰訊 QQ 的業務情況,在第3節中分析其登錄和聊天協議結構,最后在第4節中通過實際抓包實驗來驗證登錄和消息發送的協議,并在第5節總結了本文內容。
2. 業務分析
2.1 業務應用情況
騰訊 QQ 作為中國大陸用戶量最高的即時通訊軟件,支持在線聊天、視頻通話、點對點斷點續傳文件、共享文件、網絡硬盤、自定義面板、QQ郵箱等多種功能,并可與多種通訊終端相連。
QQ 的業務應用極其廣泛,可以通過它的發展歷史[3]來總結概括。騰訊 QQ 在2003年推出“QQ游戲”,進一步優化了產業營銷策略,同年 QQ 用戶注冊數升到2億。2008年,騰訊推出 DNF 黑鉆業務,開啟會員Q豆增值服務,同年注冊用戶接近8億,同時在線突破4000萬。2013年, QQ 的測試版本推出了“劍魚”全新音視頻引擎,支持高清畫質。2019年,騰訊上線了 QQ 小程序。2020年, QQ 的 PC 版更新了“群課堂”、“群作業”等功能,進一步優化了用戶體驗,解決了廣大教育用戶的緊急需要。
2019年12月, QQ 公開財報]1]數據顯示月活躍賬戶達8.07億,同比增長3.0%;智能終端月活躍賬戶數為6.998億,同比增長2.5%;2020年5月,受疫情影響, QQ 家校群已助力超過1.2億用戶開展線上教育。
2.2 使用方法
騰訊 QQ 的功能非常完備,同時具有清晰易懂的用戶界面,從官網下載安裝包后安裝到本地,即可在引導下完成可能的任何操作。而 QQ 最為方便和吸引人的功能可以參考官網[4]的展示,包括消息管理、信息共享、虛擬交友等功能。
2.3 基本模式
騰訊 QQ 的功能全面而細致,讓用戶能有很好的使用體驗。除去會員、錢包等增值功能和空間、小程序等附加功能,騰訊 QQ 的基本使用模式包括基本功能、單人聊天和 QQ 群聊。
下載、安裝與注冊、登錄,均可根據官網和引導程序快速完成。登錄后,可以添加與查找好友、進行好友管理和好友分組。 QQ 也提供安全與隱私保護等功能。
QQ 提供消息漫游功能,即可以在不同的設備上同步聊天記錄。聊天窗口可以發送表情和圖片、截圖和錄屏、錄音、撥打語音和視頻電話、發送文件和共享文件等。同時還有遠程控制、消息撤回等高級功能。
QQ 群讓多人可以同時聊天,方便開啟會議、文件共享、信息通知等。作為群主和管理員, QQ 群主要有權限設置、成員管理、發布通知和發起投票等功能。作為群成員,主要有發送和查看消息與圖片、接受通知、下載和發送文件、匿名聊天等功能。
3. 協議過程
騰訊 QQ 登錄時使用基于HTTP的TLS安全握手協議,聊天時使用文字聊天協議族(TCPF, Text Chatting Protocol Family),它主要支持與其它QQ客戶端進行文字聊天。TCPF建立在UDP協議之上,UDP數據包中的第一個字符02為這個協議族的標識。TCPF的服務器使用8000號端口,騰訊的QQ客戶端軟件一般從4000號端口開始嘗試使用,但實際上,對客戶端使用的端口號并沒有限制。
3.1 TCPF 分類
TCPF包可以被分為5類:
3.2 TCPF包結構
這一部分主要參考了PC端QQ協議說明
所有TCPF包的前7個字節是包頭,包頭可以識別TCPF包的內容。包頭的格式為:
3.3 登錄協議
這部分主要參考SSL/TLS握手過程詳解
QQ登錄過程使用SSL安全套接層的TLS安全傳輸層協議,SSL/TLS 握手是為了安全地協商出一份對稱加密的秘鑰。SSL/TLS握手過程如下圖所示:
握手第一步是客戶端向服務端發送 Client Hello 消息,這個消息里包含了一個客戶端生成的隨機數 Random1、客戶端支持的加密套件(Support Ciphers)和 SSL Version 等信息。
第二步是服務端向客戶端發送 Server Hello 消息,這個消息會從 Client Hello 傳過來的 Support Ciphers 里確定一份加密套件,這個套件決定了后續加密和生成摘要時具體使用哪些算法,另外還會生成一份隨機數 Random2。至此客戶端和服務端都擁有了兩個隨機數(Random1+ Random2),這兩個隨機數會在后續生成對稱秘鑰時用到。
這一步是服務端將自己的證書下發給客戶端,讓客戶端驗證自己的身份,客戶端驗證通過后取出證書中的公鑰。
如果是DH算法,這里發送服務器使用的DH參數。RSA算法不需要這一步。
Server Hello Done 通知客戶端 Server Hello 過程結束。
上面客戶端根據服務器傳來的公鑰生成了 PreMaster Key,Client Key Exchange 就是將這個 key 傳給服務端,服務端再用自己的私鑰解出這個 PreMaster Key 得到客戶端生成的 Random3。至此,客戶端和服務端都擁有 Random1 + Random2 + Random3,兩邊再根據同樣的算法就可以生成一份秘鑰,握手結束后的應用層數據都是使用這個秘鑰進行對稱加密。使用三個隨機數是因為 SSL/TLS 握手過程的數據都是明文傳輸的,并且多個隨機數種子來生成秘鑰不容易被暴力破解出來。
這一步是客戶端通知服務端后面再發送的消息都會使用前面協商出來的秘鑰加密了,是一條事件消息。
這一步對應的是 Client Finish 消息,客戶端將前面的握手消息生成摘要再用協商好的秘鑰加密,這是客戶端發出的第一條加密消息。服務端接收后會用秘鑰解密,能解出來說明前面協商出來的秘鑰是一致的。
這一步是服務端通知客戶端后面再發送的消息都會使用加密,也是一條事件消息。
這一步對應的是 Server Finish 消息,服務端也會將握手過程的消息生成摘要再用秘鑰加密,這是服務端發出的第一條加密消息。客戶端接收后會用秘鑰解密,能解出來說明協商的秘鑰是一致的。
到這里,雙方已安全地協商出了同一份秘鑰,所有的應用層數據都會用這個秘鑰加密后再通過 TCP 進行可靠傳輸。
4. 流量分析
本節抓取登錄騰訊QQ的流量數據,根據抓取的網絡流量分析登錄和消息傳輸協議。
4.1 實驗環境
- Windows 10 家庭版
- 騰訊QQ 9.3.3.27011
- Wireshark Version 2.6.4
4.2 登錄協議
這里交互的服務器地址為116.128.163.211查詢發現綁定過qq.com的域名,可以確認是騰訊的服務器地址:
4) 右鍵數據包,選擇“follow”->“TCP stream”,找到登錄QQ的TCP數據流:
5) 分析No.137數據包,TCP報文的開頭首先是數據鏈路層(Ethernet)報頭:
f4:83💿45:ee:6e:目的MAC地址
be:30:11:91:19:79:本機MAC地址
0800:IPv4協議
6) 分析No.137數據包,網絡層(IP)報頭:
45:0100(Version 4)+0101(報頭長度 20字節)
00:差異化服務域(differentiated services field)
00 34:總長度52字節
f3 be:標識位(62398)
04 00:標志位,非碎片化
80:生存周期(128)
06:協議(TCP)
2c a3:頭部校驗和
c0 a8 01 66:源地址192.168.1.102
74 80a3 d3:目的地址116.128.163.211
7) 分析No.137數據包,傳輸層控制層(TCP)數據:
f4 47:源端口62535
01 bb:目的端口443
21 45 ed 33:序列號0
00 00 00 00:確認號0
80:頭部長度32字節
02:標識號(SYN)
ff ff:窗口大小65535
90 32:校驗和
00 00:緊急指針
剩余的是可選字段。
8) 跟蹤TCP數據流,發現本機向服務器發送[SYN]后,服務器向本機發送[SYN,ACK]報文,本機再次向服務器發送[ACK]報文,至此TCP三次握手完畢,開始正式通訊。
9) 本機向服務器發送TLS報文,內容是Client Hello,這是一個登陸服務器的握手協議。傳輸層安全(Transport Layer Security,TLS)是為網絡通信提供安全及數據完整性的一種安全協議。TLS與SSL在傳輸層對網絡連接進行加密。
10) 服務器回復[ACK]并發送Server Hello,Server Hello以分段segment形式發送了好幾個包,包括Certificate 和最后的 Server Key Exchange ,中間穿插本機對每個包的[ACK]應答:
查看最后一個certificate數據包,即151號報文,Wireshark顯示它由3個TCP分段(147、149、151)組成,而SSL層是TLSv1.2加密的握手協議:
查看152號報文,交換Server參數,這里使用了Diffie-Hellman算法,需要交換算法參數
11) 到此,密鑰已協商完畢,客戶端和服務器端互相通知Change Cipher Spec(表示之后使用加密傳輸),并使用Encrypted Handshake Message表示這是協商好密鑰之后第一條加密消息,以驗證交換的密鑰無誤。
12) 本機在155號報文中交換客戶端密鑰,如下圖所示,并通知服務器
13) 服務器在156號報文中發送了Session Ticket,以保持一個會話,避免每次通話都要進行密鑰協商:
14) 本機客戶端通過協商好的密鑰加密了登錄信息,發送Application Data給服務器,服務器回復[ACK]之后也發送加密的Application Data,確認登錄成功。
TLS加密的應用數據報文如下:
15) 此時已經登錄完畢,服務器端發送[FIN,ACK]結束會話,客戶端回復[ACK]再發送[FIN,ACK]確認結束,服務器回復[ACK],TCP四次握手結束會話。
4.3 消息傳輸
根據之前分析的QQ協議格式,可以逐字節分析:
02:TCPF包識別碼
39 2b:客戶端版本號
00 81:命令標識(129)
56 3b:命令序列號(22075)
55 ec 71 6f:客戶的QQ號碼(144********)
后面的5a~d8可能是一些附加數據,加密無法解析,不得而知了。
03:TCPF包結尾標識符
參考文獻
[1] 騰訊QQ,騰訊最新財報:QQ年輕用戶月活躍同比增長13%,Available: https://zhuanlan.zhihu.com/p/59986430
[2] 騰訊科技,騰訊2020年Q1財報:QQ每日總消息數及使用時長同比雙位數增長,Available:https://tech.qq.com/a/20200513/066084.htm
[3] 百度百科,QQ,Available:https://baike.baidu.com/item/QQ
[4] 騰訊QQ,QQ·PC版,Available:https://im.qq.com/pcqq/
[5] Cisco,NBAR2 Protocol Pack 22.0.0 Chapter: Protocols: Q, R,Available: https://www.cisco.com/c/en/us/td/docs/ios-xml/ios/qos_nbar/prot_lib/config_library/pp2200/nbar-prot-pack2200/nbar-prot-pack2200_chapter_01111.html#wp2970606887
總結
- 上一篇: Hudson poll scm 时间格式
- 下一篇: Centos8[Linux]下载安装qq