从 DataReportal 2021 年 1 月的统计数据来看,全球 78 亿人口中,有 52 亿手机用户,46 亿互联网用户。
能够接入网络的设备越来越多,体量越来越大,不知道你有没有好奇过,这样一个庞大的世界是如何被构造出来的?思科(Cisco,世界 500 强通信设备提供商)在一篇报告中曾指出,2016 年年底全球 IP 流量超过 1 个 Zettabyte,也就是 1021 个字节,相当于一万亿 GB。那么如此庞大的流量体系,又需要何种结构去承接?
接下来我们会学习网络协议,比如 TCP/IP 协议、HTTP 协议,还会学习算法,比如时间窗口算法、校验和算法。这些协议和算法,只是整个互联网的一角,而整个互联网的全貌,我将借这次机会带你做一次漫游。
网络的组成
我们习惯称今天的时代为云时代,整个世界可以看作一张巨大的、立体的网。在这个时代里产生的各种服务,就好像水和电一样,打开即用。透过这张巨大的网去观察,里面还会有一个个小型的网络。你可以想象,用无数个节点构成一个个小型网络,再用小型网络组成中型网络,再组成大型网络,以此类推,最后组成完整的一个如星河般的世界。
公司内网
如果你仔细分析一个小型网络,比如一个公司网络,就会得到下图 1 所示的结构: 公司网络从本地网络服务提供商 (Internet Service Provider) 接入,然后内部再分成一个个子网。上图 1 中,你看到的线路,也被称作通信链路(Communication Link),用于传输网络信号。你可以观察到,有的网络节点,同时接入了 2 条以上的链路,这个时候因为路径发生了分叉,数据传输到这些节点需要选择方向,因此我们在这些节点需要进行交换(Switch)。
数据发生交换的时候,会先从一条链路进入交换设备,然后缓存下来,再转发(切换)到另一条路径,如下图 2 所示: 交换技术的本质,就是让数据切换路径。因为,网络中的数据是以分组或封包(Packet)的形式传输,因此这个技术也称作封包交换技术(Packet Switch)。
比如说,你要传递一首 2Mb 的 MP3 的歌曲,歌曲本身不是一次传输完成的,而是被拆分成很多个封包。每个封包只有歌曲中的一部分数据,而封包一旦遇到岔路口,就需要封包交换技术帮助每个封包选择最合理的路径。
在网络中,常见的具有交换能力的设备是路由器(Router)和链路层交换机(Link-Layer Switch)。通常情况下,两个网络可以通过路由器进行连接,多台设备可以通过交换机进行连接。但是路由器通常也具有交换机的功能。
在上图 1 中,公司内部网络也被分成了多级子网。每个路由器、交换机构成一级子网。最高级的路由器在公司网络的边缘,它可以将网络内部节点连接到其他的网络(网络外部)。本地网络提供商(ISP)提供的互联网先到达边缘的路由器,然后再渗透到内部的网络节点。公司内部的若干服务器可以通过交换机形成一个局域网络;公司内部的办公设备,比如电脑和笔记本,也可以通过无线路由器或者交换机形成局域网络。局域网络之间,可以通过路由器、交换机进行连接,从而构成一个更大的局域网。
移动网络
前面我们提到,网络传输需要通信链路(Communication Link),而通信链路是一个抽象概念。这里说的抽象,就是面向对象中抽象类和继承类的关系,比如同轴电缆是通信链路,无线信号的发送接收器可以构成通信链路,蓝牙信道也可以构成通信链路。
在移动网络中,无线信号构成了通信链路。在移动网络的设计中,通信的核心被称作蜂窝塔(Cellular Tower),有时候也称作基站(BaseStation)。之所以有这样的名称,是因为每个蜂窝塔只覆盖一个六边形的范围,如果要覆盖一个很大的区域就需要很多的蜂窝塔(六边形)排列在一起,像极了蜜蜂的巢穴。这种六边形的结构,可以让信号无死角地覆盖。想象一下,如果是圆形结构,那么圆和圆之间就会有间隙,造成一部分无法覆盖的信号死角,而六边形就完美地解决了这个问题。 对于构成移动网络最小的网络结构——蜂窝网络来说,构造大体如图 4 所示: 图 4 中,国家或全球网络提供商将网络供给处于蜂窝网络边缘的路由器,路由器连接蜂窝塔,再通过蜂窝塔(基站)提供给处于六边形地区中的设备。通常是国家级别的网络服务提供商负责部署基站,比如中国电信、中国联通。将网络提供给一个子网的行为,通常称为网络提供(Network Provider),反过来,对一个子网连接提供商的网络,称为网络接入(Network Access)。
随着移动网络的发展,一个蜂窝网格中的设备越来越多,也出现了基站覆盖有重叠关系的网格,如下图 5 所示: 这样设计的好处是,当一个基站过载、出现故障,或者用户设备周边信号出现不稳定,就可以切换到另一个基站的网络,不影响用户继续使用网络服务。
另一方面,在一定范围内的区域,离用户较近的地方还可以部署服务器,帮助用户完成计算。这相当于计算资源的下沉,称为边缘计算。相比中心化的计算,边缘计算延迟低、链路短,能够将更好的体验带给距离边缘计算集群最近的节点。从而让用户享受到更优质、延迟更低、算力更强的服务。
家用网络
还有一个值得讨论的是家用网络。近些年,家用联网设备越来越多。比如说冰箱、空调、扫地机器人、灯光、电动窗帘…… 如上图 7 所示,家用网络现在已经发展成一种网格状的连接。一方面家用网络会通过路由器接入本地 ISP 提供的网络服务。另一方面,一些设备,比如电脑、笔记本、手机、冰箱等都可以直接和路由器连接。路由器也承担了链路层网关的作用,作为家用电器之间信息的交换设备。
还有一些家用设备,比如说 10 多块钱的灯泡,不太适合内部再嵌入一个几十块钱可以接收 WI-FI 的芯片,这个时候就可以考虑用蓝牙控制电灯。路由器提供蓝牙不现实,因此一些家用电器也承担了蓝牙设备的控制器——比如说智能音箱。上图 7 中的智能音箱把家用网络带向了一个网格状,有的设备会同时连接路由器(WI-FI)和智能音箱,这样手机和音箱都可以直接控制这些设备。这样的设计,即便网络断开,仍然可以控制这些家用设备。
整体关系
以上,我们了解了 3 种常见的网络:公司网络、移动网络和家用网络。它们的整体关系如下图 8 所示: 最顶部的全球或国家大型的 ISP 之间联网,构成了网络的主干。然后区域性的 ISP 承接主干网络,在这个基础之上再向家庭和公司提供接入服务。移动蜂窝网络因为部署复杂,往往也是由大型 ISP 直接提供。
数据的传输
上述的网络结构中,由庞大数目的个人、公司、组织、基站,形成一个个网络。在这些网络中,传递数据不是一件容易的事情。
为了传递数据,在网络中有几个特别重要的抽象。最终提供服务或者享受服务的设备,称为终端(Terminal),或者端系统(End System),有时候简单称为主机(Host)。比如说:电脑、手机、冰箱、汽车等,我们都可以看作是一个主机(Host)。
然后,我们可以把网络传输分成两类,一类是端到端(Host-to-Host)的能力,由 TCP/IP 协议群提供。还有一类是广播的能力,是一对多、多对多的能力,可以看作是端到端(Host-to-Host)能力的延伸。
你可以思考一下,一个北京的主机(Host)向一个深圳的主机(Host)发送消息。那么,中间会穿越大量的网络节点,这些节点可以是路由器、交换机、基站等。在发送消息的过程中,可能跨越很多网络、通过很多边缘,也可能会通过不同的网络提供商提供的网络……而且,传输过程中,可能会使用不同材质的通信链路(Communication Link),比如同轴电缆、双绞线、光纤,或者通过无线传输的 WI-FI、卫星等。
网络基础设施往往不能一次性传输太大的数据量,因此通常会将数据分片传输。比如传输一个 MP3,我们会将 MP3 内容切分成很多个组,每个组也称作一个封包,英文都是 Packet。这样,如果一个封包损坏,只需要重发损坏的封包,而不需要重发所有数据。你可以类比下中文的活字印刷技术。
另一方面,网络中两点间的路径非常多,如果一条路径阻塞了,部分封包可以考虑走其他路径。发送端将数据拆分成封包(Packet),封包在网络中遇到岔路,由交换器和路由器节点决定走向,图 9 中是对封包交换技术的一个演示。
总结
互联网是一个非常庞大的结构,从整体来看,互联网是一个立体的、庞大的网状结构。但是如果将它放大、再放大,将镜头拉近,在微观层面,我们会看到一个个网络、一台台设备,还会看到大量的封包在交换、有设备在不断地改变封包的走向、损坏的封包被重发、一个个光电信号被转化和传输。
这个过程看似复杂,但任何一个局部的设计都在井然有序地运行着。每次我想要深入研究互联网的设计时,都不禁再次感叹它的浩瀚——如今你看到的网络,是经过几个时代的发展沉淀下来的“宝藏”。不是某个人、某个团队就可以设计出来。所以从这个角度,我们可以把计算机网络看作是优秀的分层设计、精密的模块组装、准确的数值运算等一系列设计思想、工程方法的集合。如果你想学习软件架构,互联网就是一个最好的参照。