一种减轻服务器负担并提高客户端间通讯效率的网络通讯设计[TCP/UDP合用] | 简单加密
来源:互联网 发布:淘宝体检中心登陆 编辑:程序博客网 时间:2024/05/16 12:56
这是一个简单的P2P模型,目标是尽量减少服务器的负担和维持双方通讯的开销。
首先,我们知道,TCP由于自身带有重发和检查机制,而更加地安全可靠,但也因此显得效率较慢。而UDP仅负责发包,通讯的可靠性全部交由上层应用来处理,但因此通讯效率也相比于TCP更高。
我自己设想了一个通讯架构,主要的设计思路就是,仅在登陆时通过服务器获取数据,然后客户端间互相通讯。一来减少了服务器出入流量,二来免去了服务器转发的耗时,三来客户端间完全可以靠UDP通讯提升通讯效率。并试图解决UDP通讯丢包及安全缺失的问题。
假设有客户端A、B,其分布两个局域网之后,他们可能都处于公网,也可能都不处于公网或只有一个处于公网,但他们一定不处于同一个局域网内(严格来说,是对服务器S来说,同一个NAT设备之后)。已知公网上有服务器S,这个服务器具有公网ip且已完成相应的网络逻辑。
在这个网络结构中,我们采用Diffie-Hellman算法来生成秘钥,并简单用异或加密作为手段加密通讯。完成这个网络结构,需要完成UDP穿孔技术,该技术在此处不再赘述。
其逻辑为:
1.客户端A上线,建立向服务器S的TCP链接。此处建立TCP连接是为了保证此后服务器S对客户端A下发的数据和指令及客户端A对服务器S发送的消息能准确到达。服务器S记录此次客户端A上线时的IP和端口。服务器S根据客户端A发来的特征码(比如端口值),下发Diffie-Hellman算法所需的(q.a)值。
2.同样,客户端B上线,也建立了一个向服务器S的TCP链接。服务器逻辑为,每侦测到一个客户端上线,就依靠TCP协议下发当前在线客户端的列表。
3.客户端B知道了客户端A在线,他想要与A通讯,于是向服务器S发送了一个请求,获取了发送给A的(q,a)值和A的地址。
4.客户端AB间做UDP穿孔,并经由(q.a)计算自身秘钥Xa,Xb和公钥Ya,Yb,将公钥发送给对方。
5.现在,AB间可以开始进行P2P的UDP通讯了,服务器S可以视条件断开二者的TCP链接。
6.对于二者UDP通讯的可靠性保证,可以在客户端的发送的每条消息的开头加上一个UID和ACK,类似TCP自带的机制。在A/B客户端本地建立消息池,以保证丢包重发。
可以看到,AB间的通讯流量不经过服务器转发,省去了服务器的流量和转发时间。
简单的异或处理如下:
try {b = "gu".getBytes("UTF-8");System.out.println(new String(b,"UTF-8"));for(int i=0;i<b.length;i++){b[i]^=0x10;}System.out.println(new String(b,"UTF-8"));for(int i=0;i<b.length;i++){b[i]^=0x10;}System.out.println(new String(b,"UTF-8"));} catch (UnsupportedEncodingException e) {// TODO Auto-generated catch blocke.printStackTrace();}
- 一种减轻服务器负担并提高客户端间通讯效率的网络通讯设计[TCP/UDP合用] | 简单加密
- 简单的TCP服务器与客户端通讯
- python socket实现简单的(TCP/UDP)服务器/客户端
- python服务器和客户端网络通讯UDP
- TCP通讯例程一:固定数据长度的简单数据服务器/客户端通讯
- UDP通讯:服务器与客户端
- TCP/UDP的客户端/服务器编程
- 一种不需要握手服务器穿透NAT的UDP通讯方法
- 一种简单的UDP服务器框架
- 网络通讯选择TCP或UDP的指导方针
- 网络通讯TCP和UDP的编程流程
- 网络通讯TCP/UDP
- 网络通讯方式 ------ TCP、UDP
- TCP UDP协议网络通讯
- StringBuffer帮你减轻Java的负担
- 减轻临时文件对VSS的负担
- StringBuffer帮你减轻Java的负担
- StringBuffer帮你减轻Java的负担
- iOS调整系统屏幕亮度和音量
- 17
- python 正则表达式 重复匹配
- Iphone端relative absolute 出现问题
- C++中 sprintf函数的用法
- 一种减轻服务器负担并提高客户端间通讯效率的网络通讯设计[TCP/UDP合用] | 简单加密
- hadoop-hdfs学习2
- 在 iOS 中使用 Protocol Buffers
- LSH︱python实现局部敏感随机投影森林——LSHForest/sklearn(一)
- Mysql的几个坑(后续不断补充)
- 01-angularJs入门
- lock interupt
- python问号表达式
- 使用简单工厂编写不同的分润规则