基于ⅠCE 框架的P2P 技术在通讯领域的研究
2022-08-08袁永胜YUANYongsheng赵魁元ZHAOKuiyuan肖峥瑜XAOZhengyu赵搏ZHAOBo王春艳WANGChunyan
袁永胜YUAN Yong-sheng;赵魁元ZHAO Kui-yuan;肖峥瑜XⅠAO Zheng-yu;赵搏ZHAO Bo;王春艳WANG Chun-yan
(河南科技大学软件学院,洛阳 471000)
0 引言
随着互联网技术的不断发展,人们对网络服务的要求也在不断提高。在传统的C/S 或B/S 模式中,网络服务主要由服务器提供,用户的一切交互行为都要经过服务器。随着用户的大量增加,这种模式不仅加重了服务器所需要的资源,而且用户在交互过程中产生的一切个人信息也都可能会保存到服务器中,尤其是在通讯领域中,我们的信息都有可能在不经意间泄露。因此,本文提出了P2P 内网穿透技术在通讯领域的研究,相比于传统的C/S 架构,P2P模式不依赖于中心服务器,各个节点之间都是平等的,有着较高的容错性和节点可扩展性,能够极大缓解传统架构中服务器端的压力过大,单点失效等问题,同时更好地保护了用户的信息安全。
1 研究内容
本文主要对P2P 技术在通讯领域中的应用展开研究。当前互联网中的应用普遍采用的是B/S 或C/S 模式。在这种传统的模式中,信息的资源共享都是以一个服务器为中心,用户之间的所有通信都需要中心服务器进行请求转发。这种方式对于共享资源的查找、更新较为容易,但是会加重服务器的负载量,因为用户的上行宽带在大部分时间中都是空闲的,这不仅造成了资源的浪费而且速度也会降低。另外,这种方式应用在通讯领域中,由于所有数据都要经过中心服务器进行存储转发,因此会对用户的信息安全造成极大威胁,极有可能造成用户数据泄露。而在P2P 体系结构中,中心服务器的作用得到了淡化,每个用户既可以是客户端也可以是服务端。在这种模式中,系统会将用户端也当做服务端,利用终端用户的上行宽带来辅助数据的转发、交换。通过这种方式,用户之间可以直接进行通信而不需要依赖于同一个中心服务器,速度得到了很大提升,也充分利用了网络资源。其次,采用这种方式,用户的数据都保存在本地而不是服务器,因此用户的信息安全性得到了极大的改善。但是,这种方式在打洞时通常都是基于UDP 的,由于UDP 是一种不可靠的传输协议,因此需要在数据传输过程中解决不可靠传输问题,使数据能够安全传输。另外,除却在用户信息交流方面的应用,P2P 还可以应用于目前比较流行的音视频类的物联网中,例如车机系统、智能摄像头、可视化门锁、门铃等,利用这种技术会极大地节省云端服务器所消耗的巨大成本,并使用户得到快速、安全的体验。
2 穿透原理
2.1 NAT 端口
NAT(网络地址转换)是为了解决IP 地址不够用而产生的一种路由器解决方案。它可以给用户分配本地网络IP,在用户上网时NAT 路由器会自动将用户本地IP 转换成公网IP 与外部通信。NAT 端口主要分为两大类:锥型NAT 和对称型NAT。而锥形又分为全锥形、受限锥形和端口受限锥形。对于处于不同端口类型后的网络,其穿透方式也不尽相同。
2.2 ICE 穿透
ICE 全称为交互式连接建立,它主要集成了STUN[1]和TURN[2]协议。因为用户网络基本上都位于不同的内网之中,如果采用P2P 技术的话,就必须以某种方式让两端用户能够互相发现对方,因此ICE 穿透技术便是整个系统能够正常工作的核心。其工作原理如图1 所示。其中,TURN服务器是STUN 服务器的备用。
图1 穿透服务器工作原理
然而在日常生活中,用户网络所处的NAT 设备类型多种多样,因此ICE 在工作之初会先对用户双方的NAT类型进行判定。对于处于非对称型NAT 设备后的用户,STUN 服务器将会检查用户所请求的IP 地址(位于端口后的用户应用程序所发出的请求IP),并将这个地址通过信令服务器传递给位于另外一个端口后的客户端从而使两个客户端直接建立连接。而对于存在对称型设备的网络,有两种情况STUN 协议将不能进行NAT 穿越,一种是用户分别处于端口限制型NAT 和对称型NAT 后,一种是双方都处于对称型NAT 后,因为每当客户机发出一次请求,对称型NAT 都会重新给用户分配一个端口。那么此时ICE 会使用TURN 服务器进行中继转发[3]。值得一提的是,在穿透的几种类型中,ICE 会优先使用STUN 建立一个基于UDP 的连接,如果建立失败,将会去尝试进行TCP 连接,仍然打洞失败时才会使用TURN 服务器进行中继转发。因此,TURN 服务器所产生的relay 候选地址的优先级是最低的,因为中继虽可靠但是也是效率最低的一种P2P通信方式,ICE 协议会在多个candidate 中选取最合适的地址进行通讯[4]。其工作流程如图2 所示。
图2 ⅠCE 框架工作流程
3 系统设计与实现
本系统前端采用安卓端的原生开发策略,后端采用Spring Boot 开发,保证了数据的安全可靠性,运行速度快、性能高,用户体验最佳。
3.1 整体功能分析
3.1.1 注册与登录
客户端将用户名以及输入的密码进行加密,发送给服务器,以用户名为主键在数据库中搜索用户的信息,如果没有搜索到将会返回给客户端登录失败信息,搜索到后,系统会对密码进行二次加密,再进行密码的校验,放入数据库的密码进行了两次加密(注册也是如此),即使数据库的权限被盗取也很难破解出密码,校验成功后将token 返回给客户端进行登录后的权限验证。注册用邮箱作为账号,输入邮箱,点击获取验证码,服务器端随机生成验证码并保存,一定时间后会自动删除,将验证码发送到注册的邮箱中,点击登录按钮,后台先进行验证码的校验,通过校验,将注册信息存入数据库,注册成功。
3.1.2 消息同步
网络通讯的主要是在两端进行的,消息同步机制在两端之间交互。消息分为索引和内容两部分进行存储,双端在进行同步时将会对比双方持有的索引链表,并将对方需要的消息内容根据索引发送给对方,从而使双方的消息记录保持一致。在消息发送时,发送方将会向信令服务器发送一个请求,请求中仅包含接收方的用户ID 和发送方用户ID,然后信令服务器会向接收方发送一个消息提醒,并将其存储在缓存中,如果接收方离线,接收方上线后会主动向信令服务器发起询问是否有新的消息,信令服务器会将缓存中的数据重新发送给接收方并清理缓存。
3.1.3 局域网中的数据传输
如果用户处于同一局域网内,则不需要通过穿透服务器进行内网穿透,用户登录后向局域网广播用户信息,局域网内其他在线用户可同步收到该广播信息并将其加入在线用户。如果用户A 要和用户B 通信,用户A 会向用户B 发送一个Socket 请求,用户B 收到A 发来的Socket 请求后会将其暂存并向A 也发送一个Socket。双方都拥有一个对方的Socket 后就建立起了局域网内的连接,可进行文件传输、信息交流。其中Socket 会保存一段时间,下一次通信时则不需要重新建立连接而直接进行信息传输。
3.1.4 不同内网间数据传输
当两个客户端处于非转发方案中的情况时,用户首先要连接服务器,注册自己的信息,这个信息包括用户公网映射IP 地址和端口以及用户的信息,以供客户端A 和B在自行连接的时候在公网上找到对方进行信息的传输,当客户端A 想要和某个用户(已经在服务器端注册的用户)进行连接时,点击注册用户列表中的用户就可以实现两端的信息交互。注册后,客户端命令服务器呼叫客户端B,验证网络连接是否畅通,如果此时用户已经下线,服务器端会给客户端A 回复客户端B 不在线,否则客户端会根据注册的IP 和端口自行连接,实现端到端的通讯,但当一方下线时,会给服务器发送下线消息,服务器会通知对方下线,通讯回话结束。
3.1.5 安全传输
为了加强端对端传输之间的安全性,采用证书以及非对称加密算法对通讯双方的内容进行加密,以防止中间人攻击。通讯双方在通讯建立时将会向对方发送自己的证书以验证身份,然后会使用证书中的公钥加密一个随机数并返回对方。双方在收到随机数后使用自己的私钥解密,并用对方的公钥重新加密后重新发送给对方。双方接收到后用自己的私钥解密,然会对比是否为自己之前生成的随机数,若正确,则可以保证双方之间的通讯没有被第三人篡改,而后再使用对方的公钥进行通讯。证书是由信令服务器提供方颁发,双方可以通过信令服务器方验证证书的合法性。
3.2 穿透服务器
Coturn 服务器是一个开源的穿透服务器,它完整地集成了STUN/TURN/ICE 协议并支持P2P 防火墙穿透技术。在本次研究测试中,穿透服务器采用的是在Ubuntu 云服务器中安装Coturn,在安全组中开放了3478 等相关端口,并在Trickle ICE 中测试通过,能够成功收集到STUN 协议获得的srflx 地址和TURN 协议获得的relay 地址(统称为候选列表)。
3.3 信令服务器
信令服务器使用了SpringBoot 框架[5]进行开发,采用WebSocket 通讯协议与客户端交互。
3.3.1 信令协议
信令服务器与客户端之间的通讯使用了自定义的WSTP(WebSocket Signaling Transport Protocol)信令传输协议,协议规定了一个信令是由一个20 字节的信令头以及数据组成。信令头的组成如表1 所示。
表1 信令头设计
版本号根据高低4 位分为不兼容版本号和兼容性版本号,代表当前协议数据包服务器可处理程度;魔数是一个用于保证完整性的简易校验方式,是一个固定的数;标识位用于控制一些选项(IE、CT、HB、BIN、RESP 等);类标识符是用于指示该协议包要访问哪个信令类;数据长度即为携带数据的总长度。信令协议可携带的数据有两种,JSON 和二进制。
3.3.2 信令管理器
信令服务器中的所有信令都定义在信令类中,服务器在启动时, 信令管理器会使用SpringBoot 中的ResourceLoaderAware 扫描特定的包,并将所有拥有@Signaling 注解的信令类注册到管理器中,并由信令管理器管理它们的生命周期,此后,信令管理器将会根据信令类中带有Mount 的注解的属性类型从Spring Bean 管理器中获取Bean,并挂载在这些属性中。当WebSocket 服务器接收到数据时,会先将数据按照WSTP 协议处理为Protocal 对象,并传入到信令管理器中,信令管理器会根据Protocal 对象中的标识符以及数据访问对应得信令方法执行,并取得结果封装为ResponseProtocal 返回给客户端。
3.4 安卓端的实现
本系统最终在安卓端完成编写与测试,使用Android Studio 进行开发,使用了开源的原生UI 框架XUI 进行界面开发,采用WebSocket 通信协议与后端进行交互,调用信令服务器提供的各接口以实现整体功能。其中主要使用了重写后的WebSocketClient,使其可以直接发送信令数据,并且可以直接发送Java 对象。 重写后的WebSocektClient 需要在发送时设置一个回调,在执行成功、失败、超时时会自动调用回调。重写后的WebSocketClient 可以自管理Token 信息。
4 结语
综上所述,在如今互联网高速发展的时代,大量的网络资源造成浪费,人们的信息安全也亟需加强。本文通过对基于ICE 框架的P2P 技术的原理分析,阐述了P2P 技术在如今互联网中的发展方向和潜力,尤其在通讯领域中,P2P 技术就显得尤为重要。本文提出了P2P 技术在通讯领域的研究应用,旨在为通讯领域提供一个不同于传统C/S 模式的方法,能够让用户更加重视自己的信息安全,具有一定的参考价值。