关闭

XMPP SI FileTransfer服务传输文件过程详解

1027人阅读 评论(0) 收藏 举报
所使用的客户端:jitsi , 服务端openfire


1.场景:
账号IM4向账号IM3发送一个文件

2.IM4通过disco询问IM3的能力
[html] view plaincopy
  1. <iq id="KAmV1-760" to="im3@jiale.360buy.com/WIN-0EU8JCDSM5L" type="get" from="im4@jiale.360buy.com/jitsi-22c45pc">  
  2.   <query xmlns="http://jabber.org/protocol/disco#info" node="http://psi-im.org/caps#caps-b75d8d2b25" />  
  3. </iq>  


3.IM3回答
[html] view plaincopy
  1. <iq xmlns="jabber:client" type="result" to="im4@jiale.360buy.com/jitsi-22c45pc" id="KAmV1-760">  
  2.   <query xmlns="http://jabber.org/protocol/disco#info" node="http://psi-im.org/caps#caps-b75d8d2b25">  
  3.     <identity category="client" type="pc" name="Psi" />  
  4.     <feature var="http://jabber.org/protocol/bytestreams" />  
  5.     <feature var="http://jabber.org/protocol/si" />  
  6.     <feature var="http://jabber.org/protocol/si/profile/file-transfer" />  
  7.     <feature var="http://jabber.org/protocol/disco#info" />  
  8.     <feature var="http://jabber.org/protocol/commands" />  
  9.     <feature var="http://jabber.org/protocol/rosterx" />  
  10.     <feature var="http://jabber.org/protocol/muc" />  
  11.     <feature var="jabber:x:data" />  
  12.   </query>  
  13. </iq>  


4.IM4向IM3发送文件信息,并询问可能的传输方式
[html] view plaincopy
  1. <iq id="KAmV1-761" to="im3@jiale.360buy.com/jitsi-q653qg" from="im4@jiale.360buy.com/jitsi-22c45pc" type="set">  
  2.   <si xmlns="http://jabber.org/protocol/si" id="jsi_2828152957982417029" mime-type="application/octet-stream" profile="http://jabber.org/protocol/si/profile/file-transfer">  
  3.     <file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="91assistant_for_android.exe" size="37217848">  
  4.       <desc>Sending file</desc>  
  5.     </file>  
  6.     <feature xmlns="http://jabber.org/protocol/feature-neg">  
  7.       <x xmlns="jabber:x:data" type="form">  
  8.         <field var="stream-method" type="list-multi">  
  9.           <option>  
  10.             <value>http://jabber.org/protocol/bytestreams</value>  
  11.           </option>  
  12.           <option>  
  13.             <value>http://jabber.org/protocol/ibb</value>  
  14.           </option>  
  15.         </field>  
  16.       </x>  
  17.     </feature>  
  18.   </si>  
  19. </iq>  


5.IM3回应,并列出它支持的传输方法
[html] view plaincopy
  1. <iq id="KAmV1-761" to="im4@jiale.360buy.com/jitsi-22c45pc" from="im3@jiale.360buy.com/jitsi-q653qg" type="result">  
  2.   <si xmlns="http://jabber.org/protocol/si">  
  3.     <feature xmlns="http://jabber.org/protocol/feature-neg">  
  4.       <x xmlns="jabber:x:data" type="submit">  
  5.         <field var="stream-method">  
  6.           <value>http://jabber.org/protocol/bytestreams</value>  
  7.           <value>http://jabber.org/protocol/ibb</value>  
  8.         </field>  
  9.       </x>  
  10.     </feature>  
  11.   </si>  
  12. </iq>  


6.IM4通过disco询问XMPP服务的能力
[html] view plaincopy
  1. <iq id="KAmV1-762" to="jiale.360buy.com" type="get">  
  2.   <query xmlns="http://jabber.org/protocol/disco#items">  
  3.   </query>  
  4. </iq>  


7.服务器回应
[html] view plaincopy
  1. <iq type="result" id="KAmV1-762" from="jiale.360buy.com" to="im4@jiale.360buy.com/jitsi-22c45pc">  
  2.   <query xmlns="http://jabber.org/protocol/disco#items">  
  3.     <item jid="conference.jiale.360buy.com" name="公共房间" />  
  4.     <item jid="rtpbridge.jiale.360buy.com" name="Media Proxy Service" />  
  5.     <item jid="yahoo.jiale.360buy.com" name="Yahoo! Transport" />  
  6.     <item jid="relay.jiale.360buy.com" name="JingleRelayNode" />  
  7.     <item jid="broadcast.jiale.360buy.com" name="Broadcast service" />  
  8.     <item jid="proxy.jiale.360buy.com" name="Socks 5 Bytestreams Proxy" />  
  9.     <item jid="sipark.jiale.360buy.com" name="SIP Controller" />  
  10.     <item jid="search.jiale.360buy.com" name="User Search" />  
  11.     <item jid="manager.jiale.360buy.com" name="Client Control Manager" />  
  12.     <item jid="msn.jiale.360buy.com" name="MSN Transport" />  
  13.     <item jid="workgroup.jiale.360buy.com" name="Fastpath" />  
  14.     <item jid="pubsub.jiale.360buy.com" name="Publish-Subscribe service" />  
  15.     <item jid="xmpp.jiale.360buy.com" name="XMPP Transport" />  
  16.     <item jid="logger.jiale.360buy.com" name="Remote Logger" />  
  17.     <item jid="updater.jiale.360buy.com" name="Spark Updater" />  
  18.   </query>  
  19. </iq>  


8.IM4获取文件代理服务的中继端口
[html] view plaincopy
  1. <iq id="KAmV1-778" to="proxy.jiale.360buy.com" type="get">  
  2.   <query xmlns="http://jabber.org/protocol/bytestreams" />  
  3. </iq>  


9.文件代理服务回应
[html] view plaincopy
  1. <iq type="result" id="KAmV1-778" from="proxy.jiale.360buy.com" to="im4@jiale.360buy.com/jitsi-22c45pc">  
  2.   <query xmlns="http://jabber.org/protocol/bytestreams">  
  3.     <streamhost jid="proxy.jiale.360buy.com" host="10.28.0.143" port="7777" />  
  4.   </query>  
  5. </iq>  


10.IM4告知IM3两个可用的streamhost,一个是自身开启的,一个是proxy服务的
[html] view plaincopy
  1. <iq id="KAmV1-779" to="im3@jiale.360buy.com/jitsi-q653qg" from="im4@jiale.360buy.com/jitsi-22c45pc" type="set">  
  2.   <query xmlns="http://jabber.org/protocol/bytestreams" sid="jsi_2828152957982417029" mode="tcp">  
  3.     <streamhost jid="im4@jiale.360buy.com/jitsi-22c45pc" host="10.28.0.142" port="7777" />  
  4.     <streamhost jid="proxy.jiale.360buy.com" host="10.28.0.143" port="7777" />  
  5.   </query>  
  6. </iq>  

11.IM3(接收文件方)尝试连接streamhost列表中的服务,由于两者不在一个局域网,无法P2P直连,最终IM3连接proxy服务(10.28.0.143:7777)进行socks5协商
[html] view plaincopy
  1. 1.IM3发送5,1,0   
  2. 2.proxy接收到5,1,0,发送5,0   
  3. 3.IM3接收到5,0,发送5,1,0,3,40(digest长度),digest,0,0   
  4. 4.proxy接收到5,1,0,3,40(digest长度),digest,0,0,发送5,0,0,3,40(digest长度),digest,0,0   


12.协商完毕,IM3选择此服务作为streamhost并通知IM4,如果协商不成功,IM3会选择其他的方式,例如IBB(带内传输)等方式
[html] view plaincopy
  1. <iq id="KAmV1-779" to="im4@jiale.360buy.com/jitsi-22c45pc" from="im3@jiale.360buy.com/jitsi-q653qg" type="result">  
  2.   <query xmlns="http://jabber.org/protocol/bytestreams">  
  3.     <streamhost-used jid="proxy.jiale.360buy.com" />  
  4.   </query>  
  5. </iq>  


13.IM4(发送文件方)连接proxy服务(10.28.0.143:7777)进行socks5协商,过程同第11步。此时proxy同时持有IM4与IM3的socks5连接

14.IM4协商完毕,通知proxy开启中继服务
[html] view plaincopy
  1. <iq id="O7qEb-567" to="proxy.jiale.360buy.com" from="im4@jiale.360buy.com/jitsi-3e7ntbt" type="set">  
  2.   <query xmlns="http://jabber.org/protocol/bytestreams" sid="jsi_1333521664531359830">  
  3.     <activate>im3@jiale.360buy.com/jitsi-2vcng6</activate>  
  4.   </query>  
  5. </iq>  


15.proxy响应IM4,告知proxy服务已经准备好了
[html] view plaincopy
  1. <iq type="result" id="O7qEb-567" from="proxy.jiale.360buy.com" to="im4@jiale.360buy.com/jitsi-3e7ntbt"/>  


16.IM4开始发送文件字节流数据,由proxy转发给连入的IM3
17.proxy察觉到IM4已经发送完毕(read=-1),于是断开连接,文件传输结束。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:80828次
    • 积分:1258
    • 等级:
    • 排名:千里之外
    • 原创:29篇
    • 转载:54篇
    • 译文:6篇
    • 评论:11条
    博客专栏