在传统的集中式网络中,都是一台服务器(集群)对外提供服务,所有客户端都依赖中央服务器进行与服务端的通信或者其他客户端的通信。如图
这样的通信方式,一个数据包从一个客户端发送到另一个客户端都要在服务端中进行中转,服务端承受的压力非常大,很容易因为线程问题而当机。 于是提出另一种通信方式:P2P通信(peer to peer) 对等通信。 即:在p2p的网络中,所有网络节点都是同等地位,没有服务端和客户端之分,一个节点即是服务端也是客户端 例如:BT下载工具,在下载的同时,同时也为其他节点提供下载 通信模式如图:
即,客户端之间可以进行直接的通信,不需要在经过服务端的中转,从而提高网络传输速度和减小服务器压力,这是非常有用的。 P2P虽然通信模式非常理想,但是有一些问题需要解决 1.客户端通信之前,必须知晓接受端的公网IP和端口port 2.客户端的p2p通信数据包必须能够穿透NAT(network address translate) 网络地址翻译 解决方案 1.对于第一个问题比较简单,可以通过一台拥有公网IP的节点来记录在线客户端的公网IP和端口,所有客户端可以通过该节点读取接受客户端的IP和port 对于第二个问题比较复杂,主要针对私有网络之间的通信,由于ip的匮乏,所以网络上不可能所有节点都位于同一个网段(即拥有公网IP),事实上,大部分的节点都处于常规网络的边缘,甚至在DNS所能查询的范围之外,所以在处于网络的边缘的节点不能直接通信的(因为NAT的缘故),如图
为了简单起见,我们没有画交换机,正常的公司网络都有交换机。 A公司的出口路由IP为211.10.1.1(公网IP),公司有2台主机ip分别为192.168.1.1和192.168.1.2 B公司的出口路由IP为211.10.1.2(公网IP),公司有2台主机ip分别为172.21.1.1和172.21.1.2 那么A公司的192.168.1.1主机与B公司的172.21.1.1在不同的网段,所以不能直接通信。 而p2p的出现,正是要解决这种问题,让两个在不同网段的主机可以直接通信! 在介绍通信之前,还要介绍一个p2p通信的核心,网络打洞(UDP)!
正如上图所列出的通信模式中,采用upd通信 公网主机211.10.1.2开启一个udp,端口为20000 A公司主机192.168.1.2同样开启一个udp,端口为10000 192.168.1.2发送一个数据包到211.12.1.2,数据报文包含 发送方:192.168.1.2:10000 接受方:211.10.1.2:20000 当数据包经过A公司的出口路由时,路由上的NAT会修改数据包为 发送方:211.10.1.1:随机端口(假设是30000) 接受方:211.10.1.2:20000 并在NAT上创建一个Session,该session包含192.168.1.2:10000 → 211.10.1.2:30000的关联。 即:在NAT上有了192.168.1.2:10000与211.10.1.2:30000的会话 所以在Server中收到的数据包,他看到的发送方是211.10.1.1:30000,这也就是192.168.1.2:10000的公网ip 而Server发送的udp数据包,指定接受方为211.10.1.1:30000,因为在192.168.1.2有一个192.168.1.2:10000->211.10.1.1:30000的会话,所以数据包能成功传递到192.168.1.2 所以在这里的session就是所说的在路由上打的洞(通信通道)。
如果没有session的存在,那么路由接受到的数据包就是不经过认证的,一般的路由会做丢弃的操作!!!
但是这个session是有时效性的。具体的有效时间可以在路由上设定,但是最小值大概在100秒左右。 所以为了保证能够正常通信,必须让这个session持续在路由器上存在,所以,192.168.1.2就必须定时与Server做心跳,通过心跳来保证session不失效!
下面通过一个p2p及时通信软件来说明 有3个角色:2个client,1个server 2个client都处于网络的边缘(企业局域网内部) server处于公网,拥有公网IP 如下图:
在图中,server的作用只有一个,就是记录所有客户端的公网IP client1登录后,链接server,server就能知道client1的公网IP,并记录 client1并从server读取client2的公网IP client2也做与client1同样的操作 这样clieint1和client2就都知道对方的公网IP 接下来进行网络打洞 为了保证client1的路由器有与client2的session,client1要定时与client2做心跳(可以发送一个空的数据包) 同样,client2也要定时与client1做心跳 这样,双方的通信通道都是通的,就可以进行任意的通信了。
P2P通信就建立了。
相关推荐
### 基于UDP协议P2P通信技术的分析及实现 #### 1. 引言 P2P(Peer-to-Peer,点对点)技术作为一种新兴的通信模式,其核心理念在于让网络中的每一台设备都能作为平等的节点进行信息交换。这种技术的应用极大地拓宽...
3. UDP打洞技术:在P2P通信中,由于NAT(网络地址转换)的存在,同一局域网内的两台机器无法直接通信。UDP打洞技术通过向公共网络发送数据,利用NAT设备的规则,创建一个从外网到内网的通信通道。这个过程通常涉及...
在P2P通信中,UDP(User Datagram Protocol)穿越是一个关键的技术。UDP是一种无连接的传输层协议,它比TCP(Transmission Control Protocol)更轻量级,适合实时性要求高的应用。然而,由于NAT(Network Address ...
UDP_P2P通信对话框程序是基于Visual Studio 2010和Winsock库开发的,主要用于实现点对点(Peer-to-Peer)通信。在本文中,我们将深入探讨UDP_P2P通信的关键知识点,以及如何利用Winsock库在C++环境中构建这样的应用...
### UDP/TCP穿越NAT的P2P通信方法研究 #### 一、引言 随着互联网技术的发展,网络通信方式也在不断演变。然而,网络地址转换(NAT, Network Address Translation)作为一项关键技术,在保证网络安全的同时,也给P2P...
在本文中,我们将深入探讨如何使用UDP无连接的SOCKET实现简单的P2P通信,特别关注MFC(Microsoft Foundation Classes)的应用。P2P(Peer-to-Peer)通信是一种网络架构,其中每个参与者既是客户端又是服务器,允许...
描述中提到的"VC++ 局域网UDP穿透NAT(P2P)的原理及源代码"揭示了这是关于如何使用VC++编程语言来实现在局域网内通过UDP协议进行P2P通信,尤其是在存在NAT的情况下。NAT通常会阻碍直接的P2P连接,因为它隐藏了内部...
本文将围绕“Delphi P2P DEMO(UDP)”这一主题,详细探讨如何使用Delphi进行P2P通信的实现,以及UDP(User Datagram Protocol)在其中的角色和应用。 首先,P2P网络是一种分布式网络架构,它将所有参与者视为对等的...
3. NAT穿越:了解NAT如何工作以及为什么它对P2P通信构成挑战。 4. STUN协议:深入研究STUN服务器如何协助NAT穿透,以及客户端如何利用STUN服务来发现公网信息。 5. C++编程:实际编写代码来实现P2P UDP NAT穿透...
UDP(用户数据报协议)是P2P通信常用的一种传输层协议,因为其轻量级和低延迟特性。这份文档可能详细解释了如何使用UDP进行NAT穿透,以实现在不同NAT后的设备之间的直接通信。 4. readme.txt:这是标准的项目说明...
这个C++示例代码将为开发者提供一个理解P2P通信和UDP打洞技术的起点,有助于他们在实际项目中实现类似的功能。通过学习和分析这个示例,可以深入理解P2P网络通信的复杂性,以及如何在实际的网络环境中克服障碍,实现...
1. **网络协议**:P2P通信通常基于UDP(User Datagram Protocol)协议,因为它比TCP(Transmission Control Protocol)更快,更适合实时语音通信。UDP是无连接的,不保证数据包的顺序和完整性,但可以减少延迟,这...
UDP打洞是通过在NAT上创建一个“洞”来实现P2P通信的技术。主要有两种打洞策略:被动打洞和主动打洞。 1. **被动打洞**:客户端A向服务器发送请求,服务器将请求转发给客户端B,B回应A,NAT记录下这个通信路径,...
- `P2P_Client.c` 和 `P2P_Server.c` 是C语言编写的客户端和服务器程序,它们实现了基于UDP的P2P通信。 - `proto.h` 可能包含通信协议相关的定义,如数据包结构和消息类型。 - `Exception.h` 可能包含了处理异常或...
P2P通信通常用于文件共享、流媒体服务等应用,因为这种模式可以分散网络流量,减轻中心服务器的压力。 再者,UDP(用户数据报协议)是传输层的无连接协议,相比TCP(传输控制协议),它更轻量级,速度更快,但不...
综上所述,这个主题涵盖了UDP协议的基础知识,P2P网络的工作原理,以及如何在NAT环境中实现UDP的P2P通信。理解这些知识点对于构建和优化分布式系统,特别是那些依赖于快速、低延迟通信的系统,如实时媒体共享、游戏...
深入学习这个实例,开发者可以了解如何在Delphi中编写UDP通信代码,如何处理NAT环境下的连接问题,以及如何实现P2P通信的整个生命周期,这对理解和开发类似的应用程序非常有帮助。同时,这也为开发者提供了动手实践...
#### 一、P2P通信模型及关键技术分析 ##### (一)信息的传递 **1. P2P通信模型** P2P(Peer-to-Peer)通信模型是一种分布式网络架构,其中的每一个节点既是服务的提供者也是服务的消费者。与传统的C/S(Client/...
标题中的“p2p通信 利用IP识别进行通信”是指使用点对点(Peer-to-Peer,简称P2P)技术,通过网络中各节点的IP地址进行直接通信的技术。这种通信方式允许两个或多个计算机节点之间直接交换数据,而无需通过中心...
本项目以C++编程语言为基础,利用MFC(Microsoft Foundation Classes)库中的CSocket类,实现了基于UDP(User Datagram Protocol)的P2P通信,同时构建了一个多用户聊天室。 1. **P2P协议设计与实现**: P2P协议是...