Connections(链接)
一个p2p的链接实际上由两个通道组成。
● session negotiation channel(也称作signaling channel),会话协商通道。是为数据链接服务的沟通通道。这个通道被用来回应取得一个链接的请求,交换候选,和协商会话的细节(比如:套接字地址,需要的编码方案,交换的文件,链接改变请求,终止请求)。这个通道是两个计算机之间建立的第一个链接,也只有这个链接成功之后,两个计算机之间的数据链接才能被建立。libjingle通过发送一个指定的前导协议节发出一次响铃并收到一个回应,数据链接则被建立(see Jingle and libjingle)。这个通道发送协议节是通过XMPP 服务器这一中间机构进行的,例子中的代码是把Google Talk服务器当作中间机构用的。
● data channel (娄据通道,数据链接)这个通道传送的是p2p两端真正交换的数据(语音,视频,文件等),数据通道里的数据被TCP或UDP包封装,到底是TCP还是UDP这要视协商的传送方式,这些包并没有经过XMPP服务器。
会话协商通道首先被建立,它作为计算机间协商建立数据通道细节的通道。数据通道被成功建立之后,在这个通道上将发生许多数据活动,除非碰到改变编码请求,新文件请求,重传请求,或终止请求。
下面的图演示了这两种数据路径。尽管只有一个路径处于活动态,图中还列出了两个路径的交替使用态。因为路径可以是直接链接(92%的链接尝试都可以转换成直联)或服务器中转(8%的链接尝试需要中间服务器的中转)。第三种数据路径没有列出,它是没有防火墙的网络中从一台计算机直接链接另一台计算机。
注意:
1、libjingle不时地发送出心跳包(STUN),来维持一个链接可写入,保持防火墙和NAT地址绑定处于活动态,并且还可用来检查潜在的链接。
2、linjingle向链接端口分配用户名和密码。此举用来确定当前链接的数据通道就是在会话协商通道上协商好的数据通道。因为用户名和密码是被XMPP发出的,也许没有经过TLS的加密,心跳包中的用户名和密码只是身份的标识,并没有加密验证。
运行 file share 例子程序,可以看到发出的真实协议节。