所使用的客户端:jitsi , 服务端openfire
1.场景:
4.IM4向IM3发送文件信息,并询问可能的传输方式
账号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>
<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>
<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),于是断开连接,文件传输结束。