TCPF包結構
TCPF包我們把它分為5類:
1)、登錄請求包(LIP,LogIn Packet),它是由客戶端向伺服器發出登錄請求的數據包。
2)、登錄應答包(LRP,Login Reply Packet),它是由伺服器回響客戶端登錄請求的數據包。
3)、註銷請求包(LOP,LogOut Packet),它是由客戶端向伺服器發出註銷登錄請求的數據包,伺服器對這個包不作應答。
4)、客戶端其它包(CSP,Client Sent Packet),它是由客戶端向伺服器傳送的其它包。
5)、伺服器其它包(SSP,Server Sent Packet),它是由伺服器向客戶端傳送的其它包。
包頭:
0)、所有TCPF包的前7個位元組是包頭,包頭可以識別TCPF包的內容。包頭的格式為:
1)、第0位元組:TCPF包標識:0x02。
2)、第1-2位元組:傳送者標識。如果是0x01 0x00,表明是由伺服器傳送。客戶端的標識與所使用的使用的QQ版本有關,目前最新版本QQ2003(0808)的標識為0x0A 0x1D。具體的協定的格式與這個欄位所標識的客戶端版本有關。目前我們以這個最新的0A1D版本來討論。
3)、第3-4位元組:命令編號。具體的命令編號含義在《QQ協定概述》(Protocol Overview.rtf)中有描述。如果這個欄位是0x00 0x01,那么這是一個註銷請求包。如果這個欄位是0x00 0x22,而傳送者標識是0x01 0x00,那么這是一個登錄應答包。如果這個欄位是0x00 0x22,而傳送者標識是其它(例如0x0A 0x1D),那么這是一個登錄請求包。其它的命令代碼表明是其它包,我們通過傳送者標識來區分它是CSP還是SSP。
4)、第5-6位元組:命令序列號。客戶端和伺服器都有各自的當前傳送序列號。每初始發出一個指令的時候,使用當前的序列號,然後把當前序列號加一,如果超過0xFFFF,就繞回。如果是回響對方發出的命令,則使用這個命令的序列號。例如,客戶端當前的序列號為0x1110,它向服務傳送一個0x0016命令,它使用0x1110這個序列號,伺服器收到以後,返回一個序列號為0x1110的0x0016命令回響。下一次,客戶端又傳送一個0x0026命令,這一次它使用加一了的序列號0x1111,伺服器也回響0x1111序列號的一個0x0026命令回響。如果這是伺服器要向客戶端傳送0x0017命令,它使用它自己的當前序列號,比如說0x2220,客戶端收到以後,也回響一個序列號為0x2220的0x0017命令應答。我們可以通過序列號來判斷發出的指令是否已經得到了應答,如果沒有,可以重發。伺服器對收到的命令的序列號順序沒有要求。伺服器也不會一定按照發出的順序給予應答。
包尾:
所有的TCPF包都以0x03作為包尾。在包頭和包尾中間的包數據則不同類型的包有所不同。
0x0001註銷登錄
0x0002心跳信息
0x0004更新用戶信息
0x0005搜尋用戶
0x0006獲取用戶信息
0x0009不需認證方式添加好友
0x000a刪除好友
0x000b需要認證的方式添加好友
0x000d設定隱身、示忙等狀態
0x0012確認收到系統訊息
0x0016傳送訊息
0x0017收到訊息(伺服器發起)
0x001a未知作用。
0x001c在對方好友列表上刪除自己
0x001d未知作用。
0x0022登錄
0x0026獲取好友清單
0x0027獲取線上好友
0x0030群操作指令
0x0080收到系統訊息(伺服器發起)
0x0081收到好友狀態改變訊息(伺服器發起)