购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

第7章
熟读宝典
——系统与系统之间的语言OSI

千百年来,江湖中人一直都把祖宗流传下来的一本宝典铭记于心,这本宝典就是号称“号令武林,莫敢不从”的OSI大典!

任何系统之间,如果需要通信,就有一套自己的协议系统。这个协议系统不仅要定义双方互相通信所使用的语言,还要规定所使用的硬件,比如通信线路等。例如以太网协议,凡是接入以太网的(交换机或者HUB)节点,都必须遵循以太网所规定的通信规程。两个对讲机之间进行通话,必须预先定义好发送和接收的频率,而且还要指定通信的逻辑,比如每说一句话之后,要说一个“完毕”,表示本地已经说完,该对方说了。

7.1 人类模型与计算机模型的对比剖析

人和计算机,二者有着天然的相似性。

7.1.1 人类模型

人类自身用语言来交流信息,这本身就是系统间通信的极佳例子。每个人都是一个系统,这个系统由八大子系统组成,每个子系统行使自己的功能,各个子系统相互配合,使得人体可以做出各种各样的事情,包括制造计算机系统这个“部分仿生”产物。

1.消化系统

消耗系统负责食物的摄取和消化,使我们获得糖类、脂肪、蛋白质、维生素等营养,再经过一系列生化酶促反应,最终可以生成能量,以ATP分子的形式向各个细胞供应化学能,再经过一系列的分子机器(蛋白质或者蛋白质复合体)的处理,可以形成机械能、热、光、电等各种能量形式。

2.神经系统

神经系统负责处理外部信息和调控人类自身运动,使我们能对外界的刺激有很好的反应,包括学习等重要的活动也是在神经系统控制下完成的。比如皮肤、耳朵、眼睛等接收的各种信号,都会经过神经网络传送到大脑进行处理并做出反映。

3.呼吸系统

呼吸系统是气体交换的场所,可以使人体获得新鲜的氧气。人类制造、储存和利用能量的每个过程,都需要氧气的参与,氧气是很好的氧化剂,人类利用这种氧化剂,氧化摄取的糖、蛋白质等物质,产生能量,如果没有氧气,则人体一切的生命活动就会终止,包括心肌的收缩和扩张运动。

4.循环系统

循环系统负责氧气、营养和体液以及各种信号控制分子的运输,废物和二氧化碳的排泄,以及免疫活动。人体的这些空间中,各种器官按照规则分布着,每个器官行使其功能,必须供给它们能量、水和氧气以及各种控制因子蛋白,遍布周身的密密麻麻的动脉、静脉和毛细血管,就是运输这些物质必需的通道。这些物质溶在血液中,从动脉流入器官,完成生命逻辑后,从静脉流入肾脏,过滤废物,排泄,干净的静脉血再流回心脏,然后进入动脉,经过肺部的时候,将肺部获取的氧气吸溶入血液,成为鲜红色的动脉血,然后再流入各个器官,供给必须物质。

5.运动系统

运动系统负责身体的活动,使我们可以做出各种动作。骨骼和肌肉属于运动系统,骨骼虽然不直接运动,但是它能在肌肉的牵引下进行运动。控制肌肉运动的是神经信号,大脑发出神经控制信号(一系列的蛋白质或者离子流),肌肉组织收到之后,便会引发雪崩似的化学反应,包括肌肉细胞中的微管结构的不断重组和释放,用这种形式来改变细胞形状,从而造成肌肉收缩或者扩张。而微管的组装和释放,需要能量和酶的参与,这时候,细胞便会贪婪地利用ATP分子来获取化学能,而血液ATP损耗之后,血液便会加速流动到肌肉周围,提供更多的能量。这也是运动时心脏加速跳动的原因。而心脏跳动速度的控制因素很多,比如受到惊吓的时候,大脑便会分泌一些物质,传送到心肌,引发反应,促使跳动速度加快。

6.内分泌系统

内分泌系统调节生理活动,使各个器官组织协调运作。内分泌系统是一个中央调控系统,比如生长素就是内分泌系统分泌的一种蛋白质分子,它被骨骼吸收后,可以促进骨骼生长。内分泌系统如果发生功能故障,则人体就会表现异常,包括精神和物理上的异常。

7.生殖系统

生殖系统负责生殖活动,维持第二性征。生殖系统是人类繁衍的关键,生殖系统将人类的所有特征融入精子和卵子,受精卵在母亲子宫中逐渐发育成全功能的人体。

8.泌尿系统

泌尿系统负责血液中生化废物的排泄,产生尿液。

7.1.2 计算机模型

我们发现,计算机系统和工作模式,与生物系统有很大一部分是类似的。

1.计算机的消化系统

消化子系统是为整个系统提供基本能量和排泄消化废物的。给计算机提供能量的是电源和密布在电路板上的供电线路。为计算机排泄能量废物的,是接地低电位触点。电流流经供电线路,到接地触点终止,将能量提供给电路板上的各个部件(器官)。此外,计算机的“消化”也包含另外的意思,即吞入数据、吐出数据的过程。计算机从磁盘上读入数据,进行计算(消化)后,再输出数据。

2.计算机的循环系统

循环子系统是为整个系统提供能量和物质传输通道的。给计算机提供数据传输通道的是各种总线,数据从总线流入CPU处理单元,完成计算逻辑后,又从总线输出到内存或者外设。所以我们说,计算机的循环系统,就是总线,心脏就是电路振荡装置。

3.计算机的呼吸系统

呼吸子系统是为整个系统提供完成生命逻辑所必需的氧化剂,即氧气为计算机散热的风扇,貌似呼吸系统,但风扇的功能更类似于皮肤和毛孔的散热作用。

4.计算机的神经系统

神经子系统的作用是传输各种信号,调节各个器官的功能。对于生物体来说,神经系统是运行在脑组织中的一种逻辑,这种逻辑通过执行一系列生化物理反应来体现它的存在。通过向血液中释放各种蛋白质信号分子,从而靶向各种器官,调节它们的功能。对于计算机系统来说,神经系统就是由CPU载入执行的程序,程序生成各种信号,通过总线传输给各个外部设备,从而调节它们的工作。

计算机的神经系统,可以认为就是外部硬件设备的驱动程序。神经网络就是控制总线,循环系统是数据总线。而生物体内没有地址总线的概念,血管凌乱的分布,并没有一种显式的区分机制来区分各个器官或者组,信号分子可以遍布周游全身。

5.计算机的运动系统

计算机本身是一堆电路和芯片,不存在运动的概念。但是如果向计算机接口上接入了可以运动的部件,比如打印机、电动机、硬盘等,那么这些设备就可以在计算机控制信号(神经信号)的驱动下做运动,并且可以打印或者读写数据。

6.计算机的生殖系统

目前,计算机系统表现的生殖能力,只是在一个硬件中生成不同的软件。软件通过CPU的执行,可以任意复制自身,并可以形成新的逻辑。在这种逻辑下,程序通过无数次的复制,难免在一些细微的Bug或者电路干扰的情况下发生奇特的变化,这些变化一开始可能不太会表现出来,但是随着量变的积累,就会引发质变,发生进化。

当然,计算机系统完全可以物理复制硬件,即通过程序控制外部机器,来生产新的计算机硬件,然后将软件复制到硬件上,继续繁殖。

7.1.3 个体间交流是群体进化的动力

人也好,计算机也好,他们之间都在不停地交流着。人和人的交流,让人类得到了进化。同样,计算机之间的交流,也会让计算机得到进化。交流是进化的动力,不可能有某种事物会完全脱离外界的刺激而自身进化。

OSI便是这种交流所遵循的一张蓝图。

7.2 系统与系统之间的语言——OSI初步

OSI模型是一种被提取抽象出来的系统间通信模型。OSI中文的意思为“开放式系统互联”模型,是一个描述两个或者多个系统之间如何交流的通用模型。它不只适合于计算机系统互联,而且适合任何独立系统之间的互联。比如,人体和人体之间的通信,或者人体和计算机之间的通信,都可以用OSI模型来描述。

比如我和你之间需要交流,我们面对面坐着,此时我有一句话要和你说:“您好,您怎么称呼?”

首先,我要说出这句话,要在脑海中生成这句话,即在语言处理单元中根据要表达的意思,生成符合语法的数据。然后通过神经将数据信号发送到声带、咬肌、舌头和口形固定之后,使声带振动。声带振动导致口腔空气共振,发出声音,经过空气机械波振动,到达你的耳膜接收器,耳膜被机械波谐振于一定频率,耳膜的振动通过神经信号传导到大脑,大脑相关的处理单元进行信号的解调,最终从神经信号中提取出我说的话“您好,您怎么称呼?”,这句话在大脑中,可能是离子流产生的模拟电信号,也可能是通过其他形式表示,比如一套编码系统。这句话被传送到大脑的语言处理单元,这个单元分析这句话,“您好”是一个问候语,当你知道我在问候你的时候,你的大脑会在这个“您好”信号的刺激下,进入一种“礼貌”逻辑运算过程,运算生成的信号,通过神经传送到你的颈部肌肉,收缩,使你的头部下降,并使面部肌肉收缩,这就完成了点头致意和微笑的动作。

这个过程,与计算机网络通信的模型完全一致。两台计算机之间通过以太网交换机相连,它们之间要进行通信。比如,a计算机想向b计算机发送一个数据包,这个数据包的内容是“打开文件C:\tellme.txt”,过程如下所示。

(1)a计算机首先要在内存中通过双方定义的语言,生成这个数据包。

将这个数据包通过总线发送给TCP/IP协议处理单元,告诉TCP/IP处理单元对方的IP地址和所用的传输方式(UDP或TCP)和端口号。

TCP/IP处理模块收到这个包之后,将它包装好,通过总线发送给以太网卡。

以太网卡对数据包进行编码,然后通过电路将包装好的数据包变成一串电路的高低电平振荡,发送给交换机。

交换机将数据包交换到b计算机的接口。

(2)b计算机收到这串电位流后,将其输送到以太网卡的解码芯片,去掉以太网头,之后产生中断信号,将数据包送到内存。

由TCP/IP协议处理模块对这个数据包进行分析,提取IP头和TCP或UDP头,以便区分应输送到哪个应用程序的缓冲区内存。

最终TCP/IP协议将“打开文件C:\tellme.txt”这句话,成功输送到了b计算机应用程序的缓冲区内存中。

(3)b计算机应用程序提取这句话,分析它的语法,发现a计算机要求它打开C:\tellme.txt文件,则应用程序根据这个命令,调用操作系统打开文件的API执行这个操作。

分析一下上面的过程,我们发现如下内容。

数据总是由原始直接可读状态被转变成电路的电位振荡流,或者频率和振幅不断变化的机械波,也可能转换成一定频率的电磁波。

互相通信的两个系统之间必定要有连通的介质,空气、以太网或者其他形式,电磁波传递不需要介质。

相互通信的双方必须知道自己是在和谁通信。

以上三个要素,就是系统互联通信所具备的“连、找、发”三要素。

■ 连:就是指通信的双方必须用某种形式连通起来,否则两个没有任何形式连通的系统之间是无法通信的。即便是电磁波通信,也至少通过了电磁波连通。

■ 找:是说通信的双方或者多方,必须能够区分自己和对方以及多方(广播系统除外)。

■ 发:定义了通信的双方如何将数据通过连通介质或者电磁波发送到对方。

7.3 OSI模型的七个层次

网络通信三元素抽象模型是对OSI模型的更高层次的抽象。OSI模型将系统间通信划分成了七个层次。

OSI模型的最上面的三层,可以归属到应用层之中,因为这三层都不关心如何将数据传送到对方,只关心如何组织和表达要传送的数据。

7.3.1 应用层

应用层是OSI模型的最上层,它表示一个系统要对另一个系统所传达的最终信息。比如“您好,您怎么称呼?”这句话,就是应用层的数据。应用层只关心应用层自身的逻辑,比如这句话应该用什么语法,应该加逗号还是句号?末尾是否要加一个问号?用“你”还是“您”等这样的逻辑。对于计算机系统来说,上文所述的例子中“open file C:\tellme.txt”,这条指令,就是应用层的数据。应用层程序不必关心这条指令是如何传达到对方的。

7.3.2 表示层

表示层就是对应用层数据的一种表示。如果前面说的“您好,您怎么称呼?”这句话是有一定附加属性的,例如“您好”这两个字要显示在对方的屏幕上,用红色显示在第1行的中央,而“您怎么称呼?”这几个字用蓝色显示在第10行的中央。这些关于颜色、位置等类似的信息,就构成了表示层的内容。

发送方必须用一种双方规定好的格式来表示这些信息,比如用一个特定长度和位置的字段来编码各种颜色(一般用三原色的组合编码来表示),用一个字段来表示行列坐标位置。将这些附加表示层信息字段放置于要表达的内容的前面或后面,接受方按照规定的位置和编码来解析这些表示层信息,然后将颜色和位置信息赋予“您好,您怎么称呼?”这句话,显示于屏幕上。需要强调一点,表示层不一定非得是单独的一个结构体,它可以嵌入在实体数据中。这就是表示层,一些加密等操作就是在表示层来起作用的。

7.3.3 会话层

顾名思义,会话层的逻辑一定是建立某种会话交互机制。这种交互机制实际上是双方的应用程序之间在交互。它们通过交互一些信息,以便确定对方的应用程序处于良好的状态中。比如两个人通电话,拨通之后这个问:“能听清么?”那个说:“能听清,请讲。”这就是一个会话的过程。也就是说通信的双方在发送实际数据之前,先建立一个会话,互相打个招呼,以便确认双方的应用程序都处于正常状态。

应用层、表示层和会话层的数据内容被封装起来,然后交给了我们的货物押运员传输层。

TCP/IP协议体系模型中有4层,即应用层(应用访问层)、传输层、网络层和物理链路层(硬件访问层)。TCP/IP协议体系没有完全按照OSI匹配,它将OSI中的应用层、表示层和会话层统统合并为一层,叫做应用访问层,意思是指这个层全部是与应用程序相关的逻辑,与网络通信无关,应用程序只需调用下层的接口即可完成通信。

7.3.4 传输层

可以说OSI模型中上三层属于应用相关的,可以划入应用层范围,而下四层就属于网络通信方面的。也就是说,下四层的作用是把上三层生成的数据成功地送到目的地。典型的传输层程序如下。

TCP协议的作用就是保障上层的数据能传输到目的地。TCP就像一个货运公司的押运员,客户给你的货物,就要保证给客户送到目的地,而不管你通过什么渠道,是直达(直连路由)还是绕道(下一跳路由),是飞机还是火车、轮船(物理线路类型)。

如果运输过程中出现错误,必须重新把货物发送出去。每件货物到了目的地,必须找收件人签字(TCP中的ACK应答包),或者一批货物到达后,收件人一次签收(滑动窗口)。

最后回公司登记。

提示: TCP还处理拥塞和流量控制。比如调度(路由器)选择了走这条路,但是太拥挤了,那么我也不好说什么,因为选哪条路到达目的是由调度(路由器)说了算,我只管押运。那么我只能通知后续的货物慢一点发货,因为这条路太挤了。当道路变得畅通时,我会通知后面的货物加速发货。这就是TCP的任务。TCP是通过接收方返回的ACK应答数据包来判断链路是否拥挤,比如发了一批货,半天都没接收到对方的签字,证明链路拥塞,有货物被丢弃了,那么就减缓发送速度。当有ACK被接收到后,我会增加一次发送货物的数量,直到再次拥塞。那么调度怎么知道这些货物是送到哪里的呢?这是网络层程序的任务。

注意: 传输层的程序一定要运行在通信双方的终端设备上,而不是运行在中间的网络互联设备上。传输层是一种端到端的保障机制,所谓端到端的保障就是指数据从一端发送到另一端之后,对方必须在它的传输保障时间中成功收到并处理了数据,才能算发送成功。如果只是发送到了对方的网卡缓冲区,此时发生故障,如突然断电,这就不叫端到端的保障。因为数据在网卡缓冲区内,还没有被提交到TCP协议的处理逻辑中进行处理,所以不会返回成功信号给发送方,那么这个数据包就没有被发送成功,发送方会通过超时来感知到这个结果。

7.3.5 网络层

客户把货物交给货运公司的时候,必须填写目的地址(比如IP地址)。只要一个地址就够了,至于到这个地址应该坐几路公交车或哪趟火车等问题,客户统统不管,全部交给网络层处理。

货运公司为每件货物贴上一个地址标签(IP头)。

货运公司的调度们掌握了全球范围的地址信息(路由表),比如去某某地方应该走哪条路。

在选择了一条路之后,就让司机开车上路了。

押运员进行理货和收发货物,没事就在后车厢里睡觉。

此时最忙的是各个中转站的调度了。货物每次中转到一个地方就交给那个地方的调度,由那个调度来决定下一站应该到哪里。

接班的时候,旧调度不必告诉新调度最终目的应该怎么走,因为所有的调度都知道这个目的,一看就知道该走什么路了。

例如,有客户从新疆发货到青岛,由于新疆没有直达青岛的航班或者火车,所以只能先到达北京,然后再从北京直达青岛。

新疆的调度收到货物之后,他查找路由表,发现要到青岛,必须先到北京。新疆的调度会在货物上贴上青岛的标签而不是北京的标签,但是发货的时候,调度会选择将货物运送到新疆到北京的火车上。

货物到达北京之后,北京货运分公司的调度收到这件货物,首先查看这件货物的最终目的地址,然后北京调度也去查找路由表。他的路由表与新疆调度的路由表不同,在他的表上,北京到青岛有直达的火车,所以北京调度立即将货物原封不动的送上去青岛的火车。就这样一站一站的往前送(路由转发),货物最终从新疆到达了青岛。

思考: 那么调度是怎么知道全球地址表(路由表)的呢?这个表的生成是一个复杂的学习阶段,可以通过调度自行学习或者调度之间相互通告,也可以通过手工录入。前者称为动态路由,后者称为静态路由。

路由器充当的就是调度的角色。比如在青岛想访问一个位于北京的服务器,具体步骤如下。

首先必须知道这个服务器的IP地址,然后用这个IP地址作为最终目的地址组装成数据包,发送给位于青岛的Internet提供商机房中的路由器。

这个路由器收到这个包后,解析其目的IP地址,然后查找其路由表,发现这个目的IP地址的包应该从1号端口转发出去,所以它立即将这个包原封不动地向一号口转发。一号口通过光缆直接连接到了位于河北机房中的另一台路由器。

提示: 当然青岛到河北之间不可能只用一条连续不断的光缆连接,中途肯定经过一些光缆通信中继站。

河北的路由器收到这个IP包后,同样根据目的IP地址查找路由表,发现这个目的地址的包应该从8号端口中转发,它立即将这个包转发向8号端口。

8号端口通过光缆直接连接到了位于北京机房的一台路由器。

这台路由器同样查找路由表做转发动作。

经过一层层的寻找,最终找到了北京的这台服务器,将这个包传送到这台服务器的网卡,并提交到TCP/IP协议处理内存空间中。

经过解析和处理,服务器发现最终的数据是一个TCP握手数据包,然后TCP/IP程序立刻返回一个确认包,再次返回给服务器一个确认包。三次握手完成后,就可以向服务器发送HTTP请求来获取它的网页资源了。

7.3.6 数据链路层

数据链路层就是指连通两个设备之间的链路,数据要经过这条链路来传递给对方。数据链路层的程序将上层的数据包再次打包成对应链路的特定格式,按照对应链路的规则在链路上传输到对方。

数据链路就好比交通规则。在高速公路或者铁路上是需要遵守规则的,不能超速,不能乱停车,不能开车灯到最亮等。上路之前,先要看看公路的质量怎么样,是不是适合跑车或者先和对方商量一下传输的事宜。这就是链路层协商。

链路层的作用

首先是协商链路参数,比如双工、速率、链路质量等。

其次是将上层数据内容打包成帧,加上同步头进行传输,一次传输一句或者一个字符一个字符的传输(取决于上层的选择)。

最后,链路层程序调用物理层提供的接口,将帧提交给物理层。

相对于传输层的保障来说,OSI的数据链路层也提供一些保障机制。比如一些链路层协议会在每个帧后面加一个校验字段,如果对方收到的帧的校验值与这个校验字段不符,则证明链路受到干扰,数据产生畸变,那么就将这一帧视为无效帧直接丢弃,不会向上层报告这个错误,因为上层对链路层的错误不关心。而接收方的传输层协议会感知某个包没有到达或者不完整,接收方的传输层协议会要求发送方重新传送这个不完整或者没有接收到的包,也就是端到端的保障传输。链路层只侦错,不纠错,而传输层既侦错,又纠错。

根据OSI模型,两台路由器或者交换机之间传送数据也属于两个系统间的互联,那么它们也一定遵循OSI的模型。下面就来分析一下两台PC之间通信和两个路由器之间通信有什么区别。PC间通信我们上文已经描述过,下面来讲一下路由间的通信。

简单的路由器设备工作在OSI的第三层,即网络层。它只处理下三层的内容,只有下三层的处理逻辑,而没有上四层的处理逻辑。路由器收到包后,只检查包中的IP地址,不会改变任何IP头之上的其他内容,最简单的路由器甚至不会改变IP头。在一些带有诸如NAT功能的路由器上,可能会对IP包的源或者目的IP地址做修改。数据包流入路由器后,路由器只分析到第三层的IP头,便可以根据路由表完成转发逻辑。

如图7-1所示为通信路径上各个设备所作用的层次示意图,具体过程如下。

图7-1 通信路径上各个设备所作用的层次

左边的PC机A连接到路由器A的以太网卡1上,路由器A的以太网卡2与路由器B的以太网卡2相连,右边的PC机B连接到路由器B的以太网卡1上。此时,要用PC机A上的IE浏览器访问位于PC机B上的Web服务,在IE浏览器的地址栏中输入PC机B的IP地址并按Enter键后,IE浏览器便会调用WinSock接口来访问操作系统内核的TCP/IP协议栈。IE浏览器告诉TCP/IP协议栈它所访问的目的IP地址和目的端口,并把要发送的数据告诉TCP/IP协议栈。IE浏览器发送给PC机B的数据,当然是一个HTTP GET请求,具体内容属于上三层,在这里不关心也不做分析。

TCP/IP协议栈收到这个数据之后,发现IE浏览器与PC机B当前并不存在连接,所以它首先要向PC机B上的TCP/IP协议栈发起连接请求,也就是TCP的三次握手过程。PC机A的TCP/IP协议栈先组装第一次握手IP包,组好后发送给操作系统内核缓冲区,内核调用网卡驱动程序从缓冲区内将这个IP包编码并在线路上传递出去。握手数据包很小,只要一个以太网帧就可以容纳。

这个帧最终到达路由器A的以太网卡1缓冲区内。以太网卡1产生中断信号,然后将这个帧去掉以太网头,发送到路由器A的内存中,等待IP转发逻辑模块的处理。运行在路由器A上的IP转发逻辑模块,其实就是IP路由协议计算模块,这个模块分析此IP包的头部目的IP地址,查找路由表以确定这个包将从哪个接口发送出去。IP路由运算一定要快速高效,才不至于对网络性能造成瓶颈。

路由器A查找路由表发现这个包应当从以太网卡2转发出去,所以它立即将这个包发送到以太网卡2并通过线路传送到了路由器B的以太网卡2上。经过同样的过程,路由器B将这个包路由到PC机B的以太网卡缓冲区内,PC机B的网卡产生中断,将这个包通过总线传送到PC机B的TCP/IP协议栈缓冲区内存。

运行在PC机B上的TCP/IP协议栈程序分析这个包,发现IP是自己的,TCP端口号为80,握手标识位为二进制1,就知道这个连接是由源地址IP所在的设备向自己的80端口,也就是Web服务程序所监听的端口发起的握手连接。根据这个逻辑,TCP/IP协议栈返回握手确认IP包给PC机A,PC机A再返回一个最终确认包,这样就完成了TCP的三次握手。

握手成功后,PC机A上的TCP/IP协议栈立即在其缓冲区内将由IE浏览器发送过来的HTTP GET请求数据组装成TCP/IP数据包,发送给PC机B。PC机B得到这个数据包之后,分析其TCP端口号,并根据对应关系将数据放到监听这个端口的应用程序的缓冲区内存。

应用程序收到这个GET请求之后,便会触发Web服务逻辑流程,返回Web网页数据,同样经由PC机B的TCP/IP协议栈,发送给PC机A。

上述过程是一个正常通信的过程。

提示: 如果在PC机B向PC机A传送网页数据的时候,路由器A和路由器B之间的链路发生了几秒钟的短暂故障后又恢复连通性,这期间丢失了很多数据。虽然这样,依靠TCP协议的纠错功能,数据依然会被顺序的传送给PC机A。

我们就来分析一下TCP是如何做到的。假如,在链路中断的时候,恰好有一个帧在链路上传送。发生故障后,这个帧就永久的丢失了。即使链路恢复后,路由器也不会重新传送这个帧。但PC机B由于很长时间都没有收到PC机A的确认信息,便知道刚才发送的数据包可能已经被中途的网络设备丢弃了,所以PC机B上的TCP协议将重新发送这个数据包。

提示: 未接收到确认的包会存放在缓冲区内,不会删除,直到收到对方确认。

所以,即便中途经过的网络设备将这个包丢弃了,运行在通信路径最两端的TCP/IP协议,依然会重传这些丢弃的包,从而保障了数据传输,这也就是端到端的传输保障。只有端到端的保障,才是真正的保障,因为中途网络设备不会缓存发送的数据,更不会自动重传。

7.3.7 物理层

物理层的作用就是研究在一种介质上(或者真空)如何将数据编码发送给对方。如果选择公路来跑汽车,要根据沥青路或者土路来选用不同的轮胎;如果选择利用空气来跑飞机,则需根据不同的气流密度来调整飞行参数;如果选择了真空,则只能利用电磁波或者光来传输,可以根据障碍物等因素选择不同波长的波来承载信号;如果选择了海水,则要根据不同的浪高来调整航海参数。这些都是物理层所关心的。

物理层和链路层的区别

物理层和链路层是很容易混淆的两个层次。链路层是控制物理层的。物理层好比一个笨头笨脑的传送带,它不停地在运转,只要有东西放到传送带上就会被运输到对方。不管给它什么东西,它都一视同仁并且不会停下。

假设你我之间有一个不停运转的传送带,某时刻我有一大批货物要传送给你,是否可以一股脑的把这些货物不停地放到传送带上,一下子传送给你呢?当然可以,但是那样将没有整理货物的时间,永远处于不停地从传送带上拿下货物的状态,货物越堆越多,最终造成崩溃。如果能将货物一批一批的传送过来,不但给予了双方充足的整理货物的时间,而且使得货物传输显得井井有条。而将货物分批这件事,传送带本身是不会做的,只能靠TCP或者IP来做。链路层给每批货物附加上一些标志性的头部或者尾部,接收方看到这些标志,就知道一批货物又来了,并做接收动作。

每种链路,都有自己的一个最适分批大小,叫做最大传输单元,MTU。每次传输,链路上最大只能传输MTU大小的货物。如果要在一次传输中传送大于这个大小的货物,超过了链路接收方的处理吞吐量,则可能造成接收方缓冲区溢出或者强行截断等错误。

TCP和IP这两个协议程序都会给货物分批。第一个分批的是TCP,下到IP这一层,又会根据链路层的分批大小来将TCP已经分批的货物再次分批,如果TCP分批小于链路层分批,则IP不需要再分。如果是大于链路层的分批,则IP会将货物分批成适合链路层分批的大小。被IP层分批的货物,最终会由接收方的IP层来再组装合并,但是由TCP分批的货物,接收方的TCP层不会合并,TCP可以任意分割货物进行发送而接收的时候并不做合并的动作。对货物的处理分析全部交由上层应用程序来处理,所以利用TCP/IP通信的应用程序必须对自己所发送的数据有定界措施。

说白了,物理层就是用什么样的线缆、什么样的接口、什么样的物理层编码方式,归零还是不归零,同步方式,外同步还是内同步,高电压范围,低电压范围,电气规范等的东西。

通过物理层编码后,我们的数据最终变成了一串比特流,通过电路振荡传输给对方。对方收到比特流后,提交给链路层程序,由程序处理,剥去链路层同步头、帧头帧尾、控制字符等,然后提交给网络层处理程序(TCP/IP协议栈等)。IP头是个标签,收件人通过IP头来查看这个货物是谁发的。TCP头在完成押运使命之后,还有一个作用就是确定由哪个上层应用程序来处理收到的包(用端口号来决定)。应用程序收到TCP提交的数据后,进行解析处理。

7.4 OSI与网络

网络就是由众多节点通过某种方式互相连通之后所进行的多点通信系统。既然涉及到节点与节点间的通信,那么就会符合OSI模型。

首先我们看看计算机总线网络。CPU、内存、外设三者通过总线互相连接起来,当然总线之间还有北桥和南桥,这两个芯片犹如IP网络中的IP路由器或者网桥。CPU与内存这两个部件都连接到北桥这个路由器上,然后北桥连接到南桥,南桥下连一个HUB总线,HUB上连接了众多的外设,这些外设共享这个HUB与南桥进行通信。

提示: 说到HUB,不要认为是专指以太网中的HUB,HUB的意思就是一条总线。如果在这条总线上运行以太网协议,则就是以太网HUB;如果在这条总线上运行的是PCI协议,则就是PCI HUB(PCI总线)。

连接到以太网HUB上的各个节点,采用CSMA/CD的竞争机制来获取总线使用权,PCI总线同样采用仲裁竞争机制,只是实现方式不同。实现方式也可以称为协议,所以有以太网HUB和PCI HUB之分,也就是说HUB上运行的是不同的协议。当然以太网HUB设计要求远远比PCI HUB低,速度也低很多。

图7-2所示的模型是一个常见的小型网络,几台PC通过以太网HUB和路由器互相连接起来,然后通过运行在每台PC上的TCP/IP协议来通信。路由器的作用只是分析目的IP地址从而做转发动作。

而我们再观察一下图7-3,发现除了连接各个组件之间的线路变成了并行多线路之外,其他没有什么大的变化。但是,这两个网络的通信过程是有区别的。上面的网络利用一种高级复杂的协议——TCP/IP协议来通信,而图7-3所示的网络是通过直接总线协议进行通信。在下面的网络中,各个部件之间的连线非常短,速度很高且非常稳定,自身就可以保障数据的稳定传输,所以不需要TCP这种传输保障协议的参与。在上面的网络中,各个部件之间可能相隔很远的距离,链路速度慢,稳定性不如主板上的导线高,所以必须运行一种端到端的传输保障协议,比如TCP协议,来保障端到端的数据传输。

图7-2 一个典型的网络

图7-3 计算机总线网络

此外,上面的两个网络模型,其本质是相同的,因为它们两个都是从基本原理发展而来的。我们说,这两个网络模型都符合OSI这个抽象模型。再甚者,这两个模型都符合“连、找、发”抽象模型。

首先,所有部件之间都用了导线来连接。对于第一个模型,导线为双绞线或者其他形式的外部电缆;对于第二个模型,导线为电路板上印刷的蛇行线。这就是所谓“连”。

其次,这两个模型中都有寻址的逻辑。第一个模型利用IP地址作为寻址方法;第二个模型中利用地址总线作为寻址方法。这就是所谓“找”。

提示: 生物细胞之间的通信,同样符合OSI模型和“连找发”模型。细胞之间通过血管来传递信息,这就是“连”;通过配体-受体关系来找到目标,这就是“找”;血液流动将配体分子传递(广播)到人体的每个角落,这就是“发”。我国分子生态学创始人向近敏曾经提出分子信息网络学说,就恰恰体现了网络的思想。在分子上层,还有细胞信息网络学说和遗传信息网络学说,它们一个比一个高层,一个比一个抽象。然而分子信息网络也不一定就是最底层的网络,或许还有原子信息网络、电子信息网络等。

最后,第一个模型利用TCP协议进行有保障的数据发送动作,第二个模型中由于线路非常稳定,不需要高级协议参与,而是直接利用电路逻辑从目标部件将数据复制过来。这就是所谓“发”。

网中有网

我们在以前的章节中,多次提到过“网中有网”这个词。而我们现在再来体会一下,发现计算机系统、计算机网络、Internet,这些系统,确实可以用网中有网来描述。计算机总线这个微型网络,通过一个网卡,接入以太网交换机或者HUB,与其他计算机总线网络形成一个局域网,然后这个局域网再连接到路由器网关,从而连接到更大的网络,甚至Internet。

所有的网络,都按照OSI和“连找发”模型有条不紊地通信交互着,为我们服务。分子之间和细胞之间神奇地相互作用着,地球和月球有条不紊地旋转运行着,太阳系缓慢地自转,并围绕着更大的银河系旋转。 VefYEc6W9SUu6vuDdCgpUvn1HEwVun+s8FLijcIlIDSDiqrX8Q5CGGugR7qzpmRe

点击中间区域
呼出菜单
上一章
目录
下一章
×