一种减轻服务器负担并提高客户端间通讯效率的网络通讯设计[TCP/UDP合用] | 简单加密

来源:互联网 发布:淘宝体检中心登陆 编辑:程序博客网 时间:2024/05/16 12:56

这是一个简单的P2P模型,目标是尽量减少服务器的负担和维持双方通讯的开销。

首先,我们知道,TCP由于自身带有重发和检查机制,而更加地安全可靠,但也因此显得效率较慢。而UDP仅负责发包,通讯的可靠性全部交由上层应用来处理,但因此通讯效率也相比于TCP更高。

我自己设想了一个通讯架构,主要的设计思路就是,仅在登陆时通过服务器获取数据,然后客户端间互相通讯。一来减少了服务器出入流量,二来免去了服务器转发的耗时,三来客户端间完全可以靠UDP通讯提升通讯效率。并试图解决UDP通讯丢包及安全缺失的问题。


假设有客户端A、B,其分布两个局域网之后,他们可能都处于公网,也可能都不处于公网或只有一个处于公网,但他们一定不处于同一个局域网内(严格来说,是对服务器S来说,同一个NAT设备之后)。已知公网上有服务器S,这个服务器具有公网ip且已完成相应的网络逻辑。

在这个网络结构中,我们采用Diffie-Hellman算法来生成秘钥,并简单用异或加密作为手段加密通讯。完成这个网络结构,需要完成UDP穿孔技术,该技术在此处不再赘述。


其逻辑为:

1.客户端A上线,建立向服务器STCP链接。此处建立TCP连接是为了保证此后服务器S客户端A下发的数据和指令及客户端A服务器S发送的消息能准确到达。服务器S记录此次客户端A上线时的IP和端口服务器S根据客户端A发来的特征码(比如端口值),下发Diffie-Hellman算法所需的(q.a)值。

2.同样,客户端B上线,也建立了一个向服务器STCP链接。服务器逻辑为,每侦测到一个客户端上线,就依靠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通讯的可靠性保证,可以在客户端的发送的每条消息的开头加上一个UIDACK,类似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();}


0 0
原创粉丝点击