专栏首页Web行业观察WebRTC,P2P技术,IPv6的一些思考

WebRTC,P2P技术,IPv6的一些思考

本文涵盖计算机网络,软件等多方面的知识。

不过放心,这篇文章不会只告诉你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仍将广泛使用。 子网将一直存在,网关和防火墙像长城(你知道我指的是什么)一样坚不可摧。地球仍以一定的角速度转动,互联网却面临着命运莫测的未来。。

最近人在魂不在,产出效率偏低,多多海涵~

(完)

本文分享自微信公众号 - WebHub(myWebHub)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-14

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「微服务架构」我们如何设计配额微服务来防止资源滥用

    随着业务的增长,Grab的基础设施已经从一个单一的服务变成了几十个微服务。这个数字很快就会以数百的形式出现。随着我们的工程团队并行发展,拥有一个微服务框架可以提...

    首席架构师智库
  • JAVA8新特性(五)——DateTime API

    2.类比较多,既有java.util.Date、又有java.sql.Date,同时Data的format和parse又在java.util.txt下。

    逝兮诚
  • Shiro官方文档翻译——Apache Shiro的十分钟教程

    Welcome to Apache Shiro’s 10 Minute Tutoral!

    逝兮诚
  • 微信支付宝一码付

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • JAVA自动爬取CSDN用户数据并文章点赞

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    逝兮诚
  • spring-email官方翻译

    官方地址:https://docs.spring.io/spring/docs/5.0.0.M5/spring-framework-reference/html...

    逝兮诚
  • ElasticSearch(7.2.2)-RESTful风格的介绍

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    cwl_java
  • Python上手学习

    python的语法简单,可以很好提高个人生产力。我花了2天的时间重零开始学习python,目前已经能做爬虫了。

    逝兮诚
  • 基于知识图谱的文本自动注释(python+html)

    在探索知识图谱的过程中,发现它可以做一个有趣的应用——文本自动注释。在此整理并分享给大家。为了具体说明它的效果,让我们先来看一个例子:

    blmoistawinde
  • 恒星币Stellar对接教程

    Stellar区块链是一个广泛使用的区块链网络。在这个教程中,我们将学习使用JavaScript代码创建Stellar账户、进行Stellar账户充值、并向St...

    用户1408045

扫码关注云+社区

领取腾讯云代金券