一种减轻服务器负担并提高客户端间通讯效率的网络通讯设计[TCP/UDP合用] | 简单加密
2017-04-19 17:25
399 查看
这是一个简单的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间的通讯流量不经过服务器转发,省去了服务器的流量和转发时间。
简单的异或处理如下:
首先,我们知道,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 block e.printStackTrace(); }
相关文章推荐
- <网络编程培训之三> 实现TCP/UDP的简单Echo服务器
- Android网络应用之使用Scoket的Android客户端与TCP服务器的简单交互
- 由一个简单的客户端间TCP/UDP通信程序引发的关于设计模式的思考
- Python网络编程 3.1 由简单的TCP服务器、客户端程序分析相关方法
- python服务器和客户端网络通讯UDP
- Linux网络编程 3 - 简单的Tcp服务器和客户端编程
- 【网络编程笔记】简单的TCP协议 socket编程(C语言版服务器和客户端)
- linux下简单的TCP服务端与客户端进行网络通讯的程序
- 简单的网络通信程序,客户端发送hello,server 服务器反馈 ok UDP
- Python网络编程之socket编程(一)--使用TCP和UDP客户端和服务器通信
- python socket实现简单的(TCP/UDP)服务器/客户端
- Linux网络编程-简单的客户端和服务器通讯程序开发入门(2)
- 简单的网络服务器(简单的TCP,简单的UDP,多进程多线程TCP)
- Python——简单的TCP & UDP 服务器 和 相应的客户端编程
- 基于TCP/UDP的Socket网络通信系列之客户端与服务器的简单对话(三)
- 简单的TCP服务器与客户端通讯
- 【网络】实现简单的TCP、UDP服务器、TCP多进程/多线程服务器
- Java-网络通信、TCP、UDP、服务器客户端的通信
- TCP和UDP网络通讯的区别及实现方式
- tcp和udp多线程的epoll服务器+客户端源代码