一种Jingle开源库的文件传输原理与实现

随着即时通信(IM)软件已经成为互联网信息平台的重要组成部分[4]。但基于自身利益的考虑,各个IM软件均制定并保守自己支持的通信协议格式和标准,导致了各个通信软件不能互联互通,客观上制约了IM的发展。

XMPP协议标准解决了不同即时通信平台信息互通的难题。基于XMPP扩展P2P协议的应用开源库libjingle库可以开发第三方IM软件,最终实现第三方IM与支持XMPP协议的即时通信软件的文本和语音等的互操作。

本文以libjingle为研究对象,重点讨论libjingle支持的文件传输的实现原理和协议格式,以及介绍以libjingle库开发文本传输的基本实现。

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的文件传输协议并没有成为一个成熟的标准,其通用性还有待改善。

时间: 2024-10-31 22:32:32

一种Jingle开源库的文件传输原理与实现的相关文章

FTP文件传输协议两种方式的工作原理

FTP是一种文件传输协议,它支持两种模式,一种方式叫做Standard (也就是 Active,主动方式),一种是 Passive (也就是PASV,被动方式). Standard模式 FTP的客户端发送 PORT 命令到FTP server.Passive模式FTP的客户端发送 PASV命令到 FTP Server. 下面介绍一个这两种方式的工作原理: Standard模式 FTP 客户端首先和FTP Server的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个

Java中使用开源库JSoup解析HTML文件实例_java

HTML是WEB的核心,互联网中你看到的所有页面都是HTML,不管它们是由JavaScript,JSP,PHP,ASP或者是别的什么WEB技术动态生成的.你的浏览器会去解析HTML并替你去渲染它们.不过如果你需要自己在Java程序中解析HTML文档并查找某些元素,标签,属性或者检查某个特定的元素是否存在的话,那又该如何呢?如果你已经使用Java编程多年了,我相信你肯定试过去解析XML,也使用过类似DOM或者SAX这样的解析器,不过很有可能你从未进行过任何的HTML解析的工作.更讽刺的是,在Jav

你不知道的5种另类文件传输服务

提起文件传输,你肯定会想起通过U盘或是各种IM.蓝牙等传输分享.移动互联时代,抛弃这些老套繁琐的传输方法吧!你可以让iPhone"扔"文 件,也可以让iPhone通过唱唱歌就能实现文件传输分享--今天小编就给您推荐几款你不知道的另类个性传输服务,集体上眼这里:用Hoccer把你手机中的文件"扔"给我Hoccer这款基于地理位置的手机数据共享应用,通过"投掷"或"拖拽"的方式毫不费力的帮我们实现了一对一或一对多手机间图片.文档.

站在巨人的肩膀上,C++开源库大全

程序员要站在巨人的肩膀上,C++拥有丰富的开源库,这里包括:标准库.Web应用框架.人工智能.数据库.图片处理.机器学习.日志.代码分析等.   标准库 C++ Standard Library:是一系列类和函数的集合,使用核心语言编写,也是C++ISO自身标准的一部分. Standard Template Library:标准模板库 C POSIX library : POSIX系统的C标准库规范 ISO C++ Standards Committee :C++标准委员会 框架 C++通用框架

Android非常有用的开源库介绍整理

Android开源库 自己一直很喜欢Android开发,就如博客副标题一样,我想做个好的App. 在摸索过程中,GitHub上搜集了很多很棒的Android第三方库,推荐给在苦苦寻找的开发者,而且我会不定期的更新这篇文章. 本文的其他贡献者: ____sky____ 感谢~ 我的GitHub Android下的优秀开发库数不胜数,在本文中,我列举的多是开发流程中最常用的一些.如果你还想了解更多的Android开源库,可以查看我的GitHub Star,过滤Java选项,每一个库都是我认真查看或者

Linux 后台开发工作中常用的开源库

后台开发,语言主要是 c 和 c++ , 这里简单罗列一下工作中用的很频繁的那些开源软件 1. OpenSSL openssl OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用. 下载地址: https://www.openssl.org/source/ 2.TinyXML tinyxml 简单,高效,灵活的一套操作 XML 文件的开源库. 下载地址: http://www.grinninglizar

python实现的一个p2p文件传输实例_python

考虑到我手上的服务器逐渐的增多,有时候需要大规模的部署同一个文件,例如因为方便使用systemtap这个工具定位问题,需要把手上几百台服务器同时安装kernel-debuginfo这个包,原有的方式采用一个源服务器,采用rsync或者scp之类的文件传输方式只能做到一个点往下分发这个文件,这个时候下发的速度就会比较的慢,基于以上原因,我写了一个基于bt协议传输文件的小工具,实际测试,传输到10个机房,70多台机器传输一个240M的这个内核文件,到所有的机器,源采用限速2m/s的上传速度,测试的结

python实现p2p文件传输—适用大文件传输

一.需求及应用场景 考虑到我手上的服务器逐渐的增多,有时候需要大规模的部署同一个文件,例如因为方便使用systemtap这个工具定位问题,需要把手上几百台服务器同时安装kernel-debuginfo这个包,原有的方式采用一个源服务器,采用rsync或者scp之类的文件传输方式只能做到一个点往下分发这个文件,这个时候下发的速度就会比较的慢,基于以上原因,我写了一个基于bt协议传输文件的小工具,实际测试,传输到10个机房,70多台机器传输一个240M的这个内核文件,到所有的机器,源采用限速2m/s

标准C实现基于TCP/IP协议的文件传输

TCP/IP编程实现远程文件传输在LUNIX中一般都采用套接字(socket)系统调用. 采用客户/服务器模式,其程序编写步骤如下: 1.Socket系统调用  为了进行网络I/O,服务器和客户机两端的UNIX进程要做的第一件事是调用socket()系统调用,建立软插座,指明合适的通讯协议.格式为:  1 2 3 #include >sys/types.h> #include >sys/socket.h>    int socket(int family,int type,int