目录
网络是操作系统中很重要的一个模块,特别是在现代操作系统中。另外,网络也是软件开发人员必须要掌握好的一项技能,特别是对于有志于成为架构师的开发者。网络是架构师四大基础技术之一,其他三个是操作系统、数据库和多媒体。别问我从哪里知道的,好好学就是了。
这里有读者就可能要问了,为啥网络和操作系统并列了,它不应该是操作系统中的一部分吗?这个说对也对,说不对也不对。从广义来讲,网络涉及的技术不只是操作系统里的那一部分。但是,操作系统中的网络却又是基础之基础。从哲学的角度来讲,万事万物都是相互关联的,只是大家看的角度不同而已。这一部分,我就尝试从不同的角度来给大家介绍一下网络。这里重点是不同角度,入门级别,就当是煮酒说网络。
网络是一个形象词,表示了一种建立于多个实体之间的关联关系。看到网这个字,我们首先会联想到蜘蛛网,纵横交错,纷繁杂乱。
网络后于计算机产生。但自从产生以后,一直都是计算机的一项标准配置。可以说,网络技术现在几乎是计算机技术中最流行的技术之一了。由于互联网相关产业的兴起和蓬勃发展,网络技术也在与时俱进。
除了技术本身之外,网络现在几乎也成了社会快速向前发展的巨大推动力。基于互联网,产业在发生巨大变化,许多新业态都是利用互联网思维进行产业创新而促成的。依托互联网,把生意做到地球村,已经是很多行业的必由之路。也许以后,很难再产生以地名命名的特色产业了。
说了这么多,无非是要表达一个思想:网络它非常重要,发展非常快。
前面我们说了,网络是一个形象的表示。在计算机中,以太网是我们最常见的。电脑上插网线的那个口,就叫以太网口。我们日常用的互联网也叫Internet,即因特网。大家就是将网线一头接到电脑以太网口,一头接到路由器或者光猫的以太网口,实现访问因特网的。当然,现在WiFi也很普遍了,很多人就通过WiFi建立无线局域网,实现多人上网。但是,我们需要强调的是,以太网只是网络中的一小部分,除此以外,还有许许多多相类似的网络,存在于我们的周围,影响着我们的生活。比如手机打电话和上网用的2G、3G、4G、5G等网络,也是网络的一种,只不过这些属于无线网。跟前面的电脑联网类似,这两种同属于接入网的分类,最终,它们都会汇入主干网,实现互联互通。再比如,家里的有线电视网,电力网,以前的有线电话网等等,都是网络的一种。这些都是我们看得见摸得着的,但也有许多大家平常都接触不到的网络,像许多工业领域用的总线网络等。
如上图所示,我们大家常见到的各种网,包括我们前面举例的各种网络,大部分都是属于接入网部分。真正的主干网、骨干网、核心网,很多人是很难有机会接触的。
虽然有这么多网络,不过这里主要介绍操作系统中可以看到的网,也就是以太网。另外,以以太网为基础,也会尽量介绍网络的一些共性东西,比如网络架构上的,网络协议上的等等。无论从那个角度来看,网络都是一个复杂的技术,每一个小部分,可能都需要一部大块头来详细说明。所以,面面俱到,既没有这个能力,也没有这个必要。这里,我们尽量关注与应用开发有密切关系的一小点内容。
网络,本质上是要完成信息在多个节点之间的远距离传输,而不论采用什么样的传输介质,什么样的协议。而且,这种远距离传输,还要可管可控,数据的及时性、完整性、安全性等,都是需要保证的。
首先来看,网是怎么搭建的,然后再看是怎么传输的。从最基本的要素来看,要完成信息的远距离传输,至少需要三个参与主体:发送方、接收方、以及中间的传输通道。如下图所示:
上图中,只有一个发送方和一个接收方。实际情况中,参与方(这里,我们用参与方,而不是具体的发送者和接收者。因为从实体的角度来看,这种身份的划分并不绝对。只是在某一次通信中,实体可能扮演了发送者或者接收者的角色)都是n个,这里n从1到几乎无穷。一个发送者可能将信息发送给多个接收者,多个发送者也可能将信息发送给一个接收者。这里二者是n:n的映射关系。除此,传输管道也不可能是一条,而是m条,这里m也是从1到几乎无穷。所以,实际的网络连接,可能是下图这样的:
按上图建网,实施起来其实并不容易,而且显得杂乱无章。另外,技术上可以做到一条传输通道上,承载多个终端的信息,上图可以简化为下图:
这样,我们就把逻辑上的信息通道,跟物理上的线路通道区分开来,各自发展各自的部分,只要定好二者之间的接口即可。这是计算机中常用的分层技术在网络中的体现。分层以后,物理通道的建设者和逻辑通道的建设者可以将更多焦点聚集在自己关注的部分。物理通道的建设就考虑如何提供更便捷的实施、更快的速度、更大的带宽、更低的成本等等。逻辑通道建设者则认为其下面有一个相对可靠的物理通道,自己只需考虑如何设计多个逻辑通道的协议,如何更好的利用带宽等等。如此一来,二者也解耦了,自然可以发展的更快更好。如果从这个角度来看,网络的架构就是下面这样了:
有诗曰:横看成岭侧成峰,远近高低各不同。每种模型只是重点关注了某一个方面,所以实际中,我们可以根据需要,选择适合说明问题的结构模型。
在前面的介绍中,我们反复提到了一个词“通道”。通道一词虽然概括的清晰简明,但是,容易掩盖细节,误让人将物理连接想象成一个管道。实际中,网络底层的连接有多种结构型,比如星型、环型、总线型、树型等拓扑结构,如下图:
上面各种拓扑都有自身的优缺点,没有十全十美的拓扑结构。实际中往往是根据需求,组合运用上述拓扑,最终呈现的可能是一个混合结构型。而且,实际网络的建设中,不仅仅关注连接,还有连接两端的设备节点也是需要考虑的。交换机、路由器、防火墙、网闸、网关等设备的运用,已经模糊了连线本身的作用。整个大网络的构建是极其复杂的,抽象层次也不再是如上图那般具体化。如第一部分的那张图,整个网络可以分为三个大的层次,包括接入层、汇聚层、核心层。核心层也不是一张网,而是多个网并存,且许多节点上可能存在独自构建的局域网、数据中心。局域网我觉得更多的是体现一个逻辑概念,而非物理距离概念。虽然很多局域网是受限于学校、政府、单位这样的范围内,但是,看的更高点,核心网也可以看成是一个大局域网。大洋两端的设备也可以构建一个局域网。而数据中心的网络构建,则是现代云计算发展历程中,优化基础设施的一大创举。感兴趣的读者,可以找些资料,来深入学习。
鉴于人们对效率、安全、管控等其他特性的追求,大家往往会发现,实际构建出来的网络与抽象中的结构可能相差十万八千里,复杂千万倍。不过,人类管理复杂性事物的办法就是分而治之。所以,网络建设就交给了专门的工程师来完成,这块也就自然而然的演变成为了一个细分行业。专业的人干专业的事,专业的事交给专业的人,这是现代社会的效率法则。
无论网络最终构建成为什么样子,有哪些连接、哪些类型设备参与,其本质作用是不变的。所以,我们还是可以抽象出来一个网络架构,来比较符合实际的理解网络的上一层:逻辑通道。这个抽象的架构如下图所示:(图片来自Edraw)
上图中包括两个部分:上下两边是设备接入部分,中间是路由部分。后面的讨论,都将以该网络架构为原型展开。
建网的目的是为了传输数据。有了上面的抽象架构,我们来看,数据是怎么在其上传输的。云计算中将计算机资源抽象为计算、存储、传输三大块,也可见传输的重要性。
笔者注意到,在很多介绍计算机网络的书籍中,对数据如何在网络中传输都采用了类比的方法,且多以寄送信件或邮递快件为例子。这说明,数据在网络中传输的过程,很像我们生活中送快件。这里,我也落个俗套,需要时也以快递为例。
首先,传输的数据,无论是数字方式,还是模拟方式,本质上还是由0和1这种二进制数构成的。计算机中的数据肯定是数字形式存在的。但是,线路上的数据,大部分都是模拟的。学过通信的都知道,基于管道的特性,直接在线路上传输数字信号有很多限制。常见的也就串口这类,距离很短,速度有限。所以,要远距离传输大量数据,需要走模拟这条路。但是,原始的模拟信号也不靠谱。变形了,丢失了,很难恢复和找回来,所以,现代通信都讲究的是数字调制解调技术。简单来理解,就是将数字信号调整到有某种规律特征的模拟信号中,然后再在线路上传输。这样,接收端就可以基于同样的特征和规律,对接收的数据进行判定、校验和恢复。
拿以太网为例子,PHY层就是做这件事情的。向下,它将接收的数据进行进行数模转换,送到网线上传输;向上,将从网线上接收的数据进行模数转换,再送给MAC层,也就是链路层。通过网线传输,属于有线模式。也可以通过无线通道来送数据,这就是我们常见的WiFi。通过综合运用频率、时间、编码等多种手段,电磁波也可以完成比较可靠的多通道数据传输。
基于底层的调制解调技术,二进制的0和1构成的数据串就可以在物理通道上传输了。如下图红框部分。
其次,数据的内容需(也就是0和1构成的数字串)要有一定的格式,至少要包括发送方和接收方的地址吧。这就类似于我们送快递,上面要贴个标签,说明谁从哪里寄出,什么东西,要寄送到哪里,由何人签收。数据包的格式,大概也要包括这些内容。当然,基于数字通道的特性,还会包括其他一些辅助的内容,比如用于校验数据完整性的,确认数据安全性的等等。这些有特定目的内容,常常被称为字段。一个数据包通常是由多个字段构成的。
类似送快递时包裹一般不会直达目的地,而是要通过中转,网络上的数据包也要通过中转,这个过程被称为寻路或者路由过程。前面网络架构图中的路由器就是干这件事的。实际中,可能有很多路都可以到达目的地(这可能是有意的,比如核心网中的备份通道;也可能是无意的,比如多个独立网的相互对接),这就需要路由器选择一条最合适的路。选路是一件复杂的事情,需要算法和协议的支撑,感兴趣的读者可以阅读专业的书籍来进一步了解。
上面所述的这些中间接收者发现包裹不是自己的,就将其继续送到通往目的地的下一站。只不过对于网络传输来讲,数据只是电信号,中间转发过程需要复制。言外之意,你收到的那个电信号已经不是最初的那个电信号了,而你收到的包裹还是最初的那个包裹。
就这样,数据包从你的电脑或手机或PAD等设备出发,进入家里的路由器,再到楼道的网关,进一步的到运营商。之后,由运营商构建的网络,负责将你的电信号包裹送到目的地。
一路上,10 01010 组成的二进制串在流动。李白诗言,朝辞白帝彩云间,千里江陵一日还;两岸猿声啼不住,轻舟已过万重山。信息在网络上,岂止是一日还,可谓是千里江陵瞬间还。
数据在网络上一路狂奔,能够正确的从发送端到达接收端,实际上还有许多技术问题需要去解决。这些问题不仅包括软件上的,还包括硬件上的,特别是核心层大数据量的正确路由和交换。对网络应用软件的开发者来讲,不需要过多关注这些内容。开发者始终可以认为底层是一个基本安全且快速可靠的通道。
有了这样一个通道,剩下的事情就是数据该如何组织的问题了。这里所要强调的数据组织,并不是前述的有关源、目的地址等数据字段。那些字段是明确且必要的。但是,光有那些字段还不够。有人说计算机干的大部分事情是处理各种异常,此话是有一定道理的。如果一切都像计划经济那样安排好了,事情也就没有必要搞的那么复杂。网络传输也一样。将数据简单组装后发给目的方,就认为数据肯定能够按时完整到达接收方,这是过于理想化了。虽然我们在前一部分给出通道基本安全且快速可靠,但是还是有丢失数据的可能性的。至于原因,就多了去了。可能是中间设备来不及转发(虽然现在路由器都在向硬转发发展,但是短视频应用的爆发,远程办公的流行,元宇宙的加入,可以预见,通道拥挤的现象将长期存在),也可能是路由失效,甚至是硬件出错(比如高温、器件老化)。就是说从软件到硬件都是有可能的。当然了,这类错误的概率是比较低的,但也不能完全忽略了。正是这一小概率的事件,让可靠数据传输的设计陡然复杂化了。关于这种复杂化的详细信息,也是下一部分有关数据格式内容的一个重点。这里只是先做一个引子,后面再详细介绍。读者注意有这么个情况存在即可。
通道的特性会影响网络协议的设计。上面的丢包率就是一个很重要的参数。其他还有带宽、延迟等。这些参数是相互影响的。好的设计,可以降低丢包率,提高带宽的有效利用率,并在宏观上降低总体延迟。
通道是固定的,暂且可以这样认为;通道也是单一的,暂且也可以这样认为。不过,应用的场景却是多样的,这就如下图所示:
如上图所示,数据虽然跑在一条通道上,但是,利用这条通道,可以进行的应用场景却是要丰富的多的多。像邮件、聊天、音视频、游戏、办公等等。如此多的应用,相互之间是如何区分数据的,又是如何解决数据丢失的问题的?而且,这其中的很多应用,参与方不仅仅是一家产品。比如邮件,双方的应用很可能不是一个公司的产品,而不同公司的产品之间,又是如何做到互认的呢?这个问题的答案可以通过类比生活中的其他产品得到。就拿电脑来说,早些年在北京,大家买电脑就去中关村。那里有很多的电脑组装商家,专门做配电脑的生计。一台电脑配装下来,完全存在这样一种可能:不存在两种及以上的部件是同一厂家的。也就是所有的部件都是不同厂家的。之所以能够做到这一点,是因为有接口标准约束。大家按标准设计生产,自然就不存在不兼容的情况。前述网络应用也是如此。大家按照标准协议开发,产品的互联互通也就不存在问题。各种应用的数据在放到传输通道之前,都按照约定格式进行打包封装,接收方只要依据相同规则拆包,就可以得到正确的数据。
实际上,网络的世界,就是由一整套的协议规则构筑起来的。从最低层的硬件到最上层的应用,从我们常接触到的终端和服务器到传输路径上的各种网络设备(网关、路由器、防火墙),只要涉及两方及以上的通信,就需要相应的协议来规范和保障。我们日常看似简单的上网活动,背后是成千上万种协议来支撑的。关于网络方面各种协议的具体内容,感兴趣的读者可以查看RFC网站:https://www.rfc-editor.org/
关于网络传输,就简单介绍到这里。在第三部分,我们会就操作系统相关的、也就是用户编写网络应用相关的部分,进行一些讨论。
最后,为了讨论的完整性,我们简单看一看网络安全与管理方面的一些问题。对于安全与管理,本身是一个很大的主题,涉及到很多的内容,其复杂度不亚于网络的其他部分。随着网络的普及,安全与管理在整个网络体系中也开始占据越来越重要的地位。
首先,对于安全,主要是保证数据不被第三方非法获得或窃取,无论是有意的还是无意的。这种泄漏,可能发生在传输过程中,也可能发生在传输之前。而解决这个问题,采用的主要方法是加密。将数据加密之后再传输,避免直接明文传输,这样,即使数据被窃取了,对方也不知道传输的是什么内容,如此就达到了保证安全的目的。
其次,对于管理,主要是对网络的运行状况有一个监测,从而在必要时做出反应。比如,对网络流量做出分配,对端口进行分配或限制,对转发和路由进行配置等。经验告诉我们,过程越复杂,管理也就越困难。所以,现在基于云计算的发展要求,又提出了软件定义网络的概念。个人理解其核心就是,通过简化过程来简化管理,有点宏观调控的意思。数据包该怎么走,不能完全交由路由决定,可以通过人为划定转发通路,实现数据的有序流动。