计算机网络体系结构

我们每天都在使用网络,PC端、移动端,微信、邮件、钉钉等等等等,世界上千千万万的网络设备两两之间进行通信,虽然不知道对方身处何地,但信息总能精确地送达,你是否也曾对此暗自称奇。你给同事发消息借刀不会被误发给产品,你给心爱的姑娘发消息约火锅也不会误约到女装大佬,ummm…网络真是神奇。

网络又分为电信网络、有线电视网络和计算机网络(移动端的蜂窝网络 - cellular network 也属于计算机网络),本文中所说的网络都指的是计算机网络。

网络的核心是具有分层特性的体系结构,以及基于这种结构的一系列协议,搞清楚了这些就明白了网络原理,但这些知识实在是太过于庞大和复杂,我看了很久还没能窥得其冰山一角,以至于我已经丧失了学习的信心,抱着浅尝辄止的心态整理出来了一点东西,下面就是我的学习笔记。


在计算机网络中要做到有条不紊地交换数据,就必须遵守一些事先约定好的规则,这些规则明确规定了所交换数据的格式以及有关的同步问题。这里的同步指的是同/异步的同步,不是狭义上同频或同频同相的同步。这些为进行网络中的数据交换而建立的规则、标准或约定称为网络协议。

网络协议就好比我们寄明信片时写的邮编、地址一样,只要我们按照大家约定好的邮编、城市名、区县名、街道名等去填,明信片就能保证被寄给对的人。

为什么要分层

举个例子,假定现在两台设备要通过一个通信网络来传送文件。

如果我们要在一个模块之内完成文件传送的所有工作细节,这会使得该模块非常之复杂。虽然看起来可能只是用户点一下发送按钮,但其实底层是做了非常多的工作,这会导致编写和调试这个模块都会变得异常艰难。这就和我们平时开发一样,基本上不可能把一个非常大的需求一口气写完,除非你天赋异禀,一手盲写神功独步天下。

设计这个模块,我们可以将要做的工作划分为三个部分,分别交给三个模块去完成:

example-for-computer-network

  1. 文件传送模块

该模块的工作与传送文件直接相关。例如,发送端的文件传送应用程序应当确定接收端的文件管理程序是否已做好接收文件的准备;若两台设备所用的文件格式不一致,那么至少应该有一方来完成格式转换的工作。

  1. 通信服务模块

该模块用于保证文件和文件传送命令可靠地在两个系统之间进行交换。也就是说,让上层的文件传送模块利用下面的通信服务模块所提供的服务。如果将上层的文件传送模块换成电子邮件模块,同样地可以利用通信服务模块所提供的可靠的通信服务。这也提高了模块的可复用性。

  1. 网络接入模块

该模块负责做与网络接口细节有关的工作,并向上层提供服务,使得上层的通信服务模块能够完成可靠通信的任务。

这样的分层设计有很多优点:

  • 各层之间相互独立。某一层不需要知道它的下一层如何实现,只需要知道如何去使用下层模块所提供的服务即可。每一层只实现一种相互独立的功能,这就将一个难以处理的复杂问题分解成了若干个较易处理的小问题。这样,整个问题的复杂度就降低了。

  • 灵活性好。当任何一层发生变化时(例如由于技术变化所发生的变化),只要层间的接口关系保持不变,则在这层以上或以下各层均不受影响。

  • 结构上可分割开,各层都可以采用最合适的技术去实现。

  • 易于实现和维护。

  • 能促进标准化工作,因为每一层的功能及其所提供的服务都已经有了精确的说明。

显而易见,分层的结构优于不分层。

网络协议各层介绍

OSI(开放系统互连基本参考模型OSI/RM - Open Systems Interconnection Reference Model,简称OSI)的七层协议体系结构的概念清楚,理论也很完整,但它既复杂又不实用。

TCP/IP体系结构则不同,但它现在却得到了非常广泛的应用。TCP/IP是一个四层的体系结构,它包含应用层、运输层、网际层和网络接口层。

不过从实质上讲,TCP/IP只有上面三层,因为最下面的网络接口层并没有什么具体的内容。因此在学习计算机网络的原理时往往采取折中的办法,即综合OSI和TCP/IP的有点,采用一种具有五层协议的体系结构,这样既简洁,又能将概念阐述清楚。

computer-network-architecture

应用层(application layer)

应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间通信和交互的规则。这里的进程指主机中正在运行的程序。

对于不同的网络应用需要有不同的应用层协议,在互联网中的应用层协议很多,比如域名系统DNS,支持万维网应用的HTTP协议,支持电子邮件的SMTP协议等等。

应用层交互的数据单元被称为报文(message)。

运输层(transport layer)

运输层的任务就是负责向两台主机中进城之间的通信提供通用的数据传输服务,应用进程利用该服务传送应用层的报文。

所谓通用指的是,该层的服务并不针对某个特定网络应用,而是多个应用可以使用同一个运输层服务。

由于一台主机可同时运行多个进程,因此运输层有复用和分用的功能。复用就是多个应用层进程可同时使用下面运输层的服务,分用和复用相反,指运输层把收到的信息分别交付给上面应用层中的相应进程。

运输层主要使用以下两种协议:

  1. 传输控制协议TCP(Transmission Contol Protocol),提供面向连接的、可靠的数据传输服务,其数据传输的单位是报文段(segment)。

  2. 用户数据报协议UDP(User Datagram Protocol),提供无连接的、尽最大努力(best-effort)的数据传输服务(不保证数据传输的可靠性),其数据传输的单位是用户数据报。

网络层(network layer)

网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送。在TCP/IP体系中,由于网络层使用IP协议,因此分组也叫做IP数据报,或简称数据报。

网络层的另外一个作用就是去选择合适的路由,使得源主机运输层所传下来的分组,能够通过网络中的路由器找到目的主机。

互联网是由大量的异构网络通过路由器相互连接起来的。互联网使用的网络层协议是无连接的网际协议IP(Internet Protocol)和许多种路由选择协议。因此网络层也叫网际层或IP层。

数据链路层简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传递的,这就需要使用专门的链路层协议。在两个相邻节点间传送数据时,链路层将网络层交下来的IP数据包组装成帧(这一动作称为framing),在两个相邻节点间的链路上传送帧(frame),每一帧包括数据和必要的控制信息(如同步信息、地址信息和差错控制等)。

在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始到哪个比特结束。这样一来,数据链路层在收到一个帧后,就可以从中提取出数据部分,上交给网络层。

物理层(physical layer)

物理层上所传数据的单位是比特。发送方发送1 (或0)时,接收方应当收到1 (或 0)而不是0 (或1)。因此物理层要考虑用多大的电压代表1或0,以及接收方如何识别出发送方所发送的比特。但解释比特代表的意思,不是物理层的任务。

传递信息所用的一些物理媒体,如双绞线、同轴电缆、光缆、无线信道等,并不在物理层协议之内而是在物理层协议的下面。因此也有人把物理层下面的物理媒体当作第0层。

下面的例子说明的是应用进程的数据在各层之间的传递过程中所经历的变化。简单起见,这里假定两台主机通过一台路由器连接起来。

data-transmit-example

假定主机1的应用进程AP1向主机2的应用进程AP2传送数据。

AP1先将其数据交给本主机的第5层(应用层),第5层加上必要的控制信息H5就变成了下一层的数据单元,第4 层(运输层)收到这个数据单元后,加上本层的控制信息H4,再交给第3层(网络层),成为第3层的数据单元,依此类推。不过到了第2层(数据链路层)后,控制信息被分成两部分,分别加到本层数据单元的首部(H2)和尾部(T2),而第1层(物理层)由于是比特流的传送,所以不再加上控制信息。

OSI把对等层次之间传送的数据单位称为该层的协议数据单元PDU(Protocol Data Unit)。

当这一串的比特流离开主机1经网络的物理媒体传送到路由器时,就从路由器的第1层依次上升到第3层,每一层都根据控制信息进行必要的操作,然后将控制信息剥去,将该层剩下的数据单元上交给更高的一层。当分组上升到了第3层时,就根据首部中的目的地址 查找路由器中的转发表,找出转发分组的接口,然后往下传送到第2层,加上新的首部和尾部后,再到最下面的第1层,然后在物理媒体上把每一个比特发送出去。

当这一串的比特流离开路由器到达目的站主机2时,就从主机2的第1层按照上面说到的方式,相反地,依次上升到第5层。最后,把应用进程AP1发送的数据交给目的站的应用进程AP2。

虽然应用进程数据要经过上述复杂的过程才能送到终点的应用进程,但这些复杂过程对用户来说都是不可见的,以致会让人觉得AP1好像是直接把数据交给了AP2。同理,任何两个同样的层次(例如在两个系统的第4层之间,也好像如同图中水平虚线所示的那样,把数据(即数据单元加上控制信息)通过水平虚线直接传递给对方。这就是所谓的“对等层”(peer layers)之间的通信。

我们前面提到的各层协议,实际上就是在各个对等层之间传递数据时的各项规定。

—— 抄自《计算机网络》- 谢希仁