关于端到端通信的讨论(P2P)
产生于一次群内讨论,
最初有人问是否可以不通过服务器,两个客户端直接通信
鉴于我是在web开发的,我给出了我的回答
@恒哥 我个人认为这种功能不现实(以我的知识面)
1、如果不经过服务器,这个产品产生的数据就无法获取,数据的价值无法利用。
2、如果说仅是个人使用,无所谓数据的价值,那么我认为在局域网下进行udp广播也许可以实现,但实际上在这里还是有服务器,即你的网关或者路由充当了服务器的作用,蓝牙应该也是一个道理吧。出了局域网,就需要独立ip了,ipv4时代,个人的电脑通常都不是独立ip,所以如果要在广域网实现这种功能也不太现实。
- 后来有人举了P2P的例子,并提到了去中心化,这是我在回复时未考虑到的一个点,所以查阅了下资料,整理一下
P2P中,各节点既是用户,也是服务器,不再依靠传统意义上的中心服务器分发资源,节点间可以分享资源。
区块链是一个更好的去中心化代表。
第一代的p2p是需要中心服务器来记录各节点的网络拓扑图,强行将各节点拉到一个局域网中(这样各节点即使使用内网IP也能互相找到彼此),然后进行广播,但这样对服务器以及网络带宽有极大的压力。后来兴起了DHT(分布式哈希表,各节点自己记录已知节点的网络拓扑图关系,不再依靠中心服务器来记录,是目前主流的p2p模式),表面上说不再需要中心服务器,但实际上仍然需要类似区块链中创世区块的节点,即预设的稳定节点。p2p软件安装时都会有内置的稳定节点信息,因为如果没有预设的稳定节点,所谓的p2p网络就不存在,新节点就找不到组织,这些预设节点应该保存了更多的其他节点信息,然后其他节点又记录了自己附近节点的信息,于是一张p2p网络就建立了(A可以通过B节点找到C,想起了康奈尔六度分隔论)。这些预设节点此时属于什么,就仁者见仁智者见智了,你可以认为它是服务器(提供最初P2P网络)的一种新的表现形式,也可以认为它就是客户端节点。
即使A和C都在一个p2p网络内,假如AC之前没有过交流,他们并不能直接交互(在第一代p2p时是通过中心服务器来查找彼此的位置),而是要经过中间节点B(一个既认识A也认识C的节点)来充当服务器进行牵线搭桥,然后A和C有了彼此的信息后就可以直接通信传输文件了。
DHT这种网络方案中,各节点既作为客户端,同时也是服务端(文件下载服务器和p2p打洞服务器负责牵桥搭线)。
题中所说的服务器,要看你理解的是什么了,语义上服务器是指有独立IP并提供服务的机器(整个p2p中至少有一个独立ip进行第一层的牵线搭桥,记录附近节点的网络拓扑关系,由此可得预设节点中必须有一个这种的节点用作启动P2P网络)。
P2P中各节点通信:
从用户角度来看更像是客户端与客户端通信。
从开发角度来看,更像是客户端与服务端通信(提供下载服务和网络发现)。
我在看到客户端与客户端直接通信这个问题时,确实未考虑p2p这种情况,主要在于我理解客户端与客户端直接通信,应该是一对一的,类似于tcp,可以通过IP+端口号直接找到对方,而不用打洞、广播和转发,毕竟udp是无连接的。同时也没有想到还有NAT打洞这种操作(详见:https://blog.csdn.net/qq_30145355/article/details/78992731),所以我当时认为两个不同局域网内的虚拟ip直接进行tcp通信是不可能的。虽然现在主流的的p2p基本都是基于udp打洞的,但tcp打洞应该也是可以实现的,难度较大,NAT设备的不统一都是障碍。
因此只要预先知道彼此的路由关系,通过tcp打洞,理论上即可实现端端通信,即基于tcp的p2p(peer to peer)。
但前提在于如何预先知道彼此的路由关系,如果是少量固定的客户端可以预设在软件中,或者口口相传即可。如果是大量的客户端,那么就需要类似第一代p2p的中心服务器,要不就是DHT分布式哈希表来存储节点间网络拓扑关系。现在的因特网用户(局域网视为一个因特网用户)可以通信就是因为有独立唯一固定的IP,p2p其实就是自己建了一个更高层的因特网,网内的用户通过某种办法能找到对方。
-
后来有人举了蓝牙的列子,蓝牙确实也是可以两个手机直接通信的,还有一个更极致的端到端模型,就是门铃,只要线足够长,几百米都可以直接通话。
-
如果我们此时将用户从2个人,升级到5个人(初始的电话网络),这种原始的端到端仍然适用
- 之前需要1条电话线,现在每个人都需要连接另外的4个人,一共需要5*4 = 20条线
- 之前拿起话筒就可以通信, 现在需要按键1、2、3、4进行选择然后通话
- 看起来依然高效
-
如果此时用户量达到了百万级别(成熟的电话网络时代),再使用这种原始的端到端连接(网状连接)会是什么情况:
- 需要100万* 999999 条电话线,我们的电话就这么巴掌大一块大小,怎么可能接入999999条电话线呢?
- 这么多线,线的成本以及铺线的成本巨大
- 拨号还好,从1到100万,一人分配一个号。
-
显然原始的端到端网络不再适用,来到了中心化网络时代(星形连接),我们建立一台强大的中心服务器
- 各个用户只与中心服务器连接,
- A 与 K 通信时,先将请求发送到中心服务器,中心服务器再找到K,并转发给K,于是AK建立通话。
- 百万用户只需要百万条电话线加一台中心服务器即可。
- 拨号形式基本未发生太大变化。
-
当用户边际全国时,可能我们必须要加上区号才能正常建立通话
-
当在公司内部出现了分机号时,我们可能还要加上分机号转接
以上是电话通信的一个历程,网络通信也是一个类似的过程
-
从两台电脑网线直接相连,到多台电脑使用一个路由器(其实就是局域网),发展到广域网,由于ip有限,又在广域网的节点内(独立固定IP)形成局域网。
-
最初提供服务的形式,由A直接访问电脑B(局域网使用网上邻居,美国IPV4有30亿,所以他们应该直接访问对方IP即可)
-
后来发现这样效率太低,空出来一台电脑Z 专门提供资源访问的服务岂不更好。
-
于是中心服务器逐渐发展起来,我们使用资源时只需访问服务器即可,不需要访问其他电脑了。
-
特别是IPV4资源缺乏的情况下(中国3亿IP,14亿人),这种方式及其方便,因为我们是访问不到其他的用户(除非NAT打洞)
-
现在服务器提供一般的资源访问服务问题不大,但是下载大视频文件时,对服务器的压力可想而知。
-
于是P2P这种新时代的端到端连接方式偷偷摸摸(对于P2P,我更多用来下载某种不可描述的视频文件)登场了。
-
目前IPV6还未大规模应用,所以P2P还是需要打洞(记录各节点的网络拓扑关系,两个用户节点才能找到彼此)
带有服务端的通信目前只在文件传输这块遇到瓶颈,将来也许会在更多的方面(比如计算)遇到瓶颈,p2p我觉得就是传说中的云(云计算),将会站出来。
P2p目前应用于文件下载比较多,受限制广播的安全性以及丢包率,目前应用范围并不广。
当ipv6时代到来,应该才是p2p的巅峰(到那时URN也许也大规模应用了)
将来解决了这些问题,以及分布式通信产生的数据存储的各种问题,通信算法优化(数据包分割的大小,以及提供加速节点数量和选择、网络拥塞等),再加上ipv6可以为每台设备提供唯一固定ip(不需要打洞了,毕竟打洞很累人,tcp打洞太难),再保证最低在线节点数量(相当于P2P预设的稳定节点)。将来这种模式就会是主流,代替现有的网络通信模式,即全网p2p,做到真正的去中心化,这也去为什么国家大力发展区块链(在我看来这与5G高铁一样,是一种基建)。
从端端通信到 端–服务器–端 是通信发展的结果,通过类似于p2p这种分布式搜索提供端端通信可能是未来通信的一种结果。
非通信专业,坐等专业人士指导。
知止而后有定,定而后能静,静而后能安,安而后能虑,虑而后能得。
所谓诚其意者,毋自欺也。