一种Jingle开源库的文件传输原理与实现
1 libjingle文件传输通信原理
1.1 libjingle介绍
libjingle是Google公司推出的基于语音和P2P通信的C++开源库。利用libjingle开源库能够开发出第三方的Jingle点到点通信应用程序,实现与所有支持XMPP以及Jingle扩展协议的软件实现通信。
1.2 libjingle通信系统构架
libjingle在语音、视频、文件等传输方面具有良好的健壮性,这要得益于libjingle采用信令和数据分信道传输的机制,即libjingle采用了信令在带内信道传输,用户数据在带外信道上传输的机制。 ① libjingle通信信道 libjingle的连接包括2种信道(如图1)[1,2]。一是会话协商信道,或者称为XMPP信令信道,此为带内信道。会话协商信道协商信令必须通过中间Jingle Server。二是带外信道也即数据信道。通过数据传输信道实现用户数据的传输,这些数据包括语音、视频、文本等。 ② libjingle数据传输路径 对于数据传输通道,在libjingle中,根据有无防火墙或者NAT设备,有3种不同数据传输路径(如图1)[1,2]。在有防火墙或者NAT设备的情况下,包括通信双方的直接连接通信和通过中继服务器转发连接通信。 ③ libjingle穿透防火墙或者NAT技术 libjingle一个最重要的能力就是能够穿透防火墙或者NAT设备来协商连接。其使用ICE(Interactive Connectivity Establishment )技术来实现穿透防火墙。 ---------------------------------1.3 libjingle文件传输协议格式
libjingle文件传输协议基于P2P的通信协议。相对于音频视频采用UDP连接通信,文件传输采用一种TCP-Like(PseudoTCP)连接通信的格式[1]。PseudoTCP格式(如图2)是TCP的改进版,如下所示,其中PseudoTCP头共24个字节。
① 会话数(Conversation Number):32位,记录所有的会话数。
② 序列码(Sequence Number):32位,用来表示从发送端到接收端字节流数。
③ 确认码序号(Acknowledgment Number):32位,如果设置了ACK控制位为1,确认码序号这个值表示一个准备接收的下一个包的序列码。
④ Pseudo控制位(PseudoCTL):8位,表示PseudoTCP连接过程的状态。
⑤ 控制位(Control):共6位,依此包括URG位、ACK位、PSH位、 RST位、 SYN位、 FIN位。
⑥ 窗口(Window):16位;接收端告诉发送端,其要求收到的TCP数据段大小。
⑦ 发送时间戳(Timestamp sending):32位,表示发送数据报时间。
⑧ 接收时间戳(Timestamp receiving):32位,表示接收到数据报时间。
相对于TCP连接,UDP连接更加容易通过NAT,libjingle的TCP-Like数据报具有TCP报连接传输的功能,保证了文件传输的可靠性,但不易通过防火墙或者NAT [5]。通过PseudoTCP数据报头加了UDP头,组成了一个具有TCP功能的UDP数据报(如图3)。
2 libjingle文件传输的实现 通过libjingle提供的C++源代码库,能够开发出自己的Jingle Server和Jingle Client。 2.1 libjingle文件传输类 libjingle文件传输客户端分文四个部分 [1],一是用户应用(Application)接口单元;二是XMPP报文传输单元(XMPP Messaging Component ),此单元是XMPP信令在应用程序和网络之间传输的接口;三是会话逻辑和会话管理单元(Session Logic and Management Component ),控制每一个会话类型具体的逻辑请求;四是点到点传输单元(Peer-to-Peer Component),主要作用是管理本地与远程计算机的连接。 在报文传输单元中,XmppPump是顶层管理类。XmppClient是应用程序与网络传输XMPP信号的出口与入口点。XmppTask以及其派生类作为异步的XMPP任务类,能够扮演xmpp信令的发起者、侦听者或者两者兼有的角色。 会话逻辑和会话管理单元的主要类包括Session、Transpor、PseudoTCPChannel、TransportChannel、SessionManager、HttpPortAllocator等。Session类主要作用包括在XMPP隧道上协商文件数据传输隧道,以及监测、建立、断开数据传输连接。 2.2 libjingle文件传输具体流程 文件的P2P传输首先是登录 XMPP服务器,然后才能在两用户端实现文件的传输。具体实现流程如下。 ① 客户端应用程序启动,登录XMPP服务器。首先初始化SSL,保证数据传输安全,然后创建一个信令线程。从用户那里得到用户信息比如登录名、密码等信息初始化XmppClientSettings对象,创建一个XMPP任务管理对象XmppPump,由XmppPump创建XmppClient对象和控制登录服务器。 ② 协商建立文件传输会话连接,并在双方传输文件。客户端运行 HttpClient实例对象,HttpClient对象发送一个基本的GET请求通过P2PTransport对象实现连接协商。而在服务器端运行一个HttpServer实例对象,HttpServer实例对象接收连接请求,创建一个PseudoTcpChannel对象控制连接,然后创建和发送一个在本地存取文件的流接口点。使用数据流的形式读文件,文件数据流的发送通过PseudoTcpChannel对象。文件数据流最终通过TransportChannel发送出并通过网络到达接收方。在接收方,TransportChannel对象接收文件数据流信息,并把数据流转换成StreamInterface流,最终通过PseudoTcpChannel把StreamInterface流反馈给HttpClient对象,由HttpClient对象把数据以文件的形式存储在存储器上。 本文分析了libjingle开源库的文件传输原理,并描述了利用libjingle开发文件传输客户端的实现过程。libjingle文件传输采用具有TCP功能的UDP连接,即具有良好的可靠性,又能方便的通过NAT,实现真正的全网无障碍通信。但是,libjingle的文件传输协议并没有成为一个成熟的标准,其通用性还有待改善。封装库/工具库中重要概念之实用工具库 在前端开发中,封装库和工具库是非常重要的。它们可以帮助我们提高开发效率,减少出错的机会,并且使得代码更加易于维护。在本文中,我们将探讨前端中一些实用的封装库和工具库。
IM通讯协议专题学习(三):由浅入深,从根上理解Protobuf的编解码原理 本篇文章我们不讨论IM系统中的那些高端技术话题,我们回归到通讯的本质——也就是数据在网络中交互时的编解码原理,并由浅入深从底层理解Protobuf的编解码技术实现。
科普|不同协议下远程服务器文件上传_下载优劣对比 作为一个程序员,如果不知道如何进行远程服务器的文件上传与下载,实在是一件尴尬的事情,今天我们聊聊如何实现远程服务器的文件上传与下载。
相关文章
- GitHub上最著名的Android播放器开源项目大全
- 华为云开源的Karmada正式成为CNCF首个多云容器编排项目
- pypi配置国内开源镜像
- 网络监控神器!这 7 大免费开源工具可别错过
- android动画原理,Flutter最新开源框架,送大厂面经一份!
- 3款开源的密码管理器 拿走不谢
- 不可错过的12款开源的Ruby on Rails开发工具
- 感受开源云的魅力——第八届云计算大会云计算核心技术论坛侧记
- wijmo开源版,高性能JavaScript UI 组件
- 适合编程初学者的开源项目:小游戏2048(安卓Compose版)
- 2016年31款轻量高效的开源 JavaScript 插件和库
- 开源多线程性能测试工具-sysbench