计算机网络-数据链路层
两台主机间的数据传输,通常不是直达的,而是分成一段一段的链路。两个相邻节点间如何传输数据,是数据链路层关心的事情。
由于物理层已经完成了比特流的传输,数据链路层考虑的就是上一层的事情:如何将网络层交下来的数据报组装成基本传输单位帧,然后将帧发送出去,或者将物理层交上来的比特流划分成帧,取出数据部分后上交给网络层。
尽管传输媒体和通信手段的差异已经被屏蔽,数据链路层依然要考虑两种不同类型的信道:
- 点对点信道:一对一的通信方式;
- 广播信道:一对多的广播通信方式,同时与多台主机通信。
此外,关于传输的基本单位:帧,还要考虑如何对帧进行划分、如何完成差错检测等各种事情。
1. 帧
链路层的基本传输单位叫做帧,帧是在网络层交付的 IP 数据报的基础上添加帧头帧尾构成的,然后移交物理层,由物理层作为纯粹的比特流传输给目标主机,目标主机物理层收到后,根据首尾标记,对比特流重新划分形成帧,校验后无差错则去除帧头帧尾交付网络层。
所以数据链路层考虑如何封装成帧,从比特流解析出帧以及进行差错检测,前面两件事是相反的过程。
1.1 封装成帧
封装成帧(framing)就是在一段数据(网络层的 IP 数据报)的前后分别添加首部和尾部,这样就构成了一个帧。
帧所携带的数据长度有一个上限,叫做最大传输单元MTU(Maximum Transfer Unit)。帧首部和尾部的主要作用是进行帧定界(确定帧的界限)以及包括许多控制信息。
对于点对点协议 PPP(Point-to-Point Protocol)来说,帧格式如下
首部和尾部分别为四个字段和两个字段。
首部的第一个字段和尾部的第二个字段都是标志字段F (Flag),规定为0x7E(十六进制的7E的二进制表示是01111110)。标志字段表示一个帧的开始或结束,也就是定界符。连续两帧之间只需要用一个标志字段。如果出现连续两个标志字段,就表示这是一个空帧,应当丢弃
首部中的地址字段A规定为0xFF(即11111111),控制字段C规定为0x03(即00000011)。至今没有实际的意义。首部的第四个字段是2字节的协议字段。当协议字段为0x0021时,PPP帧的信息字段就是 IP 数据报。若为0xC021,则信息字段是 PPP 链路控制协议 LCP 的数据,而 0x8021 表示这是网络层的控制数据。
尾部中的第一个字段(2字节)是使用CRC的帧检验序列 FCS。
1.2 透明传输
透明传输的意思是不管什么样的数据都能通过数据链路层,实现这一点解决的主要是一个问题,即帧的数据部分出现了和帧定界符相同的编码,导致无法正确的划分帧。
这种情况广泛出现在传输程序或图像等非 ASCII 码串时,解决方法是在数据中出现帧定界符时在前面加一个转义字符 0x7D(即01111101),如果要传输的字段本身就是转义字符,那么将其变成(0x7D, 0x5D)来传输,接收端在将数据送往网络层前会把转义符删掉。这种方法称为字节填充或字符填充。
上面提到的办法是异步传输时实用的方法,同步传输时采用零比特填充。即在发送端,先扫描整个信息字段,只要发现有5个连续1,则立即填入一个0,从而保证在信息字段中不会出现6个连续1。接收端在收到一个帧时,先找到标志字段 F 以确定一个帧的边界,接着再用硬件对其中的比特流进行扫描。每当发现5个连续1时,就把这5个连续1后的一个0删除,以还原成原来的信息比特流。
1.3 差错检测
差错检测是指检测传输的数据中 0 变成 1,1 变成 0 的情况,使用的方法是循环冗余检验。
在发送端,先把数据划分为组,假定每组 k个比特。现假定待传送的数据 M = 101001 (k =6)。CRC 运算就是在数据 M 的后面添加供差错检测用的 n 位冗余码,然后构成一个帧发送出去,一共发送(k + n)位。这n 位冗余码可用以下方法得出:在 M 后面添加 n 个0,得到的 k + n 位的数除以收发双方事先商定的长度为 n + 1 位的除数P,得出商是 Q 而余数是 R(n 位,比P少一位),这个余数就是冗余码。
下图所示的例子中,M = 101001(即k= 6),假定除数P = 1101(即n = 3),经模2除法运算后的结果是:商Q = 110101(这个商并没有什么用处),而余数 R = 001。这个余数 R 就作为冗余码拼接在数据 M 的后面发送出去。这种为了进行检错而添加的冗余码常称为帧检验序列 FCS(Frame Check Sequence)。
在接收端把接收到的数据以帧为单位进行CRC检验:把收到的每一个帧都除以同样的除数P(模2运算),然后检查得到的余数 R。如果无差错,那么余数应当为 0。
除数 P 的生成一般使用多项式,如给定多项式 $P(X) = x^3 + x^2 +1$,那么除数 P = 1101
但链路层的差错检测只检测比特的错误变动,对于 帧丢失、帧重复、帧失序 这些情况不做检测,这些问题由运输层的 TCP 保证。
2. 以太网
对使用广播信道的数据链路层,主要讨论的是局域网,而由于现在局域网中以太网占主流,实际讨论内容是以太网。另外要注意的是,局域网工作的层次跨越了数据链路层和物理层。由于局域网技术中有关数据链路层的内容比较丰富,因此把局域网的内容放在数据链路层中讨论。但这并不表示局域网仅仅和数据链路层有关。
2.1 适配器
两台计算机除了需要物理线路(有线或无线)来连接,还必须有一些规范定义这些数据如何传输,实现这些规范的通常是网络适配器(有硬件和软件两方面的含义)
计算机与外界局域网的连接主要是通过适配器,就是我们说的网卡。适配器与局域网的通信是通过双绞线以串行方式进行的,而适配器与计算机的通信是通过主板上的 I/O 总线以并行方式进行的。因此,适配器的一个重要功能就是要进行数据串行传输和并行传输的转换。由于网络上的数据率和计算机总线上的数据率并不相同,因此在适配器中必须装有对数据进行缓存的存储芯片。若在主板上插入适配器时,还必须把管理该适配器的设备驱动程序安装在计算机的操作系统中。这个驱动程序以后就会告诉适配器,应当从存储器的什么位置上把多长的数据块发送到局域网,或者应当在存储器的什么位置上把局域网传送过来的数据块存储下来。适配器还要能够实现以太网协议。
适配器接收和发送各种帧时不使用计算机的CPU。这时CPU可以处理其他任务。当适配器收到有差错的帧时,就把这个帧丢弃而不必通知计算机。当适配器收到正确的帧时,它就使用中断来通知该计算机并交付协议栈中的网络层。当计算机要发送IP数据报时,就由协议栈把IP数据报向下交给适配器,组装成帧后发送到局域网。我们特别要注意,计算机的硬件地址(MAC地址)在适配器的ROM中,而计算机的软件地址(IP地址)则在计算机的存储器中。
2.2 CSMA/CD
在以太网中所有的用户可随机地发送信息。但如果恰巧有两个或更多的用户在同一时刻发送信息,那么在共享媒体上就要产生碰撞(即发生了冲突),使得这些用户的发送都失败。因此,必须有解决碰撞的网络协议。以太网采用的协议叫做 CSMA/CD,意思是载波监听多点接入/碰撞检测(Carrier SenseMultiple Access with Collision Detection)。
2.3 集线器
集线器工作在物理层,它的每个接口仅仅简单地转发比特——收到1就转发1,收到0就转发0,不进行碰撞检测。若两个接口同时有信号输入(即发生碰撞),那么所有的接口都将收不到正确的帧。
集线器的主要作用是扩展一个以太网的覆盖范围。如下图,使用多个集线器可以构成一个覆盖更大范围的局域网。
2.4 MAC层
数据链路层分为上层LLC(Logical Links Control,逻辑链路控制),和下层的MAC(媒体访问控制),MAC主要负责控制与连接物理层的物理介质。
IEEE802 标准为局域网规定了一种48位(6字节)的全球地址,这种地址固化在适配器的ROM中,叫做 MAC 地址,除非更换适配器,其它的操作都不会对计算机的 MAC 地址产生影响,因此,MAC 地址实际上可以看作计算机的名字。
48位的 MAC 地址可组成 $2^{46}$ 个地址,超过 70万亿,足够区分全世界所有的计算机。
MAC地址的前三字节由 IEEE 的注册管理机构 RA 分配给世界上所有生产适配器的厂家,后三个字节由厂家自行指派,只要没有重复地址即可。
当路由器通过适配器连接到局域网时,适配器上的硬件地址就用来标志路由器的某个接口。路由器如果同时连接到两个网络上,那么它就需要两个适配器和两个硬件地址。
常用的以太网 MAC 帧标准为以太网 V2 标准,帧格式如下
目的地址和源地址指的都是 MAC 地址,类型指上层使用的协议,比如 IP。以太网 MAC 帧的最小长度为 64字节,因此数据部分最小长度为 64-18 = 46 字节,数据部分最大长度为 1500 字节。
2.5 网桥
集线器工作在物理层,只对数据进行简单转发,网桥工作中数据链路层,会根据 MAC 地址进行针对性转发,这种针对性转发是通过维护一个路由表完成的,路由表中存在网桥接口和MAC地址的对应关系。
两层交换机的本质就是一种多接口网桥。
注意,路由器实际上不属于网桥,它包括网络层,和三层交换机一样,是一个三层设备,不是根据 MAC 地址转发,而是根据网络层的 IP 地址转发。