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

所使用的客户端:jitsi , 服务端openfire


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

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


3.IM3回答
<iq xmlns="jabber:client" type="result" to="im4@jiale.360buy.com/jitsi-22c45pc" id="KAmV1-760">
  <query xmlns="http://jabber.org/protocol/disco#info" node="http://psi-im.org/caps#caps-b75d8d2b25">
    <identity category="client" type="pc" name="Psi" />
    <feature var="http://jabber.org/protocol/bytestreams" />
    <feature var="http://jabber.org/protocol/si" />
    <feature var="http://jabber.org/protocol/si/profile/file-transfer" />
    <feature var="http://jabber.org/protocol/disco#info" />
    <feature var="http://jabber.org/protocol/commands" />
    <feature var="http://jabber.org/protocol/rosterx" />
    <feature var="http://jabber.org/protocol/muc" />
    <feature var="jabber:x:data" />
  </query>
</iq>


4.IM4向IM3发送文件信息,并询问可能的传输方式
<iq id="KAmV1-761" to="im3@jiale.360buy.com/jitsi-q653qg" from="im4@jiale.360buy.com/jitsi-22c45pc" type="set">
  <si xmlns="http://jabber.org/protocol/si" id="jsi_2828152957982417029" mime-type="application/octet-stream" profile="http://jabber.org/protocol/si/profile/file-transfer">
    <file xmlns="http://jabber.org/protocol/si/profile/file-transfer" name="91assistant_for_android.exe" size="37217848">
      <desc>Sending file</desc>
    </file>
    <feature xmlns="http://jabber.org/protocol/feature-neg">
      <x xmlns="jabber:x:data" type="form">
        <field var="stream-method" type="list-multi">
          <option>
            <value>http://jabber.org/protocol/bytestreams</value>
          </option>
          <option>
            <value>http://jabber.org/protocol/ibb</value>
          </option>
        </field>
      </x>
    </feature>
  </si>
</iq>


5.IM3回应,并列出它支持的传输方法
<iq id="KAmV1-761" to="im4@jiale.360buy.com/jitsi-22c45pc" from="im3@jiale.360buy.com/jitsi-q653qg" type="result">
  <si xmlns="http://jabber.org/protocol/si">
    <feature xmlns="http://jabber.org/protocol/feature-neg">
      <x xmlns="jabber:x:data" type="submit">
        <field var="stream-method">
          <value>http://jabber.org/protocol/bytestreams</value>
          <value>http://jabber.org/protocol/ibb</value>
        </field>
      </x>
    </feature>
  </si>
</iq>


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


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


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


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


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

11.IM3(接收文件方)尝试连接 streamhost列表中的服务,由于两者不在一个局域网,无法P2P直连 ,最终IM3连接proxy服务( 10.28.0.143 :7777 )进行 socks5协商
1.IM3发送5,1,0 
2.proxy接收到5,1,0,发送5,0 
3.IM3接收到5,0,发送5,1,0,3,40(digest长度),digest,0,0 
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(带内传输)等方式
<iq id="KAmV1-779" to="im4@jiale.360buy.com/jitsi-22c45pc" from="im3@jiale.360buy.com/jitsi-q653qg" type="result">
  <query xmlns="http://jabber.org/protocol/bytestreams">
    <streamhost-used jid="proxy.jiale.360buy.com" />
  </query>
</iq>


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

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


15.proxy响应IM4,告知proxy服务已经准备好了
<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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值