计算机网络的出现

在当今社会,计算机已经无处不在了。
然而,在计算机诞生初期,其实是经历了一系列的演变与发展。从大型通用计算机、超级计算机、小型机、个人电脑、工作站、便携式电脑再到现在的手机、智能家居等等,本质上都是计算机的体现。

在最早期的时候,计算机主要以单机的模式使用,用于从事一些科学研究的计算等工作。然而随着计算机的不断发展,计算机的数量也越来越多,人们不再局限于单机模式使用计算机,而是希望能够将计算机连接在一起,形成了一个计算机网络。这样一来,堕胎计算机可以实现信息共享,同时还是在不同位置的机器之间实现信息、数据的传递。如下图所示:
image.png

那么,针对不同规模的计算机网络而言,我们又可以将其分为 WAN(Wide Area Network 广域网)和 LAN(Local Area Network 局域网)。其中,局域网就是指一般一栋楼或者一个校园、一个公司内部联通的网络,而广域网就是指能够在极大的范围内互联互通的网络,例如我们现在最常用到的移动网络等等其实都是广域网。
至今为止,网络已经就像我们身边的空气,我们很多时候甚至无法想象如果没有网络,我们的工作、生活会是什么样子。

计算机/网络发展的几个阶段

批处理阶段

在计算机最早期出现的时候,完全是用作生产力工具来使用的,主要用于进行一些科学问题的计算等相关工作。当时,计算机的价格昂贵、体积巨大,无法在一般的办公场景中使用。因此,对于科研人员而言,他们需要提前将用户程序和数据写入卡带,然后交给计算机按照一定的顺序读取并计算,并将计算得到的结果通过打印机等方式打印出来。
image.png
在这个过程中,计算机通常是由计算机中心的专业人员进行操作,普通用户只能将准备好的程序卡带交给运维人员,并等结果打印后再从运维人员处取回结果。此时的计算机时代其实基本还不涉及到网络相关的内容,纯粹是生产力计算工具而已。

分时系统阶段

在 20 世纪 60 年代,计算机领域出现了分时系统(Time Sharing System)。它是指我们可以将多个显示器、键盘等与同一台计算机进行连接,这样一来,就可以有多个用户同时来使用一台计算机了。这个时候,虽然计算机本身的造价还是很昂贵,但是通过分时系统,在效果上实现了『一人一机』的目的。
分时系统出现后,计算机的可用性得到了极大的改善,同时还促进了 BASIC 这样的编程语言的发展。
image.png
而由于在分时系统的场景下,我们会出现多个终端(显示器/键盘等)连接到计算机的场景,因此,网络通信也逐步出现了雏形。

计算机间通信阶段

在分时系统时,虽然终端能够和计算机能够用通信链路进行连接,然后计算机和计算机之前其实还是不能进行通信的。
而到了 20 世纪 70 年代,计算机又得到了进一步的发展,计算机不再仅仅局限于科研机关使用,一般的企业也逐渐还是引入的计算机。为了能够提升企业内部引入计算机后的工作效率,人们开始研究计算机之间的通信技术了。
image.png
通过让多台计算机能够联通进行通信,一家公司可以购入多台计算机,例如可以以部门级别进行分配。每个部门处理完部门内部的数据之后,可以上传到总部的计算机并进行汇总得到最终的结果。

计算机我网络出现

image.png
在 20 世纪 80 年代,计算机之间的通信网络得到了进一步的发展,它已经能够互联多种计算机,从大型的超级计算机到小型的个人电脑,都可以通过路由器、以太网等方式进行连接通信了。
同时,也是在这个时代,可视化操作系统(例如 Windows,Mac OS X)也逐步开始出现,用户使用计算机的成本进一步降低,同时还能够同时执行多个程序并自由的在不同的程序之间进行切换。

互联网普及

进入到 20 世纪 90 年代,计算机和互联网就已经在一定程度上得到了普及。计算机逐步成为了研究人员、计算机学生的标配。
image.png
也是在这个时代,Email,WWW 万维网等信息传播的方式也得到的飞速的发展,使得互联网从大到整个公司、小道每个家庭内部,都开始逐步进行普及。面对这样一种趋势,各家厂商不仅力图保证自家产品的互联性,也还是让自己的网络技术与互联网计算兼容。

以互联网为中心

随着互联网的不断发展,需要不同的网络技术也已经开始向互联网靠拢。例如曾经的通信基础设施电话网也随着时间的推移逐步被 IP 网所替代。通过 IP 网,人们不仅可以实现电话通信、电视播放、还能实现计算机的通信,建立互联网。
同时,能够联网的设备也越来越多,不仅仅局限于计算机,而是扩展到手机、家用电器等等方面。
image.png

安全建立连接

目前,虽然互联网已经让人们通过计算机网络已经能够跨越国境自由的连接在一起了,然后事物的发展也具有两面性。随着而来的问题就是网络安全的问题越来越严重,例如信息泄露、网络欺诈等等。因此,在目前的时代中,人们已经不再单纯建立连接,更是要追求安全的建立连接了。

网络通信中的协议

在计算机之间的网络通信中,协议有着非常重要的作用。
它就类似于人与人之间的交流,假设有 A、B、C 三个人,A 只会说汉语、B 只会说英语、而 C 既会说汉语也会说英语。
那么,现在 A 和 B 如果想要聊天,他们应该如何沟通呢?
image.png
由于 A 和 B 使用的语言不同,就类似于二者使用的通信协议不同,互相之间是无法理解对方的含义,也就没法进行有效的信息交换了。
而对于 A 和 C 而言呢?
image.png
由于他们都会使用汉语,就类似于他们都支持同一种协议,因此,他们能够正常的进行交流和通信。

计算机之间的通信协议就类似于人的语言一样,是一种事先达成的约定和规则。这种规定和规则使得那些不同厂商的设备、不同的 CPU以及不同的操作系统组成的计算机之间,只要遵循相同的协议,就能够实现有效正常的通信。

CPU 也称为中央处理器,它负责程序的调度与执行,很多程度上影响着计算机的性能。常用的 CPU 有 Intel Core、Intel Atom、ARM 等。 OS 也叫操作系统,它包含了 CPU 管理、内存管理、外接设备管理、程序运行管理等等。通常关于通信协议的处理一般都是嵌入到了操系统中,常用的操作系统包含 UNIX、Linux、Mac OS、Windows 等等。 一台计算机上能运行的指令与其 CPU、操作系统等都息息相关。因此,如果将针对某个 CPU、操作系统设计的程序直接复制到其他操作系统或者CPU的计算机中,很可能不能正常运行。

那么,在计算机通信领域中,有哪些协议呢?我们可以看一下下面的表格:

网络体系结构 协议 主要用途
TCP/IP IP,ICMP,TCP,UDP,HTTP,TELNET,SNMP,SMTP 互联网/局域网
IPX/SPX(NetWare) IPX,SPX,NPC 个人电脑局域网
AppleTalk DDP,RTMP,AEP,ATP,ZIP 苹果产品局域网
DECnet DPR,NSP,SCP 前DEC小型机
OSI FTAM,MOTIS,VT
XNS IDP,SPP,PEP 施乐公司网络

在目前的计算机通信协议中,TCP/IP 协议占据了核心的地位,绝大部分的网络通信场景都是基于 TCP/IP 网络体系结构进行通信的。
image.png

了解了什么是通信协议之后,我们在来看一个概念:分组交换协议。分组交换是指将大数据分割为一个个的较小单位的包(Packet)进行传输的方法。
image.png
计算机通信就向邮寄快递一样,会在每一个分组中附加上源主机地址和目标主机地址,而附加这些信息以及分组序号的部分也成为报文首部。其中,针对一个较大的数据分为多个分组时,为了表明该数据是原始数据中的哪个部分,就需要将序号也写入报文首部。当接收到接收到相关的数据后,可以按照分组序号在重新装配为原始数据。
在一个具体的通信协议中,通常会规定报文首部应该写入哪些信息以及应该如何处理这些信息。而相互通信的每一台计算机则按照协议的规定来构造和解析报文首部等等。
那么,这就引出了一个问题,协议应该由谁来制定呢?

在计算机通信诞生之初,通信协议的标准化并没有得到足够的重视。在这一个阶段,各个计算机厂商都会推出自己的网络产品和通信协议来实现计算机通信。然而,由于各家厂商的各种网络结构、协议各异,导致不同厂商的设备即使在物理层面进行了连接,但也无法进行有效的通信。
image.png
为了解决上述问题,先是由 ISO 组织指定了一个国际标准协议 OSI 对通信系统进行了标准化,目前,虽然 OSI 协议虽然没有得到普及,但是它的指导方针 OSI 参考模型却被用于各种网络协议的指定中。
由 IETF 组织建设和推行了一种 TCP/IP 协议。截止目前,TCP/IP 已经成为了互联网通信协议的业界标准了。通过协议的标准化,各家厂商的设备只要遵从相同的协议,也就能够正常的进行通信了。

IETF 是一个用于促进互联网协议标准化的民间组织。 除了像 IETF 这样的民间组织之外,常见的标准化协议组织还包括两个大类,分别是 ISO 之类的国际级标准化组织和 ANSI 这样美国的国家级标准化机构。

协议分层和 OSI 参考模型

在 ISO 组织进行 OSI 标准指定之前,首先设计了 OSI 参考模型。这一模型将通信协议中的必要功能分成了 7 层。通过对协议进行的分层,可以使得复杂的网络协议处理起来更加的简单。
在 OSI 的 7 层模型中,每个分层都接收由它下一层所提供的服务并且为上一层提供特定的服务。其中,上下层之间交互时所遵循的约定我们称之为接口,同一层之间的交互所遵循的约定我们称之为协议。
image.png
协议分层就像我们软件开发过程中的模块化开发,可以通过解耦来降低整体系统开发的复杂度。

我们还是以一个现实生活中的例子来理解一下什么是协议分层,我们以电话聊天为例:
image.png
在两个人通过电话进行聊天时,我们可以简单的将整个过程分为两层。
首先是语言层面 ,二者需要使用相同的协议,例如,你说英语我也说英语,这样互相可以理解。同时呢,在真正的通信设备层面呢?我们的通信设备也要遵循相关的协议,才能将我们说的话正常的传输到对方的耳中。
在这个过程中呢,每一层其实都是可以单独替换的,例如,在语言层,我们双方都可以换成汉语来进行交流。另外,除了用电话机进行交流之外,我们双方还可以换成通过无线电来进行沟通。

具体到 OSI 参考模型,它对通信协议中必要的功能做了很好的归纳,掌握 OSI 参考模型对于深入理解计算机通信网络是非常重要的。那么,我们具体来看一下在网络通信领域中的 OSI 参考模型究竟是什么样的吧:
image.png
接下来,我们来以一个具体的示例来阐述七层网络模型中各层的功能的作用,我们假设用户 A 在主机 A 上要给主机 B 上的另一个用户发送一封电子邮件,如下图所示:
image.png
可以看到,对于发送端而言,从第七层、第六层到…到第一层由上至下传输数据,并且在每一层传输数据的过程中在已有数据包的基础上附加了当前分层的协议中所需要的首部信息。而对于接收端而言,从依次从第一层、第二层依次到第七层依次接收和解析处理数据,并将处理后的数据传输给上一层,最终将发送端发送的数据恢复原状。
下面,我们来进一步对逐层的功能进行展开说明,我们先来看应用层。应用层其实离我们用户是非常近的,例如用户在主机 A 上新建一封电子邮件,指定收件人为 B 并输入了邮件相关的内容。当用户点击发送按钮的时候,其实就进入了应用层协议的处理过程。该协议会在传输的数据上增加一个头部标签,例如标识该邮件的收件人为B。当主机 B 的应用接收到邮件后,会根据头部信息和消息体进行解析,得到邮件的完整内容。如果当邮件收件人不存在等场景,会给邮件发送方 A 返回一个错误信息,而客户端也需要根据对应的错误进行处理,这些其实就是应用层需要解决的问题。
对于表示层而言,其更多的关注在于数据的具体表现形式。例如,对于不同电话的邮件服务,构建显示的样子、字体等各方面都可能有所差异,那么如何在不同电脑之间进行邮件通信呢,首先就是需要在客户端将数据从”某个计算机中特定的数据格式”转化为”网络中通用的数据标准格式”,然后发送出去。对于接收端而言,在将接收到的标准格式的数据转化为本机中具体的表示形态进行显式即可。其中,所谓的网络中通用的数据标准格式其实就是我们经常会提到的各种数据编码格式,例如 UTF-8 等。
那么会话层的作用是什么呢?会话层的主要责任其实是确定采用什么样的方式进行连接。例如,当我们要发送5封邮件时,是应该每发送一封邮件,建立一个连接,发送完成后释放,再建立连接发送下一封;还是建立一次连接依次发送5封邮件后释放连接;亦或者是同时建立5个连接来独立发送5封邮件等等。
到目前为止,我们通过例子说明了从应用层到会话层相关的功能,而它们对于不同的应用类型而言,其实是有相对较大的差异的,而且至此为止,其实还并不具备真正的数据在网络上传输的能力。真正负责数据包在网络上传入的其实是会话层之下的各层协议,它们真正负责将数据包在网络上进行传输,而且它们通常与应用无关,针对不同应用的处理逻辑基本一致。
传输层负责具体建立连接、断开连接并且保证数据正确的传入到达目标地址,例如,如果在传输的过程中,部分数据没有到达目标地址,它会负责进行数据重发等。简单的来说,传入层的作用就是保证数据传输过称中的可靠洗。
网络层的作用是在网络与网络互联的环境里,将数据从发送端主机发送到接收端主机。具体来说,就是在一个复杂的网络环境中,如何找到正确的目的地址并将数据传输到正确的目的地址上。这个地址是网络通信中唯一标识,类似于我们生活中的电话号码,需要这个目标地址确定,就应该能够从众多计算机中找出目标地址对应的机器并发送给对应的数据包。
通信传输实际上是通过物理介质来实现的,数据链路层的作用就是在这些通过传输介质互联的设备之间进行数据的处理。
物理层中,将数据的0、1转化为电压和脉冲光传输给物理的传入介质,而相互直连的设备之间使用地址实现传输。此处的地址是指 MAC 地址,也叫做物理地址或者硬件地址。MAC 地址主要用于区分同一个传输介质上的设备。

传输方式的分类

在网络通信的过程中,我们可以根据不同的方式进行分类,我们可以看几种常见的分类方法。

有连接型和无连接型

image.png
有连接型是指在发送数据之前,需要在收发主机之间建立一条通信线路。这就类似我们在打电话的过程中,我们在拨出电话后,需要等对方接通之后才能进行通信。
无连接型就是指在通信之前不需要专门的建立连接。发送端可以在任何时候自由的发送数据,而接收端在接收到数据之前其实是完全不知情的。此时,接收端需要自行判断是否接收到了数据。这就类似于我们在发快递的时候,不需要提前告知收件人,只要有一个收件人地址就可以直接发送包裹了。

根据接收端数量分类

在网络通信中,我们还可以根据目标地址的个数和行为来进行分类,例如单播、广播、多播、任播等。
image.png
单播是最简单的场景,其实就是一对一的通信,例如我们打电话的过程。
广播是指消息从一台主机发送给与它相连的全部其他主机,一个典型的场景就是电视播放,电视信号是一齐发送给多个接收对象。对于广播而言,进行广播的计算机都有其通信范围,只有在这个范围内的计算机才能够收到官博的消息,这个范围也称之为广播域。
多播和广播类似,也是将消息发送给多个主机,区别在于多播会限定某一个条件的一组主机作为接收端,常见的场景例如视频会议等。
任播是指从特定的多台主机中选出一台作为接收端的方式。任播本质上还是选择了一台机器进行消息发送,而被选中的那台主机返回的将会是一个单播信号。例如,DNS 解析等场景其实就是任播的实践,常用于负载均衡等场景。

电路交换与分组交换

image.png
电路交换历史久远,常用于过去的电话网。在电路交换中,交换机负责数据的中转处理,计算机首先被连接到交换机上,而交换机与交换机之间则有众多通信线路在继续连接。在计算机之间进行通信时,就需要通过各个交换机最终与目标主机建立起连接。在电路交换的方案中,一条线路仅仅能用于两台计算机之间的通信,如果同时连接了多台计算机进行互相通信的话,将会导致数据混乱,无法发送到最终的目的地。
为此,人们想到了一个新的方式,让连接到通信电路的计算机将所要发送的数据分成多个数据包,按照一定的顺序分别发送。这其实就是分组交换。当数据被细分后,所有的计算机就可以同时收发数据从而提升通信线路的利用率。那么,如何保证通信过程中正确的发送数据到指定目标主机呢?这就需要在每个分组的首部写入了发送端和接收端的地址,此时,即使一条线路同时为多个用户提供服务,也可以正确将每个数据包发送到目的地并确定它是与哪天计算机进行通信。
image.png
在分组交换中,是由分组交换机(路由器)进行通信线路的连接。分组交换的消息发送过程中,数据先是由发送端计算机将数据分组发送给路由器,路由器收到数据后先缓存到自己的缓冲区,然后再转发给目标计算机。其中,路由器本质上是按照一个先进先出的队列顺序来处理分组数据包的。在分组交换中,由于多台计算机可以共享同一个线路,因此,它们本质上其实是共享了同一条通信链路的。
image.png

通信过程中的地址

在通信过程中,发送端和接收端都是通信主体,其实它们都可以通过一个地址来唯一标识出来。这个地址就类似于我们打电话过程中的电话号码。
在计算机通信领域,每一层协议中所针对的地址可能都不尽相同,其中,在 TCP/IP 通信中涉及到的地址就包括了 MAC 地址、IP 地址、端口号等信息,此外,在应用层还可以将电子邮箱地址等作为通信的地址。
那么,在网络通信过程中,地址需要具备哪些特性呢?其核心应该是唯一性和层次性。
先来看唯一性,唯一性其实是比较好理解的。在通信的过程中,一个地址首先必须能明确的标识一个主体对象,同一个通信的网络中不允许有两个相同地址的通信主体,否则将会导致无法判断应该将消息发送给哪台主机。
下面再看来层次性,层次性解决的是当地址总数越来越多的时候,如何高效地从全部地址中找出通信的目标地址。例如,在电话号码中的区号、通信地址中的国家名称、省名、市名等体现的正是层次性。
image.png
那么我们来具体看一下通信过程中的地址。MAC 地址和 IP 地址在标识一个通信主体时都是具备唯一性的,但是 MAC 地址在服务通信过程中并不具备层次性,只有 IP 地址具备层次性。
MAC 地址是由设备制造厂商在出厂时为设备指定的地址,人们可以通过制造商识别号、制造商内部产品编号以及产品通用编号来唯一的找到MAC设备,虽然这些本身也是具备了一定的层次性,但是这个层次性对于通信过程中的设备发现没有任何帮助。因此,MAC 地址虽然是真正负责最终通信的地址,但在实际寻址的过程中确实强依赖 IP 地址的。
IP 地址是由网络号和主机号两部分组成。如果主机号不同,但是网络号相同,则说明二者处于同一个网段之中。同时,同一个网段的机器往往也属于同一个部门或者集团等。同时,网络号还与供应商、地域分布等都具备一定的关系,这些也都是 IP 地址的层次性体现。
在网络传输的过程中,每个节点都会根据数据包中的地址信息来判断报文应该由哪个网卡进行发送。在这个过程中,MAC 寻址和 IP 寻址都会参考一个接口列表。其中,MAC 寻址参考的表叫做地址转发表,IP 寻址的表则称为路由控制表。MAC 地址转发表记录的就是实际的 MAC 地址本身,而路由控制表记录的 IP 地址则是网络号与子网掩码等信息。
我们来以一个示例图看一下整个寻址的过程:
image.png
当主机A想要给数据B发送数据时:

  • 主机 A 首先查看自己的本地路由控制表,再根据此表将数据先发给路由器 1。
  • 交换机 1 根据自己的地址转发表将数据转发给路由器 1。
  • 路由器 1 根据自己的路由控制表将数据转发给路由器 3。
  • 路由器 3 根据自己的路由控制表将数据发送给交换机 3。
  • 交换机 3 根据自己的地址转发表发给主机 B。

PS:实际的地址转发表和路由控制表中获取的信息并不是具体的目标地址,而是数据应该被发送出去的网卡信息。

计算机网络的构成

搭建一套环境要涉及到各种电缆和网络设备等,如下图所示:
image.png
首先,计算机和网络设备之间需要使用电缆进行连接。电缆包含很多种,不同的数据链路中使用的电缆也各不相同,而电缆材料本身又可以划分为电播、微波等不同的类型。我们将常规的电缆分类总结如下表:

数据链路名称 通信媒介 传输速率 主要用途
以太网 同轴电缆 10Mbps LAN
双绞线电缆 10Mbps - 100Gbps LAN
光纤电缆 10Mbps - 100Gbps LAN
无线 电磁波 几 Mbps LAN、WAN
ATM 双绞线电缆
光纤电缆
25 Mbps /155 Mbps / 622 Mbps LAN、WAN
FDDI 双绞线电缆
光纤电缆
100 Mbps LAN、WAN
帧中继 双绞线电缆
光纤电缆
64k - 1.5 Mbps WAN
ISDN 双绞线电缆
光纤电缆
64k - 1.5 Mbps WAN

在数据传输的过程中,设备之间数据流动的物理速率我们称为传输速率,单位为 bps(Bit Per Second)。由于光、电的速度是恒定的,因此严格意义上每个传输媒介的信号速度也应该是恒定的。而不同的传输媒介的传输速率则各有差异,我们有时又将传输速率叫做带宽。 而具体到主机应用之间的数据传输速率,我们称之为吞吐量,单位也是 bps。但是吞吐量不仅取决于带宽、还取决于主机的 CPU 处理能力、报文中有效数据占比甚至应用程序的处理逻辑等等。

下面,我们来依次了解一下组成计算机网络的各种硬件设备及其相应的功能。

  • 网卡:任何一台机器机相应连接网络,必须使用网卡。网卡可以是内置在计算机主板上,也可以通过拓展槽接入 NIC 卡后进行联网。
  • 中继器:中继器是 OSI 模型中的第一层设备,用于在物理层面上延长网络传输。具体来说,它可以将电缆传输过来的电信号或光信息经过波形调整和放大后传输给另一个电缆,如下图所示:

image.png

  • 网桥/2层交换机:网桥作用于 OSI 模型的第二层,用于在数据链路层面连接两个网络的设备。它能够识别数据链路层中的数据帧,并将这些数据帧临时存储于内存,再重新生成信号作为一个全新的帧转发给另一个相连的网段。此外,在数据链路层,有一个数据位叫做 FCS,可以用于校验数据是否被损坏,网桥可以利用该信息进行数据包校验并丢弃损坏的数据,避免发送给其他的网段。同时,网桥还能通过地址自学机制和过滤功能来控制网络流量。

image.png
image.png

  • 路由器/3层交换机:路由器作用于 OSI 模型的第三层,在网络层面上连接两个网络,并且对分组报文进行转发的设备。它和网桥的区别在于网桥是根据 MAC 地址进行处理,而路由器是根据 IP 地址进行流量处理的。

image.png

  • 4-7层交换机:4-7层的交换机负责处理 OSI 模型中从传输层到应用层的数据。例如,对于一个并发很大的 Web 服务,可以使用 4-7 层的交换机当前负载均衡器,将用户流量转发到多个不同的主机上。
  • 网关:网关和 4-7 层交换机一样,都是处理的传输层以上的数据。但是网关仅仅负责数据的转发,还会承担一些数据格式的转化工作。例如,通过网关可以让同一份邮件即可以在手机上显示、也可以在电脑上显示等。此外,网关还尝尝可以用作代理服务器,从而可以实现流量的控制以及安全性保证等功能。

image.png

现代网络实态

了解了这么多的网络基础知识,那么现代的网络又是什么样子的呢?
首先,在整个计算机网络中,有着类似于高速公路的”核心”网络,它们是计算机网络的中心,它们之间通常会选用高速路由器连接使其能够快速传送大量的数据。
同时,为了能够满足不同用户不同场景的使用需求,还有有着各种”边缘网络”,常见的设备包括多功能路由器和3层交换机等。
而对于普通用户而言,人们在家里或者公司上网时,一般会使用运营商提供的互联网接入服务。联网之后,数据会通过上述的边缘网络到骨干网最终实现整个网络的通信。
如下图所示:
image.png
对于手机移动网络呢?其实也是类似的。手机一开机,就会自动与距离最近的基站发生无线通信,而基站本身其实就相当于网络的接入层。
image.png
数据中心是指由大型服务器、存储等构成的机房,它们能够直接连接到主干网或者边缘网络,这样一来,在接收用户请求的时候能够有效的减少网络延迟。
image.png