MSN Protcol(MSNP8/9):
参考资源:
MSN Messenger Protocol
ConnectingToMSN
利用MSN协议开发 (豆腐的平静生活)
如何用VB编写你自己的MSN即时通讯软件(MSNP7以下版本)
MSN Messenger协议--概况
MSN Messenger协议--命令一览
有这些东西,基本上可以开始着手理解MSN协议了。
使用 工具(Ultra Network Sniffer,其实下面的代码是我自己编程截获的,所以不全,原因是Sniffer导出的
文本不太直观。呵呵,不过Sniffer的功力确实厉害,比这全面的多。)先把MSN的TCP/IP包截获出来看
看,有个大概的印象:(>>>代表上行; <<<代表下行;)
>>> VER 0 MSNP9 CVRO
<<< VER 0 MSNP9
>>> CVR 1 0x0409 win 4.10 i386 MSNMSGR 5.0.0544 MSMSGS kevin27_wjj@hotmail.com
<<< CVR 1 6.1.0211 6.1.0211 5.0.0527 http://download.microsoft.com/download/8/3/C/83C4B2DB-AC1C-4B56-8144-4472C0982F21/SETUP9x.exe http://messenger.msn.com
>>> USR 2 TWN I kevin27_wjj@hotmail.com
<<< USR 2 TWN S lc=1033,id=507,tw=40,fs=1,ru=http%3A%2F%2Fmessenger%2Emsn%2Ecom,ct=1085121976,kpp=1,kv=5,ver=2.1.0173.1,tpf=25063f541b58f1540aad44def92974f2
>>> USR 3 TWN S t=53eCN7AMnD88euZ0reUoQptwGp1AWgGTnc*aPEETocwFP4UaQJWjDfWZHuJd0zPSxs8ywcBIb9nwI*vcv7VkU7SQ$$&p=53ibjyJRKHHSqTXeBopwyWMK2*5GF3I1C52PqhDBsgFaSJf5oLMrwYHOTvR*NBnA1jo7IQRCfdEJV1SoT*8lKSzAR6qgv6JUhrfwPDYLn5pkA1pZW07UMhL!*nFE1sxyolcJc43QohGEQ65Y6D*m8SoytWLHzixR8a3go98!yq530KRko2423kOoMyTUzSJ9yg
<<< USR 3 OK kevin27_wjj@hotmail.com ????????? 1 0
>>> CHG 4 NLN
<<< MSG Hotmail Hotmail 462
<<< MIME-Version: 1.0 ………………(略)
第一眼看到这些,你可能和我有相似的感觉:就是联想到 MOV、ADD、INC 指令,是有点像汇编哦 :)
VER——是在和服务器协商版本,通常会有几个来回,通常先是访问messenger.hotmail.com:1863(就是所
谓的DS);然后它会返回一个XFR……命令(上面没有显示出来,应该显示在 CVR 命令后面),意思
是让Client另外选一个服务器(NS——Notification Server),然后重复 VER -- CVR -- USR这一串命令,重
新与NS建立连接。具体是如何写入Socket流的,可以参考ConnectingToMSN项目。
文档里会不时出现 TrID 这个东东,它是流水号,用于反向确认时验证的,在发送 消息(MSF命令)
时,我发现会重复发送两条相通的message,只是流水号不同(一般为发送两条 TrID 相邻的重复消
息),我认为,可能就是在利用 流水号进行TCP/IP中的确认/重发机制。
USR——下面就要进行用户认证(Passport认证)了,和MSNP7及以下的协议有很大区别,USR的命令有
三种格式:
USR TrID TWN I …… I意思是初始化,只有上行(不知道对不对,我只发现了上行的)不发送密码;
USR TrID TWN S …… S意思是安全连接,上、下行都有,也不发送密码;
USR TrID OK address 1/0 用户验证是否成功,看最后一个参数:1——代表成功,0——代表false;
那么密码怎么得到校验的呢? USR TrID TWN I ……之后,NS通过一个(USR TrID TWN S ChallengeString)返回一个ChallengeString;Client首先到 “nexus.passport.com”获取一个Passport服务器,然
后把 hotmailAddress、password、ChallengeString重定向到该Passport服务器,由该服务器验证合法性,其实
这也就是Passport实现“一点登录,多点共享”的机制。如果合法,Passport服务器返回一个认证字符串
(票据 Ticket),Client把这个 Ticket 还给 MSN的NS服务器,然后我想肯定就是 NS-Passport两个兄弟
服务器“密谋策划”一番,OK,让我通过,NS发回 USR TrID OK ……;但极有可能noOK,然后又重
定向到一台NS,重零开始,一番交涉时候,直到 Client 获取 USR TrID OK ……
TWN——Tweener,is Microsoft's Passport Authentication framework
有时候觉得,MSN服务器断开连接是非常武断的,一个命令错了,一个校验码错了,二话不说,立马断调 :(
XFR——有必要提到这个命令,形如:XFR 2 NS 207.46.107.2:1863 0 207.46.104.20:1863(不好意思,上
面我没有记录,这里是Sniffer截获出来的)。很好理解Transfer到另外一个NS,它还比较人性化,一次提
供了两个NS地址,让你选吧!
Client端的编码要注意:收到XFR之后,要重新给 host 、port赋值,原来的NS已经武断地断开了连接。
要下班了,还要很多没有总结出来(CHG、CHL、QRY、和最关键的 MSG),下周吧!
另外还有一个疑问没有解决,问了 豆腐 ,不知道能否得到 USR TrID OK address 1 ,呵呵。