作者姓名:楊忠勛 作者簡介:專業(yè):計算機軟件開發(fā)與應用 個人網站:http://zhongxunyang.yeah.net Email:zhongxunyang@yahoo.com.cn Oicq:171704474 調試環(huán)境:VB6.0
你用VB已經有很長時間了,一直疑惑MSN是如何工作的。現(xiàn)在你不用再為這個問題苦惱了,這篇文章不僅告訴你MSN是如何工作的,甚至還告訴你如何用VB編出你自己的MSN即時通訊軟件。
我們可以把MSN的工作機制分成兩個階段: 認證階段 認證階段包括登陸到MSN即時通的服務器并且取得好友列表 即時通訊階段 即時通訊階段包括發(fā)送/接受進入即時通訊階段的請求和發(fā)送/接受消息。
MSN即時通訊軟件的協(xié)議是基于ASCII碼的協(xié)議,用其他話來講就是所有的命令都必 須是英文的!第一個階段包括連接到MSN即時通軟件的服務器。在這個階段我們應該連接 到服務器“messenger.hotmail.com”的1863端口(MSN即時通訊軟件通過1863端口進行工作)。一旦連接上以后,我們就應該開始登陸過程了。此過程的第一步是驗證MSN的版本。在此步中,客戶端(即你的MSN軟件)列出及向服務器發(fā)送它可以支持的版本,然后等待服務器的回應。 VER 0 MSNP7 MSNP6 MSNP5 MSNP4 CVRO 在MSN協(xié)議中,伴隨著每個命令都有一個“試驗ID”被發(fā)送。此實驗ID從0開始,并且當每次服務器成功的對客戶端的命令做回應時,都會增加。
服務器的回應如下 VER 0 MSNP7 MSNP6 MSNP5 MSNP4 現(xiàn)在客戶端(MSN)和服務器之間確定了它們之間將要進行通訊的版本。
下一步客戶端(MSN)向服務器發(fā)送一個請求,要求服務器提供它所支持的認證時需要的安全包的名字。 INF 1 不像ahoo,Rediff和其它的一些即時通訊軟件,MSN在發(fā)送密碼時會將密碼加密,保證如有人監(jiān)控你的端口時,密碼不會輕易的泄露。
服務器的回應如下 INF 1 MD5 (MD5在這里是服務器當前支持的安全包的名字)
下一步客戶端(MSN)將向服務器發(fā)送用戶ID USR 2 MD5 I venky_dude@hotmail.com 然后服務器將檢驗它是否包含有驗證所需的此用戶的所有相關信息。如沒有的話,服務器將會發(fā)送如下回應: XFR 2 NS 64.4.13.55:1863 0 意思為客戶端(MSN)應該連接到NOTIFICATION服務器,地址和端口分別為64.4.13.55,1863. 我們關閉當前的連接并且在連接到新的服務器64.4.13.55時重復以下步驟 (客戶端)VER 3 MSNP7 MSNP6 MSNP5 MSNP4 CVRO (服務器)VER 3 MSNP7 MSNP6 MSNP5 MSNP4 (客戶端)INF 4 (服務器)INF 4 MD5 (客戶端)USR 5 MD5 I venky_dude@hotmail.com 現(xiàn)在我們連接上的服務器有了此嘗試登陸的用戶的信息.服務器回應如下: USR 5 MD5 S 989048851.185113730 服務器發(fā)送的此字符串是“MD5 雜亂信息”.此雜亂信息由服務器創(chuàng)建并且在認證過程中使用.客戶端然后向服務器發(fā)送使用MD5運算法加密后的密碼.實際上客戶端向服務器發(fā)送的是一個獨一無二的MD5字符串,此字符串等價于此“MD5雜亂信息”(即989048851.185113730)+密碼.結果如下 3b7926d277068ec49576a0c40598ff21 USR 6 MD5 S 3b7926d277068ec49576a0c40598ff21 如果密碼正確,服務器將做如下回應: USR 6 OK venky_dude@hotmail.com venkat 此處“venkat”是用戶的呢稱. 在此協(xié)議的最新版本中,服務器將發(fā)送一些附加的數(shù)據(jù),像用戶的信息和一個認證碼(類似于一個cookie,可以用到許多其它的功能中)
MSG Hotmail Hotmail 362 MIME-Version:1.0 Content-Type:text/x-msmsgspro file;charset=UT Login Time:1011252477 EmailEnabled:1 MemberIDHigh:84736 MemberIDLow:-143472939 Lang_preference:103 PreferredEmail:venky_dude@hotmail.com Country:IN PostalCode: Gender:M Kid Age:22 Sid:517 Kv:2 MSPAuth:2AAAAAAAADU0p4uxxxJtDJozJS1UTS0i7YpwnCoPUHRv56YKxxxCTWmg$$ 現(xiàn)在我們登陸上了服務器,但是我們的狀態(tài)仍然是離線.為了能夠發(fā)送和接受信息,我們需要把我們的狀態(tài)改成在線.客戶端通過如下命令完成這步: CHG 7 NLN 服務器則向客戶端發(fā)送回在線的好友及其相應的狀態(tài). ILN 7 NLN btxxxe@hotmail.com nick (NLN:Now online 即當前在線) ILN 7 AWY wmxxe@hotmail.com mike (AWY:Away 即離開) ILN 7 BSY tehpxxp@hotmail.com jerry (BSY:Busy 即忙碌) MSG Hotmail Hotmail 223 MIME-Version:1.0 Content-Type:text/x-msmsgsinitialemailnotification;charset=UTF-8 Inbox-Unread:293 Folders-Unread Inbox-URL:/cgi-bin/HoTMaiL Folders-URL:/cgi-bin/folders Post-URL:http://www.hotmail.com
向服務器發(fā)送的下一個命令是和當前使用的客戶端的版本相關的.客戶端向服務器發(fā)送它的版本號和所在機器的信息像*作系統(tǒng)和其配置等 CVR 8 0x0409 win 4.10 i386 MSMSGS 4.5.0127 MSMSGS 0x0409 win4.10 i386 指出客戶端當前的運行環(huán)境是win98,使用的是Intel的微處理器. MSMSGS 4.5.0127 MSMSGS 指出msmsgs.exe的版本號 服務器回應提供下載最新版本及一些其它的信息的地址\ CVR 8 4.5.0127 4.5.0127 1.0.0863 http://download.microsoft.com/do ... /en-us/mmssetup.exe http://messenger.microsoft.com
這個CVR命令的發(fā)送并不是必須的,無論此命令是否發(fā)送,MSN協(xié)議都可以正確的工作.
為了獲得我們的好友列表,我們可以發(fā)送如下命令 LST 9 RL 服務器將相應發(fā)送回“反向列表”,此反向列表為當你在線時,可以看到你并能向你發(fā)送即時消息的用戶列表.你也可以使用 LST 9 FL命令向服務器請求“正向列表”.此正向列表包括你加入到好友列表中的所有好友.服務器所做的回應如下 LST 9 RL 69 1 19 venky_dude@hotmail.com venkat LST 9 RL 69 2 19 puxxxxx@hotmail.com puja LST 9 RL 69 3 19 vancxxxx@hotmail.com ramachandran LST 9 RL 69 4 19 moxxxxx@hotmail.com chandramouli LST 9 RL 69 6 19 v_n_xxxx@hotmail.com Narakatesh …………………. LST 9 RL 69 19 19 puneetagarxxx@hotmail.com puneet
*一旦有好友上線時,服務器(NS)將向我們發(fā)送如下命令 NLN 10 NLN deaxxx@hotmail.com Venkatesh 相反,如果有好友下線時,服務器將向我們發(fā)送如下命令 FLN 10 FLN deaxxx@hotmail.com Venkatesh 在MSNP7中,MSN引入了一個新的口令認證機制.MSN服務器向用戶發(fā)送一個口令鑰,用戶必須正確的認證此口令鑰才能使此過程繼續(xù)進行下去. CHL 0 20881396011366812350
客戶端必須向服務器發(fā)送一MD5,此MD5為以上的“雜亂信息”后附加上字符串“Q1P7W2E4J9R8U3S5”.因此最終向服務器發(fā)送的MD5字符串為 20881396011366812350Q1P7W2E4J9R8U3S5 因此客戶端的回應如下 QRY 18 msmsgs@msnmsgr.com 32 0212eaad0876afb8505859ca75d21a78 此處18為實驗ID,用你的實際實驗ID代替18. 如果認證正確,服務器將做出如下回應 QRY 18
在MSN里的即時通訊是基于session的。想進行對話的兩個人必須在session模式當中。除非我們同其他用戶開始一個聊天session,否則我們是不能發(fā)送/接受信息的。 基本上有兩種途徑可以使一個用戶處于一個聊天session中 .1 用戶向另一個用戶發(fā)送一個聊天session請求 2 用戶接收從另一個用戶那里發(fā)送來的聊天session請求 接下來將分別詳細介紹這兩種途徑
用戶向另一個用戶發(fā)送一個聊天session請求 客戶端(用戶)向服務器發(fā)送一個命令,以獲取接線總機(SwitchBoard)服務器的地址.所有的即時通訊交談都必須通過接線總機服務器實現(xiàn)。
XFR9 SB 此接線總機服務器返回此服務器的ip地址,連接端口,和一個CKI雜列。CKI 是一個安全包,用戶必須使用此CKI雜列連接上接線總機服務器。
XFR9 SB 64.4.13.88:1863 CKI1989487642.2070896604 現(xiàn)在這次我們將向接線總機服務器進行一次新的連接。而且我們上次對MSN即時通服務器的連接必須要保持,否則我們將會登出。
在我們連接上接線總機服務器之后,我們將向此接線總機服務器發(fā)送以下命令: USR 1 venky_dude@hotmail.com 989487642.2070896604 如果我們發(fā)送的這個CKI雜列正確的話,接線服務器將會返回 USR 1 OK venky_dude@hotmail.com venkat 當以上做完之后,接下來這個用戶要做的就是要把另一個用戶”叫到”此聊天session中了,這可以通過發(fā)送下面的命令完成 CAL 2 deadxxx@hotmail.com 服務器將會向此用戶回應一個session號,同時也會將此session號發(fā)送給另一個用戶。 如果另一個用戶準備好聊天,并向做出回應時,服務器將向我們發(fā)送如下命令
JOI deadlee@hotmail.com Venkatesh 這條命令表示另一個用戶加入了聊天當中,我們現(xiàn)在可以接受和發(fā)送信息了
用戶接收從另一個用戶那里發(fā)送來的聊天session請求 當我們被一個用戶邀請到一個聊天session中時,認證服務器將向我們發(fā)送如下的信息. RNG 11742066 64.4.13.74:1863 CKI 989495494.750408580 deaxxxx@hotmail.com Venkatesh 上面的命令包含了session號,接線服務器的ip地址,端口,CKI雜列及向我們發(fā)出交談請求的用戶信息。 現(xiàn)在我們將向接線服務器進行一次新的連接。同樣我們上次對MSN即時通服務器的連接必須要保持,否則我們將會登出。
我們連接上接線服務器,并且發(fā)送如下命令
ANS 1 venky_dude@hotmail.com 989495494.750408580 11742066 上面的命令包含了我們的登陸名,我們接收到的CKI雜列和session號. 服務器將回應如下信息 IRO 1 1 1 deaxxxx@hotmail.com Venkatesh 和 ANS 1 OK 我們現(xiàn)在就可以發(fā)送和接收信息了。
在我們發(fā)送和接收信息之前,讓我們了解一下信息是如何創(chuàng)建的 我們發(fā)送信息時,將首先建立一個頭信息如下所示 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif; EF=; CO=0; CS=0; PF=22
然后使用如下的方式發(fā)送 MSG2 N137 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif; EF=; CO=0; CS=0; PF=22
hello 其中2是測試號,我們每發(fā)送一次信息,此號就會隨著增加。137是指我們發(fā)送信息的長度。在上面的例子中就是頭信息和我們發(fā)送的信息”hello”的長度。
我們發(fā)送的信息和上面的例子是差不多的。
下面是我們接受到的一個信息的例子 MSG deaxxxx@hotmail.com Venkatesh 137 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 X-MMS-IM-Format: FN=Microsoft%20Sans%20Serif; EF=; CO=0; CS=0; PF=22
hello
當另一用戶正在輸入信息時,我們會收到如下信息 MSG deaxxxx@hotmail.com Venkatesh 100 MIME-Version: 1.0 Content-Type: text/x-msmsgscontrol TypingUser: deaxxxx@hotmail.com
我猜你們對如何編寫出自己的MSN即時通訊軟件已經有了大致的了解。我將會在以后對MSN的通訊協(xié)議繼續(xù)進行補充,增添一些附加的功能比如增加/刪除擁護,重命名,文件傳輸及語音聊天。
參考資料 微軟發(fā)布的MSN的通訊協(xié)議 http://www.tlsecurity.net/Textwa ... ger-protocol-00.txt MD5官方網站 http://userpages.umbc.edu/~mabzug1/cs/md5/md5.htm
譯者注:如大家需要Msn_Clone的源代碼,請發(fā)電子郵件給我。也歡迎大家到WAP開發(fā)論壇http://ai2.yeah.net參與討論
|