本文涵盖计算机网络,软件等多方面的知识。
不过放心,这篇文章不会只告诉你p2p”是什么“,也不会仅仅告诉你”为什么“,而要深刻探讨它的设计”是否合理“。
传统计算机行业 = IT行业 软件行业
作为一个网络工程出身的假工程师,我虽然半道转行做软件,但仍然持续关注着IT行业的发展。这不,近年来成熟起来的WebRTC技术更是将web与网络这两个毫不相关的科研方向结合了起来:web是什么?web是软件行业的主流方向,属于互联网应用技术,网络呢?网络是IT运维的一个方向,属于互联网建设技术。
然而,没有完美的层次模型,任何人为划分的层次化系统都不可避免的需要层次之间的妥协,就像我们应用层编程仍然要考虑采用TCP还是UDP一样。没有网络基础的程序员们碰到WebRTC一定一头雾水,甚至连p2p都不知道是啥,我来为大家解惑。
稍微有点网络常识的人都知道,在互联网上通讯理应是很简单的:一台电脑访问另一台电脑的ip地址即可,根本不需要服务器。既然微信不会保留用户的聊天记录,为啥还需要微信服务器呢?很显然,我们聊天的时候并不是p2p的,而是通过服务器来交换消息。稍微有点常识的人都知道这种通过第三方服务器来代理“聊天”的方式远不如2台电脑直接聊天来的快,而且还能避免隐私泄露。
注:p2p指peer to peer,对等体到对等体:在网络上2点之间直接交流而不走中间的服务器叫做p2p通讯。
去中心化通信的问题
那为啥微信客户端不能替你直接呼叫你的好友,非要让微信服务器代你呢?有许多原因,原因之一是你不知道好友的ip地址。
。。。
这个理由看似合情合理,那如果知道呢?也不行,因为IP地址是地理地址,每个省每个市都有不同的ip地址(比如南京市电信就有超过65536个地址),你可以做一趟地铁,每过5站查一次stun服务,每次都能看到不同的ip地址。
stun服务可以查询到自己在互联网上的ip地址,是一种廉价的服务,效果等同于百度搜索”IP地址“关键字得到的结果。常用的stun服务器来自谷歌:stun:stun.l.google.com:19302
所以,一个人在地球上是不断运动的,即使你们知道对方的ip地址,当好友走到了别的地方换了一个ip,你们的通讯就中断了,好友也不可能在中断前告诉你新的ip地址,因为这样的话他所有的好友都要通知一遍,显然是不合理的。(当然,在网络聊天出现之前真有人这么做)
那怎么办呢,我们希望ip地址变化之后只要通知一个人”中心管理者“,办法是在互联网上设置一个不动的,或很少移动的服务器(如微信服务器)来维护所有用户的ip地址(以及端口号),我们想知道好友的ip地址时就向管理者去询问,同时还要随时把自己的ip地址汇报给管理者,以便让好友可以随时找到自己。这样一来,问题就解决了。这就是WebRTC的工作原理。
在端到端通信时代,在网络上定位一个对等体除了ip地址还需要端口号,端口号是对地理地址的进一步划分(比如一台电脑有多个人使用)。所以必须知道对方的ip和端口号才能与之通信。
这幅图描述了webRTC大致的原理,其中signalling就是交换ip和端口以及协议协商的过程。值得一提的是,signalling没有强制的标准,并不一定得通过服务器来交换,你可以采用任何方式,通过其他网络,邮件,信鸽,甚至顺丰速运都行,只要达到交换地址的目的即可。
但是signalling推荐使用UDP传输,之前的stun服务也是基于UDP的,从这个趋势可以看出,UDP正在走向主流,正在逐渐挑战着TCP的地位。
?
讲完了?感觉和其他教程说的不大一样?是不是忘了谈NAT了?事实上,WebRTC和NAT根本没有关系,不信去webrtc.org上瞧瞧,官网都对NAT只字未提。但为啥许多介绍WebRTC的文章都说是为了解决NAT的问题呢?主要是因为NAT确实也破坏了端到端通信的能力:即使在互联网上的位置不变,在NAT网关之后的主机地址仍然是动态变化的,因为在这种情况下,即使IP地址不变,你的端口号会一直变化,p2p将无法进行。
为什么?
可能是因为IPv4地址太贵了(注意我说了可能),你和你的朋友都购买了NAT上网服务(比如电信和移动5G)。在这种上网模式下,我们只能通过”代理“上网,这个”代理“就是NAT网关,与此同时,我们在逻辑上处于互联网中的一个小型局域网当中:我们并没有直接暴露在互联网中,而是被一个局域网”保护“了起来。正是有了这层屏障,p2p被无情打破。可为什么IP地址这么贵呢?
NAT技术:用端口资源来扩充IP资源?
事实上IP地址资源早在20年前就不够用了,可为啥这20年还可以上网?这主要是NAT技术来解决的。
注: IPv4地址资源不足有2个原因,其一是IPv4地址是一个32位整数,理论上支持40多亿个地址,这个数远远小于世界总人口数。其二是由于IP地址在地理位置上严重分配不均:美国富余中国稀缺,占世界人口56%的亚洲只分到9%的地址,中国人均只有0.06个地址,日本也严重不够用,印度更惨,人均只有0.006个地址。
NAT技术的设计者们早就发现,我们个人电脑上同一时刻只有寥寥几个端口号在工作,剩下几万个端口都处于闲置状态,这不可谓不是一种浪费。既然ip地址快不够用了,为啥不利用这些闲置的端口号来扩充ip地址呢?这就是NAT技术的理论基础。
虚拟化:对内伪装,对外欺骗
如果给NAT下一个定义,NAT是一种虚拟化技术,用于将虚拟化的子网接入到父级网络(通常就是互联网)。什么是虚拟化技术呢?虚拟化就是伪装欺骗的艺术,比如在一台电脑上开多台虚拟机,每台虚拟机都分配一个ip,那么在外界看来就存在多台电脑,但实际上只有一台:虚拟机容器将一台电脑虚拟成多台电脑。
NAT则相反,NAT是将多台电脑虚拟成一台电脑,在外界看来你们只有一台电脑(即NAT网关),但实际上你们有若干台。虽然NAT网关只有1个公网IP,但是它有几万个端口号对应着子网内部几万个主机。
所以,从资源守恒的角度看,NAT是牺牲端口号资源来扩充稀缺的ip地址资源;从技术本质上看,NAT是一种虚拟化技术,实现了网络的嵌套。
理论上NAT子网中可以再嵌套一个NAT子网,网络嵌套的层数没有理论限制,但是层数越多通讯效率将大打折扣。
有人问,如果一开始互联网就使用IPv6,NAT技术就不会诞生了,上网的效率将大大提升?是这样吗?
IPv6能解决问题?怎么可能! 虽然NAT一开始是为了解决IP资源不足而流行开来的,但是刚刚说了,NAT本质上是虚拟化,是用来实现网络嵌套的。虽然IPv6资源多如牛毛(128位地址,约3.4×10^38个,比世界上所有灰尘的数量还多),世界上的子网仍然无处不在:每一个公司,园区,军事禁区几乎都有自己的私有网络。
之前也说了,IPv4地址太贵只是NAT被广泛使用的原因之一,更深层次的原因是,互联网诞生之初所构想的世界大同的格局根本不可能实现,从物理设备的角度思考,如果想让人人平等地使用互联网,想要人人都能随时随地获得一个公网IP,就得在世界各地均匀地搭建类似蜂窝布局的互联网接入点(如5G基站),从而将互联网络覆盖到地球每个角落,但只要国家和地区之间充斥着不信任,各种私人领地像钉子户一般的存在,基站就不可能覆盖全球。NAT仍将广泛使用。 子网将一直存在,网关和防火墙像长城(你知道我指的是什么)一样坚不可摧。地球仍以一定的角速度转动,互联网却面临着命运莫测的未来。。
最近人在魂不在,产出效率偏低,多多海涵~
(完)