通信是一件奇妙的事情。它让信息在不同的个体间传递。动物们散发着化学元素,传递着求偶信息。人则说着甜言蜜语,向情人表达爱意。猎人们吹着口哨,悄悄的围拢猎物。服务生则大声的向后厨吆喝,要加两套炸鸡和啤酒。红绿灯指挥着交通,电视上播放着广告,法老的金字塔刻着禁止进入的诅咒。有了通信,每个人都和周围的世界连接,不再是封闭的灵魂个体。
在通信这个神秘的过程中,参与通信的个体总要遵守特定的协议(protocol)。在日常交谈中,我们无形中使用约定俗成的语法。如果两个人使用不同的语法,就是以不同的协议来交流,最终会不知所云。像语言语法这样的通信协议有特定的历史渊源,很难轻易改变。但人还是能自行创造通信协议。古人在长城上放狼烟,用来警告后方有外敌入侵。这样的警告之所以能成功传递,是因为人们已经约定狼烟代表了“敌人入侵”。“狼烟代表了敌人入侵”就是一个简单的通信协议。
协议可以更复杂。电报使用摩尔斯码(Morse Code)通信。它用短信号和长信号的组合,来代表不同的英文字母。我们可以用电报发出求救信号 SOS(***—***, 代表短信号,-代表长信号)。这样“**= S, —=O”就是摩尔斯码规定的协议。然而更进一层,人们会知道 SOS 是求助信息,原因是我们有“SOS=求救”这个协议存在在脑海里。所以“***—***=SOS=求救”是一个由两个协议组成的分层通信系统。在日常交流中,我们同样可能利用多层协议来通信。我们在日常语言交流之外,还会有许多诙谐的、有趣的特定说法,比如“然而并没有什么卵用”。这些说法除了遵守了基本语法,还有更深一层的意义。想要这一层深一层的意义,就需要了解更高一层的协议。
计算机之间的通信也是在不同个体间传递信息。所以,计算机通信也要遵循通信协议。为了多层次的实现全球互联网通信,计算机通信也有一套多层次的协议体系。我就从最基础的协议开始,概括性的介绍计算机协议。
物理层
计算机最基础的协议存在于物理层。所谓的物理层(physical layer),是指光纤、电缆或者电磁波等真实存在的物理媒介。这些媒介可以传送物理信号,比如亮度、电压或者振幅。计算机最底层的信息是二进制码,只需要“0”和“1”就可以代表信息。所以在物理层,我们只需要约定两种物理信号来分别表示 0 和 1,比如用高电压表示 1,低电压表示 0。从物理信号到二进制的约定就构成了物理层协议。针对特定的媒介,电脑可以有相应的接口,用来接收物理信号。随后,计算机将利用相应的物理层协议,把物理信号解读成为 0/1 序列。
连接层
连续的 0/1 序列就像没有标点的古文一样让人头昏脑胀。在连接层(link layer),我们趁机把 0/1 序列分割成帧(frame)。所谓的帧,是一段有限的 0/1 序列。连接层协议能帮助计算机识别 0/1 序列中所包含的帧。它规定特殊的 0/1 组合来作为帧的起始和结束。连接层协议还规定了帧的格式。帧中包含有收信地址(Source, SRC)和送信地址(Destination, DST),还有能够探测错误的校验序列(Frame Check Sequence)。当然,帧中最重要的是所要传输的数据 (payload)。与数据相配套,帧中也有数据的类型(Type)信息。连接层协议不关心数据中到底包含什么。帧就像是一个信封,把数据包裹起来。
以太网(Ethernet)和 WiFi 是现在最常见的连接层协议,分别用于有线和无线网络。通过连接层协议,我们可以指定帧的收信地址,从而把信息传递给某一计算机设备。但遗憾的是,帧的收信地址只能是本地局域网内的。因此,连接层更像是一个社区的邮差,他认识社区中的每一户人。社区中的每个人都可以将一封信(帧)交给他,让他送给同一社区的另一户人家。更远距离的通信还需要在更高层的网络层实现。
连接层:社区小邮差
网络层
网络层(network layer)的目的是让不同的社区之间通信。 比如说,我们想让 WiFi 局域网上的一台计算机和以太局域网上的另一台计算机通信。这种时候,我们就需要一个“中间人”。这个“中间人”必须有以下功能:
能从物理层上在两个网络的接收和发送 0/1 序列。
能同时理解两种网络的帧格式。
路由器(router)就是为此而产生的“中间人”设备。一个路由器有多个网卡(NIC,Network Interface Controller),每个 NIC 可以接入多个网络,并理解相应的连接层协议。在帧经过路由到达另一个网络的时候,路由会读取帧的信息,并改写以发送到另一个网络。所以路由器就像是在两个社区都有分支的邮局。一个社区的邮差将信送到本社区的邮局分支,而邮局会通过自己在另一个地区的分支将信转交给另一个社区的邮差手中,并由另一个社区的邮差最终送到目的地。
我们说过,连接层的帧中只能记录本地的送信地址,如“第一条街第三座房子”或者说“中心十字路口拐角的小房子”这样一些本地人才了解的地址描述。邮局收到这样的信件就傻眼了,这让我送到纽约还是东京。邮局只能抱着侥幸心理读一下信纸——也就是帧的数据部分。哈,送信人居然也懂 IP 协议,在信纸的开头写上标准的邮编——IP 地址。如果说目的地社区也归这个邮局管,那么邮局工作人员就把信纸重新装包到一个新的信封中,写上对应本地地址,交给那一个社区的邮差。然而,P 地址也可能不在邮局的管辖范围内。邮局会把信件转交到其他邮局。有时候一封信要通过多个邮局转交,才能最终到达目的地,这个过程叫做路由(route)。邮局将分离的局域网络连接成了覆盖全球的互联网。

转交邮局
传输层
上面的三层协议让不同的计算机之间可以通信。但计算机中实际上有多个运行着的程序,也就是所谓的进程。每个进程都可能有通信的需求。这就好像一所房子里住了好几个人。如何让信精确的送到某个人手里呢?遵照之前相同的逻辑,在网络层协议的数据部分增加传输层(transport layer)信息。我在信纸上增加新的信息,也就是收信人的姓名。大楼管理员从邮差手中接过信,会根据“收信人”,将信送给房子中的某个人。
传输层协议,比如 TCP 和 UDP,使用端口号(port number)来识别收信人。在写信的时候,我们写上目的地的端口。当信到达目的地的管理员手中,他会根据传输层协议,识别端口号,将信送给不同的人。TCP 和 UDP 协议是两种不同的传输层协议。UDP 协议类似于我们的信件交流过程,一封信包含所有的信息。TCP 协议则好像两个情人间的频繁通话。他们要表达的感情太多,以致于连续的发信。另一方必须将这些信按顺序排列起来,才能看明白全部的意思。此外,TCP 协议还能控制网络交通,避免网络阻塞。由于完善的功能,TCP 也成为最常用的传输层协议。

大楼管理员
应用层
通过上面的几层协议,我们已经可以在任意两个进程之间进行通信。然而,在应用层(application layer)上,我们还可以有更高层的协议。不同类型的进程就像从事不同行业的人。有的是律师,有的是外交官。某些行业会有特定的职业用语规范。律师之间的通信会用严格的律师术语,以免产生纠纷。外交官之间的通信,也要符合一定的外交格式,以免发生外交误会。如果是干间谍的,则要通过暗号来加密信息。同样,某个类型的应用可以使用某个应用层协议,进一步规范用语。应用层的协议包括用于 Web 的 HTTP 协议,用于传输文件的 FTP 协议,用于 Email 的 IMAP 等等。这些协议可以帮助计算机应用更稳定也更完善的通信,从而让计算机更好的服务。
小结
计算机通信是基于物理信号的。物理信号可以用于传递原始的 0/1 序列。但为了实现广域的、多应用支持的通信,我们还需要更高层的协议。这些高层协议像邮差、邮局、大楼管理员一样,传递符合特定用语规范的信息。通过不同层次的封装,我们不必再关心底层协议,可以专注于高层信息的编辑和发送。这些看起来繁杂得像森林的网络协议,是互联网最重要、也最常被忽视的基础设施。
相关文章: