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

转载 2013年12月02日 23:52:34
所使用的客户端:jitsi , 服务端openfire
涉及协议:socks 5  XEP-0096: SI File Transfer  XEP-0065: SOCKS5 Bytestreams


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),于是断开连接,文件传输结束。

相关文章推荐

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

所使用的客户端:jitsi , 服务端openfire 涉及协议:socks 5  XEP-0096: SI File Transfer  XEP-0065: SOCKS5 Bytestream...

XMPP系列(五)---文件传输

xmpp 中文件传输的介绍与实现

用原生JS做input全选

思路:用document.getElementsByTagName方法选中所有的input,然后循环每一个input,如果其type=checkbox,则让该checked=check。同理,全不选也...

Linux上创建FTP用户并配置权限

很久没有写博客了,呵呵,现在就把今天创建FTP用户和配置权限在这里记录一下,总结自己,也方便别人。 创建用户 1、Linux系统创建用户:useradd -d /home/ygzx ygzx 2、为...

文件传输源代码FileTransfer

  • 2011年03月21日 15:34
  • 205KB
  • 下载

XMPP文件传输过程

客户端A向B  发送文件的过程: 两个XMPP节点之间传输文件一般有三种方式: Out-of-Band Data               具体见XEP-0066: 点击打开链接in-ban...
  • yjl49
  • yjl49
  • 2011年08月05日 11:21
  • 11665

Cordova - fileTransfer插件的使用详解(实现文件上传、下载)

Cordova 提供了一个 fileTransfer 插件,通过这个插件我们很方便地实现文件的传输操作(上传、下载)。  1,添加FileTransfer插件 首先我们要在“终端”中进入工程所在的目...

XMPP——Smack[5]文件传输及离线消息的获取

三天时间,赶在最后一下午实现了文件的传输,本来需要实现离线文件的发送的,一直没想好怎么弄,找openfire的离线文件插件没找到,后来想出一种方法,起服务器时起了一个系统用户,一直在线,当用户发送离线...
  • wklken
  • wklken
  • 2011年06月01日 21:11
  • 21160

XMPP文件传输分析

openfire服务器是基于xmpp协议的,XMPP支持两种文件流传输协议,SOCKS5 Bytestreams和 In-Band Bytestreams,SOCKS5是直接发送二进制流,而IBB是将...

XMPP之文件传输报文

最近在做文件传输,遇到只能发送文件到spark,spark发送文件来不能接收,要么一直等待,要么发一下就要重试,这天终于找到问题的所在了 我的openfire里面的:服务器->服务器设置->文件传输设...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:XMPP SI FileTransfer服务传输文件过程详解
举报原因:
原因补充:

(最多只允许输入30个字)