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

本文涉及的产品
数据传输服务DTS,同步至DuckDB 3个月
简介:
随着即时通信(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的文件传输协议并没有成为一个成熟的标准,其通用性还有待改善。
目录
相关文章
|
iOS开发 MacOS
mac下安装brew下载非常慢解决方法
mac下安装brew下载非常慢解决方法
1458 1
|
机器学习/深度学习
R语言模型评估:深入理解混淆矩阵与ROC曲线
【9月更文挑战第2天】混淆矩阵和ROC曲线是评估分类模型性能的两种重要工具。混淆矩阵提供了模型在不同类别上的详细表现,而ROC曲线则通过综合考虑真正率和假正率来全面评估模型的分类能力。在R语言中,利用`caret`和`pROC`等包可以方便地实现这两种评估方法,从而帮助我们更好地理解和选择最适合当前任务的模型。
|
机器学习/深度学习 算法 调度
「AIGC算法」爬山算法详解
**爬山算法是迭代求解优化问题的局部搜索方法,从随机解开始,逐步向邻域内更优解移动,直至达到局部极值。特点包括简单性、可能陷入局部最优和依赖初始解。应用包括调度、路径规划和参数调优。改进策略如随机重启、模拟退火和多起始点可帮助跳出局部最优。主要挑战是局部最优、平坦区域和高维问题。**
751 0
|
IDE Java 开发工具
第十四届蓝桥杯集训——JavaC组第一篇——Eclipse的使用
第十四届蓝桥杯集训——JavaC组第一篇——Eclipse的使用
535 0
|
算法 安全 数据安全/隐私保护
C/C++学习 -- 分组密算法(3DES算法)
C/C++学习 -- 分组密算法(3DES算法)
369 0
|
Java Maven
Maven依赖jar包时版本冲突解决原则
Maven依赖jar包时版本冲突解决原则
644 0
|
安全 API 网络安全
查询和开启3389端口方式总结
查询和开启3389端口方式总结
2305 0
|
数据采集 机器学习/深度学习 算法
梯度消失了怎么办?
梯度消失是深度神经网络训练中的常见问题之一。解决梯度消失问题的方法包括使用更复杂的模型、不同的激活函数、批标准化、残差连接、改变优化器和学习率以及数据预处理等。需要根据具体情况选择相应的解决方法,并监视网络权重和激活函数的分布情况来识别和缓解梯度消失的问题。
4007 0
梯度消失了怎么办?
|
Oracle Java 关系型数据库
第一篇: openJDK源码编译安装--mac版本
想要一探JDK内部的实现机制,最便捷的路径之一就是自己编译一套JDK,通过阅读和跟踪调试JDK源码去了解Java技术体系的原理,虽然门槛高一点,但肯定比阅读各种书籍,文章,博客更在贴切一点,另外,JDK的很多方法都是本地化(Native)的,需要跟踪这些方法的运作或对JDK进行Hack的时候,都需要自己编译一套JDK。
862 0
第一篇: openJDK源码编译安装--mac版本
|
SQL 分布式计算 Hadoop
Azkaban--使用实战--hadoop 调度(hdfs、mapreduce) | 学习笔记
快速学习 Azkaban--使用实战--hadoop 调度(hdfs、mapreduce)
882 0
Azkaban--使用实战--hadoop 调度(hdfs、mapreduce) | 学习笔记