跳转至

第3章 数据链路层

第 3 章 数据链路层

数据链路层属于计算机网络的低层。数据链路层使用的信道主要有以下两种类型:

局域网虽然是个网络,但我们并不把局域网放在网络层中讨论。这是因为在网络层要讨论的问题是多个网络互连的问题,是讨论分组怎样从一个网络,通过路由器,转发到另一个网络。在本章中我们研究的是在同一个局域网中,分组怎样从一台主机传送到另一台主机,但并不经过路由器转发。从整个的互联网来看,局域网仍属于数据链路层的范围。

本章首先介绍点对点信道和在这种信道上最常用的点对点协议 PPP。然后再用较大的篇幅讨论共享信道的局域网和有关的协议。关于无线局域网的讨论将在第 9 章中进行。

本章最重要的内容是:

下面看一下两台主机通过互联网进行通信时数据链路层(简称为链路层)所处的地位(如图 3-1 所示)。

bebeec0cb5003bf94e5c61ea6126cadef93c8dbffe841a546ad30db6bca776f0.jpg

3fa9dada287d247f595ce455a1d5f38626c653f0b75554ec81d7f052f9ba2fc0.jpg

图 3-1 (a) 表示用户主机 \(H_{1}\) 通过电话线上网,中间经过三个路由器( \(R_{1}, R_{2}\)\(R_{3}\) )连接到远程主机 \(H_{2}\) 。所经过的网络可以是多种的,如电话网、局域网和广域网。当主机 \(H_{1}\)

\(H_{2}\) 发送数据时,从协议的层次上看,数据的流动如图 3-1 (b) 所示。主机 \(H_{1}\)\(H_{2}\) 都有完整的五层协议栈,但路由器在转发分组时使用的协议栈只有下面的三层 \(^{①}\) 。数据进入路由器后要先从物理层上到网络层,在转发表中找到下一跳的地址后,再下到物理层转发出去。因此,数据从主机 \(H_{1}\) 传送到主机 \(H_{2}\) 需要在路径中的各节点的协议栈向上和向下流动多次,如图中的浅灰色箭头所示。

然而当我们专门研究数据链路层的问题时,在许多情况下我们可以只关心在协议栈中水平方向的各数据链路层。于是,当主机 \(H_{1}\) 向主机 \(H_{2}\) 发送数据时,我们可以想象数据就是在数据链路层从左向右沿水平方向传送,如图 3-2 中从左到右的粗箭头所示,即通过以下这样的链路:

\(H_{1}\) 的链路层→ \(R_{1}\) 的链路层→ \(R_{2}\) 的链路层→ \(R_{3}\) 的链路层→ \(H_{2}\) 的链路层

7ba725b10bcbbcef74c1083c74e947f3ab2a7a059e9c05c9eb35a4ff0ee52825.jpg

图 3-2 指出,从数据链路层来看, \(H_{1}\)\(H_{2}\) 的通信可以看成由四段不同的链路层通信组成,即: \(H_{1} \rightarrow R_{1}\)\(R_{1} \rightarrow R_{2}\)\(R_{2} \rightarrow R_{3}\)\(R_{3} \rightarrow H_{2}\) 。这四段不同的链路层可能采用不同的数据链路层协议。

3.1 数据链路层的几个共同问题

本节重点讨论使用点对点信道的数据链路层的一些基本问题。其中的某些概念对广播信道也是适用的。

3.1.1 数据链路和帧

我们在这里要明确一下,“链路” 和 “数据链路” 并不是一回事。

所谓链路 (link) 就是从一个节点到相邻节点的一段物理线路(有线或无线),而中间没有任何其他的交换节点。在进行数据通信时,两台计算机之间的通信路径往往要经过许多段这样的链路。可见链路只是一条路径的组成部分。

数据链路 (data link) 则是另一个概念。这是因为当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议来控制这些数据的传输(这将在后面几节讨论)。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。现在最常用的方法是使用网络适配器(既有硬件,也包括软件)来实现这些协议。一般的适配器都包括了数据链路层和物理层这两层的功能。

也有人采用另外的术语。这就是把链路分为物理链路和逻辑链路。物理链路就是上面所说的链路,而逻辑链路就是上面的数据链路,是物理链路加上必要的通信协议。

早期的数据通信协议曾叫作通信规程 (procedure)。因此在数据链路层,规程和协议是同义语。

下面再介绍点对点信道的数据链路层的协议数据单元 —— 帧。

数据链路层把网络层交下来的数据构成帧发送到链路上,以及把接收到的帧中的数据取出并上交给网络层。在互联网中,网络层协议数据单元就是 IP 数据报(或简称为数据报、分组或包)。

为了把主要精力放在点对点信道的数据链路层协议上,可以采用如图 3-3 (a) 所示的三层模型。在这种三层模型中,不管在哪一段链路上的通信(主机和路由器之间或两个路由器之间),我们都看成是节点和节点的通信(如图中的节点 A 和节点 B),而每个节点只有下三层 —— 网络层、数据链路层和物理层。

8327a69febaf20c729629dbabea0f6714427af4f4b468ea21d4e69fdd15a6f25.jpg

点对点信道的数据链路层在进行通信时的主要步骤如下:

数据链路层不必考虑物理层如何实现比特传输的细节。我们甚至还可以更简单地设想好像是沿着两个数据链路层之间的水平方向把帧直接发送到对方,如图 3-3 (b) 所示。

3.1.2 三个基本问题

数据链路层协议有许多种,但有三个基本问题则是共同的。这三个基本问题是:封装成帧、透明传输和差错检测。下面分别讨论这三个基本问题。

1. 封装成帧

封装成帧 (framing) 就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。图 3-4 表示用帧首部和帧尾部封装成帧的一般概念。我们知道,分组交换的一个重要概念就是:所有在互联网上传送的数据都以分组(即 IP 数据报)为传送单位。网络层的 IP 数据报传送到数据链路层就成为帧的数据部分。在帧的数据部分的前面和后面分别添加上首部和尾部,构成了一个完整的帧。这样的帧就是数据链路层的数据传送单元。一个帧的帧长等于帧的数据部分长度加上帧首部和帧尾部的长度。首部和尾部的一个重要作用就是进行帧定界(即确定帧的界限)。此外,首部和尾部还包括许多必要的控制信息。在发送帧时,是从帧首部开始发送的。各种数据链路层协议都对帧首部和帧尾部的格式有明确的规定。显然,为了提高帧的传输效率,应当使帧的数据部分长度尽可能地大于首部和尾部的长度。但是,每一种链路层协议都规定了所能传送的帧的数据部分长度上限 —— 最大传送单元 MTU (Maximum Transfer Unit)。图 3-4 给出了帧的首部和尾部的位置,以及帧的数据部分与 MTU 的关系。

f50a8c84b8323c4bc662deafc5983ebd31a518fa0d78f14f40002a68cf67bbc6.jpg

当数据是由可打印的 ASCII 码组成的文本文件时,帧定界可以使用特殊的帧定界符。我们知道,ASCII 码是 7 位编码,一共可组合成 128 个不同的 ASCII 码,其中可打印的有 95 个 \(^{①}\) ,而不可打印的控制字符有 33 个。图 3-5 的例子可说明帧定界的概念。控制字符 SOH (Start Of Header) 放在一帧的最前面,表示帧的首部开始。另一个控制字符 EOT (End Of Transmission) 表示帧的结束。请注意,SOH 和 EOT 都是控制字符的名称。它们的十六进制编码分别是 01(二进制是 00000001)和 04(二进制是 00000100)。SOH(或 EOT)并不是 S, O, H(或 E, O, T)三个字符。此外,为了强调帧定界符的作用,与帧定界符无关的控制信息在图 3-5 中都省略了。

9276144320355bc9703dc44af2c2a7cad71ffe794da02fb43e017b71540d30df.jpg

当数据在传输中出现差错时,帧定界符的作用更加明显。假定发送端在尚未发送完一个帧时突然出故障,中断了发送。但随后很快又恢复正常,于是重新从头开始发送刚才未发送完的帧。由于使用了帧定界符,接收端就知道前面收到的数据是个不完整的帧(只有首部开始符 SOH 而没有传输结束符 EOT),必须丢弃。而后面收到的数据有明确的帧定界符(SOH 和 EOT),因此这是一个完整的帧,应当收下。

2. 透明传输

由于帧的开始和结束的标记使用专门指明的控制字符,因此,所传输的数据中的任何 8 比特的组合一定不允许和用作帧定界的控制字符的比特编码一样,否则就会出现帧定界的错误。

当传送的帧是用文本文件组成的帧时(文本文件中的字符都是从键盘上输入的),其数据部分显然不会出现像 SOH 或 EOT 这样的帧定界控制字符。可见不管从键盘上输入什么字符都可以放在这样的帧中传输过去,因此这样的传输就是透明传输。

但当数据部分是非 ASCII 码的文本文件时(如二进制代码的计算机程序或图像等),情况就不同了。如果数据中的某个字节的二进制代码恰好和 SOH 或 EOT 这种控制字符一样(如图 3-6 所示),数据链路层就会错误地 “找到帧的边界”,把部分帧收下(误认为是个完整的帧),而把剩下的那部分数据丢弃(这部分找不到帧定界控制字符 SOH)。

b351be8484f56c11197c73ca02232cb1ff8d0b72195fcb0a80f887a368a5eacb.jpg

像图 3-6 所示的帧的传输显然就不是 “透明传输”,因为当遇到数据中碰巧出现字符 “EOT” 时就传不过去了。数据中的 “EOT” 将被接收端错误地解释为 “传输结束” 的控制字符,而在其后面的数据因找不到 “SOH” 被接收端当作无效帧而丢弃。但实际上在数据中出现的字符 “EOT” 并非控制字符而仅仅是二进制数据 00000100。

前面提到的 “透明” 是一个很重要的术语。它表示:某一个实际存在的事物看起来却好像不存在一样(例如,你看不见在你前面有块 \(100\%\) 透明的玻璃的存在)。“在数据链路层透明传送数据” 表示无论什么样的比特组合的数据,都能够按照原样没有差错地通过这个数据链路层。因此,对所传送的数据来说,这些数据就 “看不见” 数据链路层有什么妨碍数据传输的东西。或者说,数据链路层对这些数据来说是透明的。

为了解决透明传输问题,就必须设法使数据中可能出现的控制字符 “SOH” 和 “EOT” 在接收端不被解释为控制字符。具体的方法是:发送端的数据链路层在数据中出现控制字符 “SOH” 或 “EOT” 的前面插入一个转义字符 “ESC”(其十六进制编码是 1B,二进制是 00011011)。而在接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符。这种方法称为字节填充 (byte stuffing) 或字符填充 (character stuffing)。如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个。图 3-7 表示用字节填充法解决透明传输的问题。

3e6edb1ae2572a729bef38549b9d23f24d490a41f01f14e42e12aa63c09a96dd.jpg

3. 差错检测

现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错:1 可能会变成 0,而 0 也可能变成 1。这就叫作比特差错。比特差错是传输差错中的一种。本小节所说的 “差错”,如无特殊说明,就是指 “比特差错”。在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率 BER (Bit Error Rate)。例如,误码率为 \(10^{-10}\) 时,表示平均每传送 \(10^{10}\) 个比特就会出现一个比特的差错。误码率与信噪比有很大的关系。如果设法提高信噪比,就可以使误码率减小。实际的通信链路并非是理想的,它不可能使误码率下降到零。因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。目前在数据链路层广泛使用了循环冗余检验 CRC (Cyclic Redundancy Check) 的检错技术。

下面我们通过一个简单的例子来说明循环冗余检验的原理。

在发送端,先把数据划分为组,假定每组 \(k\) 个比特。现假定待传送的数据 \(M = 101001\) \((k = 6)\) 。CRC 运算就是在数据 \(M\) 的后面添加供差错检测用的 \(n\) 位冗余码,然后构成一个帧发送出去,一共发送 \((k + n)\) 位。在所要发送的数据后面增加 \(n\) 位的冗余码,虽然增大了数据传输的开销,但却可以进行差错检测。当传输可能出现差错时,付出这种代价往往是很值得的。

这 n 位冗余码可用以下方法得出。用二进制的模 2 运算 \(^{①}\) 进行 \(2^{n}\) 乘 M 的运算,这相当于在 M 后面添加 n 个 0。得到的 \((k+n)\) 位的数除以收发双方事先商定的长度为 \((n+1)\) 位的除数 P,得出商是 Q 而余数是 R(n 位,比 P 少一位)。关于除数 P 下面还要介绍。在图 3-8 所示的例子中,M=101001(即 k=6)。假定除数 P=1101(即 n=3)。经模 2 除法运算后的结果是:商 Q=110101(这个商并没有什么用处),而余数 R=001。这个余数 R 就作为冗余码拼接在数据 M 的后面发送出去。这种为了进行检错而添加的冗余码常称为帧检验序列 FCS (Frame Check Sequence)。因此加上 FCS 后发送的帧是 101001001(即 \(2^{n}M+FCS\) ),共有 \((k+n)\) 位。

顺便说一下,循环冗余检验 CRC 和帧检验序列 FCS 并不是同一个概念。CRC 是一种检错方法,而 FCS 是添加在数据后面的冗余码,在检错方法上可以选用 CRC,但也可不选用 CRC。

42461672ab5d7b25c1979748e41a51683ec8257517b511fd4fba36523ba96a1b.jpg

在接收端把接收到的数据以帧为单位进行 CRC 检验:把收到的每一个帧都除以同样的除数 P(模 2 运算),然后检查得到的余数 R。

如果在传输过程中无差错,那么经过 CRC 检验后得出的余数 R 肯定是 0(读者可以自己验算一下。被除数现在是 101001001,而除数是 P = 1101,看余数 R 是否为 0)。

但如果出现误码,那么余数 \(R\) 仍等于零的概率是非常非常小的(这可以通过不太复杂的概率计算得出,例如,可参考 [TANE11])。

总之,在接收端对收到的每一帧经过 CRC 检验后,有以下两种情况:

一种较方便的方法是用多项式来表示循环冗余检验过程。在上面的例子中,用多项式 \(P(X)=X^{3}+X^{2}+1\) 表示上面的除数 P=1101(最高位对应于 \(X^{3}\) ,最低位对应于 \(X^{0}\) )。多项式 \(P(X)\) 称为生成多项式。现在广泛使用的生成多项式 \(P(X)\) 有以下几种:

\[ \begin{array}{l} \mathrm{CRC} - 1 6 = X ^ {1 6} + X ^ {1 5} + X ^ {2} + 1 \\ \mathrm{CRC-CCITT} = X ^ {1 6} + X ^ {1 2} + X ^ {5} + 1 \\ \mathrm{CRC} - 3 2 = X ^ {3 2} + X ^ {2 6} + X ^ {2 3} + X ^ {2 2} + X ^ {1 6} + X ^ {1 2} + X ^ {1 1} + X ^ {1 0} + X ^ {8} + X ^ {7} + X ^ {5} + X ^ {4} + X ^ {2} + X + 1 \\ \end{array} \]

在数据链路层,发送端帧检验序列 FCS 的生成和接收端的 CRC 检验都是用硬件完成的,处理很迅速,因此并不会延误数据的传输。

从以上的讨论不难看出,如果我们在传送数据时不以帧为单位来传送,那么就无法加入冗余码以进行差错检验。因此,如果要在数据链路层进行差错检验,就必须把数据划分为帧,每一帧都加上冗余码,一帧接一帧地传送,然后在接收方逐帧进行差错检验。

最后再强调一下,在数据链路层若仅仅使用循环冗余检验 CRC 差错检测技术,则只能做到对帧的无差错接受,即:“凡是接收端数据链路层接受的帧,我们都能以非常接近于 1 的概率认为这些帧在传输过程中没有产生差错”。接收端丢弃的帧虽然曾收到了,但最终还是因为有差错被丢弃,即没有被接受。以上所述的可以近似地表述为(通常都是这样认为):“凡是接收端数据链路层接受的帧均无差错”。

请注意,我们现在并没有要求数据链路层向网络层提供 “可靠传输” 的服务。所谓 “可靠传输” 就是:数据链路层的发送端发送什么,在接收端就收到什么。传输差错可分为两大类:一类就是前面所说的最基本的比特差错,而另一类传输差错则更复杂些,这就是收到的帧并没有出现比特差错,但却出现了帧丢失、帧重复或帧失序。例如,发送方连续传送三个帧:[#1]-[#2]-[#3]。假定接收端收到的每一个帧都没有比特差错,但却出现下面的几种情况:

帧丢失:收到 [#1]-[#3](丢失 [#2])。

帧重复:收到 [#1]-[#2]-[#2]-[#3](收到两个 [#2])。

帧失序:收到 [#1]-[#3]-[#2](后发送的帧反而先到达了接收端,这与一般数据链路层的传输概念不一样)。

以上三种情况都属于 “出现传输差错”,但都不是这些帧里有 “比特差错”。帧丢失很容易理解。但出现帧重复和帧失序的情况则较为复杂,对这些问题我们现在不展开讨论。在学完第 5 章的 5.4 节后,我们就会知道在什么情况下接收端可能会出现帧重复或帧失序。

总之,我们应当明确,“无比特差错” 与 “无传输差错” 并不是同样的概念。在数据链路层使用 CRC 检验,能够实现无比特差错的传输,但这还不是可靠传输。

我们知道,过去 OSI 的观点是:必须让数据链路层向上提供可靠传输。因此在 CRC 检错的基础上,增加了帧编号、确认和重传机制。收到正确的帧就要向发送端发送确认。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,因而就进行重传,直到收到对方的确认为止。这种方法在历史上曾经起到很好的作用。但现在的通信线路的质量已经大大提高了,由通信链路质量不好引起差错的概率已经大大降低。因此,现在互联网就采取了区别对待的方法:

对于通信质量良好的有线传输链路,数据链路层协议不使用确认和重传机制,即不要求数据链路层向上提供可靠传输的服务。如果在数据链路层传输数据时出现了差错并且需要进行改正,那么改正差错的任务就由上层协议(例如,运输层的 TCP 协议)来完成。

对于通信质量较差的无线传输链路,数据链路层协议使用确认和重传机制,数据链路层向上提供可靠传输的服务(见第 9 章)。

实践证明,这样做可以提高通信效率。

可靠传输协议将在第 5 章中讨论。本章介绍的数据链路层协议都不是可靠传输的协议。

3.2 点对点协议 PPP

在通信线路质量较差的年代,在数据链路层使用可靠传输协议曾经是一种好办法。因此,能实现可靠传输的高级数据链路控制 HDLC (High-level Data Link Control) 就成为当时比较流行的数据链路层协议。但现在 HDLC 已很少使用了。对于点对点的链路,简单得多的点对点协议 PPP (Point-to-Point Protocol) 则是目前使用得最广泛的数据链路层协议。

3.2.1 PPP 协议的特点

我们知道,互联网用户通常都要连接到某个 ISP 才能接入到互联网。PPP 协议就是用户计算机和 ISP 进行通信时所使用的数据链路层协议(如图 3-9 所示)。

80f0af85971c72d69c18687c40d348a11ad49b3e29f631c3d0d75e0b8797d14a.jpg

PPP 协议是 IETF 在 1992 年制定的。经过 1993 年和 1994 年的修订,现在的 PPP 协议在 1994 年就已成为互联网的正式标准 [RFC 1661, STD51]。

1. PPP 协议应满足的需求

IETF 认为,在设计 PPP 协议时必须考虑以下多方面的需求 [RFC 1547]:

(1) 简单 IETF 在设计互联网体系结构时把其中最复杂的部分放在 TCP 协议中,而网际协议 IP 则相对比较简单,它提供的是不可靠的数据报服务。在这种情况下,数据链路层没有必要提供比 IP 协议更多的功能。因此,对数据链路层的帧,不需要纠错,不需要序号,也不需要流量控制。IETF 把 “简单” 作为首要的需求。

简单的设计还可使协议在实现时不容易出错,从而使不同厂商在协议的不同实现上的互操作性提高了。我们知道,协议标准化的一个主要目的就是提高协议的互操作性。

总之,这种数据链路层的协议非常简单:接收方每收到一个帧,就进行 CRC 检验。如 CRC 检验正确,就收下这个帧;反之,就丢弃这个帧,其他什么也不做。

这里特别要提到的是在 1999 年公布的在以太网上运行的 PPP,即 PPP over Ethernet,简称为 PPPoE [RFC 2516],这是 PPP 协议能够适应多种类型链路的一个典型例子。PPPoE 是为宽带上网的主机使用的链路层协议。这个协议把 PPP 帧再封装在以太网帧中(当然还要增加一些能够识别各用户的功能)。宽带上网时由于数据传输速率较高,因此可以让多个连接在以太网上的用户共享一条到 ISP 的宽带链路。现在,即使只有一个用户利用 ADSL 进行宽带上网(并不和其他人共享到 ISP 的宽带链路),也是使用 PPPoE 协议,见后面的 3.5.4 节的讨论。

在 TCP/IP 协议族中,可靠传输由运输层的 TCP 协议负责,因此数据链路层的 PPP 协议不需要进行纠错,不需要设置序号,也不需要进行流量控制。PPP 协议不支持多点线路(即一个主站轮流和链路上的多个从站进行通信),而只支持点对点的链路通信。此外,PPP 协议只支持全双工链路。

2. PPP 协议的组成

PPP 协议有三个组成部分:

3.2.2 PPP 协议的帧格式

1. 各字段的意义

PPP 的帧格式如图 3-10 所示。PPP 帧的首部和尾部分别为四个字段和两个字段。

首部的第一个字段和尾部的第二个字段都是标志字段 F (Flag),规定为 0x7E(符号 “0x” 表示它后面的字符是用十六进制表示的。十六进制的 7E 的二进制表示是 01111110)。标志字段表示一个帧的开始或结束。因此标志字段就是 PPP 帧的定界符。连续两帧之间只需要用一个标志字段。如果出现连续两个标志字段,就表示这是一个空帧,应当丢弃。

首部中的地址字段 A 规定为 0xFF(即 11111111),控制字段 C 规定为 0x03(即 00000011)。最初曾考虑以后再对这两个字段的值进行其他定义,但至今也没有给出。可见这两个字段实际上并没有携带 PPP 帧的信息。

5913c377362479ff2cb4e0e4ea8e9271980cf8bc7b8205a3b4fc3ccadcfc3fb4.jpg

PPP 首部的第四个字段是 2 字节的协议字段。当协议字段为 0x0021 时,PPP 帧的信息字段就是 IP 数据报。若为 0xC021,则信息字段是 PPP 链路控制协议 LCP 的数据,而 0x8021 表示这是网络层的控制数据。

信息字段的长度是可变的,不超过 1500 字节。

尾部中的第一个字段(2 字节)是使用 CRC 的帧检验序列 FCS。

2. 字节填充

当信息字段中出现和标志字段一样的比特 (0x7E) 组合时,就必须采取一些措施使这种形式上和标志字段一样的比特组合不出现在信息字段中。

当 PPP 使用异步传输时,它把转义符定义为 0x7D(即 01111101),并使用字节填充,RFC 1662 规定了如下所述的填充方法:

由于在发送端进行了字节填充,因此在链路上传送的信息字节数就超过了原来的信息字节数。但接收端在收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复出原来的信息。

3. 零比特填充

PPP 协议用在 SONET/SDH 链路时,使用同步传输(一连串的比特连续传送)而不是异步传输(逐个字符地传送)。在这种情况下,PPP 协议采用零比特填充方法来实现透明传输。

零比特填充的具体做法是:在发送端,先扫描整个信息字段(通常用硬件实现,但也可用软件实现,只是会慢些)。只要发现有 5 个连续 1,则立即填入一个 0。因此经过这种零比特填充后的数据,就可以保证在信息字段中不会出现 6 个连续 1。接收端在收到一个帧时,先找到标志字段 F 以确定一个帧的边界,接着再用硬件对其中的比特流进行扫描。每当发现 5 个连续 1 时,就把这 5 个连续 1 后的一个 0 删除,以还原成原来的信息比特流(如图 3-11 所示)。这样就保证了透明传输:在所传送的数据比特流中可以传送任意组合的比特流,而不会引起对帧边界的错误判断。

27b51791d10998c0865fe57398cdbb4fe10e61e6780ead29abefb97fdb5aa8fc.jpg

3.2.3 PPP 协议的工作状态

上一节我们通过 PPP 帧的格式讨论了 PPP 帧是怎样组成的。但 PPP 链路一开始是怎样被初始化的?当用户拨号接入 ISP 后,就建立了一条从用户个人电脑到 ISP 的物理连接。这时,用户个人电脑向 ISP 发送一系列的链路控制协议 LCP 分组(封装成多个 PPP 帧),以便建立 LCP 连接。这些分组及其响应选择了将要使用的一些 PPP 参数。接着还要进行网络层配置,网络控制协议 NCP 给新接入的用户个人电脑分配一个临时的 IP 地址。这样,用户个人电脑就成为互联网上的一个有 IP 地址的主机了。

当用户通信完毕时,NCP 释放网络层连接,收回原来分配出去的 IP 地址。接着,LCP 释放数据链路层连接。最后释放的是物理层的连接。

上述过程可用如图 3-12 所示的状态图来描述。

PPP 链路的起始和终止状态永远是图 3-12 中的 “链路静止” (Link Dead) 状态,这时在用户个人电脑和 ISP 的路由器之间并不存在物理层的连接。

2b04df0f620e92b17fb621772149bc7842dabdf8341584d1c4c7ffe7f3056a09.jpg

当用户个人电脑通过调制解调器呼叫路由器时(通常是在屏幕上用鼠标点击一个连接按钮),路由器就能够检测到调制解调器发出的载波信号。在双方建立了物理层连接后,PPP 就进入 “链路建立” (Link Establish) 状态,其目的是建立链路层的 LCP 连接。

这时 LCP 开始协商一些配置选项,即发送 LCP 的配置请求帧 (Configure-Request)。这是个 PPP 帧,其协议字段置为 LCP 对应的代码,而信息字段包含特定的配置请求。链路的另一端可以发送以下几种响应中的一种:

LCP 配置选项包括链路上的最大帧长、所使用的鉴别协议 (Authentication Protocol) 的规约(如果有的话),以及不使用 PPP 帧中的地址和控制字段(因为这两个字段的值是固定的,没有任何信息量,可以在 PPP 帧的首部中省略这两个字节)。

协商结束后双方就建立了 LCP 链路,接着就进入 “鉴别”(Authenticate) 状态。在这一状态,只允许传送 LCP 协议的分组、鉴别协议的分组以及监测链路质量的分组。若使用口令鉴别协议 PAP (Password Authentication Protocol),则需要发起通信的一方发送身份标识符和口令。系统可允许用户重试若干次。如果需要有更好的安全性,则可使用更加复杂的口令握手鉴别协议 CHAP (Challenge-Handshake Authentication Protocol)。若鉴别身份失败,则转到 “链路终止”(Link Terminate) 状态。若鉴别成功,则进入 “网络层协议”(Network-Layer Protocol) 状态。

在 “网络层协议” 状态,PPP 链路两端的网络控制协议 NCP 根据网络层的不同协议互相交换网络层特定的网络控制分组。这个步骤是很重要的,因为现在的路由器都能够同时支持多种网络层协议。总之,PPP 协议两端的网络层可以运行不同的网络层协议,但仍然可使用同一个 PPP 协议进行通信。

如果在 PPP 链路上运行的是 IP 协议,则对 PPP 链路的每一端配置 IP 协议模块(如分配 IP 地址)时就要使用 NCP 中支持 IP 的协议 ——IP 控制协议 IPCP (IP Control Protocol)。IPCP 分组也封装成 PPP 帧(其中的协议字段为 0x8021)在 PPP 链路上传送。在低速链路上运行时,双方还可以协商使用压缩的 TCP 和 IP 首部,以减少在链路上发送的比特数。

当网络层配置完毕后,链路就进入可进行数据通信的 “链路打开”(Link Open) 状态。链路的两个 PPP 端点可以彼此向对方发送分组。两个 PPP 端点还可发送回送请求 LCP 分组 (Echo-Request) 和回送回答 LCP 分组 (Echo-Reply),以检查链路的状态。

数据传输结束后,可以由链路的一端发出终止请求 LCP 分组 (Terminate-Request) 请求终止链路连接,在收到对方发来的终止确认 LCP 分组 (Terminate-Ack) 后,转到 “链路终止” 状态。如果链路出现故障,也会从 “链路打开” 状态转到 “链路终止” 状态。当调制解调器的载波停止后,则回到 “链路静止” 状态。

图 3-12 右方的灰色方框给出了对 PPP 协议的几个状态的说明。从设备之间无链路开始,到先建立物理链路,再建立链路控制协议 LCP 链路。经过鉴别后再建立网络控制协议 NCP 链路,然后才能交换数据。由此可见,PPP 协议已不是纯粹的数据链路层的协议,它还包含了物理层和网络层的内容。

3.3 使用广播信道的数据链路层

广播信道可以进行一对多的通信。下面要讨论的局域网使用的就是广播信道。局域网是在 20 世纪 70 年代末发展起来的。局域网技术在计算机网络中占有非常重要的地位。

3.3.1 局域网的数据链路层

局域网最主要的特点是:网络为一个单位所拥有,且地理范围和站点数目均有限。在局域网刚刚出现时,局域网比广域网具有较高的数据率、较低的时延和较小的误码率。但随着光纤技术在广域网中普遍使用,现在广域网也具有很高的数据率和很低的误码率。

局域网具有如下的一些优点:

(1) 具有广播功能,从一个站点可很方便地访问全网。局域网上的主机可共享连接在局域网上的各种硬件和软件资源。

(2) 便于系统的扩展和逐渐地演变,各设备的位置可灵活调整和改变。

(3) 提高了系统的可靠性 (reliability)、可用性 (availability) 和生存性 (survivability)。

局域网可按网络拓扑进行分类。图 3-13 (a) 是星形网。由于集线器 (hub) 的出现和双绞线大量用于局域网中,星形以太网以及多级星形结构的以太网获得了非常广泛的应用。图 3-13 (b) 是环形网,图 3-13 (c) 为总线网,各站直接连在总线上。总线两端的匹配电阻吸收在总线上传播的电磁波信号的能量,避免在总线上产生有害的电磁波反射。总线网以传统以太网最为著名,但以太网后来又演变成了星形网。经过四十多年的发展,以太网的速率已大大提高。现在最常用的以太网的速率是 1 Gbit/s(家庭或中小企业)、10 Gbit/s(数据中心)和 100 Gbit/s(长距离传输),且其速率仍在继续提高。现在以太网已成为了局域网的同义词,因此本章从本节开始都是讨论以太网技术。

7bab3a2e1e7712dda88f8b3be3bd55d8d347c92ec2e079a8df5f51ff1aeb75c3.jpg

18cbc74e62b19b6cda40c521ebbba058920adeadfbe394afaf1c820b3bcca329.jpg

2a22e471b6dbbc2177a6a994d526560cfbe3c09c2f55a0cebb8c3bb48b58530d.jpg

局域网可使用多种传输媒体。双绞线最便宜,原来只用于低速(1\~2 Mbit/s)基带局域网。现在从 10 Mbit/s 至 10 Gbit/s 的局域网都可使用双绞线。双绞线已成为局域网中的主流传输媒体。当数据率更高时,往往需要使用光纤作为传输媒体。

必须指出,局域网工作的层次跨越了数据链路层和物理层。由于局域网技术中有关数据链路层的内容比较丰富,因此我们就把局域网的内容放在数据链路层这一章中讨论。但这并不表示局域网仅仅和数据链路层有关。

共享信道要着重考虑的一个问题就是如何使众多用户能够合理而方便地共享通信媒体资源。这在技术上有两种方法:

(1) 静态划分信道,如在第 2 章的 2.4 节中已经介绍过的频分复用、时分复用、波分复用和码分复用等。用户只要分配到了信道就不会和其他用户发生冲突。但这种划分信道的方法代价较高,不适合于局域网使用。

(2) 动态媒体接入控制,它又称为多点接入 (multiple access),其特点是信道并非在用户通信时固定分配给用户。这里又分为以下两类:

- 随机接入 随机接入的特点是所有的用户可随机地发送信息。但如果恰巧有两个或更多的用户在同一时刻发送信息,那么在共享媒体上就要产生碰撞(即发生了冲突),使得这些用户的发送都失败。因此,必须有解决碰撞的网络协议。

- 受控接入 受控接入的特点是用户不能随机地发送信息而必须服从一定的控制。这类的典型代表有分散控制的令牌环局域网和集中控制的多点线路探询 (polling),或称为轮询。

属于随机接入的以太网将被重点讨论。受控接入则由于目前在局域网中使用得较少,本书不再讨论。

由于以太网的数据率已演进到每秒吉比特甚至高达 400 吉比特,因此通常就用 “传统以太网” 来表示最早流行的 10 Mbit/s 速率的以太网。为了讨论原理,下面我们就从传统以太网开始。

1. 以太网的两个主要标准

以太网是美国施乐 (Xerox) 公司的 Palo Alto 研究中心(简称为 PARC)于 1975 年研制成功的。那时,以太网是一种基带总线局域网,当时的数据率为 2.94 Mbit/s。以太网用无源电缆作为总线来传送数据帧,并以曾经在历史上表示传播电磁波的以太 (Ether) 来命名。1976 年 7 月,Metcalfe 和 Boggs 发表他们的以太网里程碑论文 [METC76]。1980 年 9 月,DEC 公司、英特尔 (Intel) 公司和施乐公司联合提出了 10 Mbit/s 以太网规约的第一个版本 DIX V1(DIX 是这三个公司名称的缩写)。1982 年又修改为第二版规约(实际上也就是最后的版本),即 DIX Ethernet V2,成为世界上第一个局域网产品的规约。

在此基础上,IEEE 802 委员会 \(^{①}\) 的 802.3 工作组于 1983 年制定了第一个 IEEE 的以太网标准 IEEE 802.3 [W-IEEE802.3],数据率为 10 Mbit/s。802.3 局域网对以太网标准中的帧格式做了很小的一点更动,但允许基于这两种标准的硬件实现可以在同一个局域网上互操作。以太网的两个标准 DIX Ethernet V2 与 IEEE 的 802.3 标准只有很小的差别,因此很多人也常把 802.3 局域网简称为 “以太网”(本书也经常不严格区分它们,虽然严格说来,“以太网” 应当是指符合 DIX Ethernet V2 标准的局域网)。

出于有关厂商在商业上的激烈竞争,IEEE 802 委员会当初未能形成一个统一的、“最佳的” 局域网标准,而是被迫制定了几个不同的局域网标准,如 802.4 令牌总线网、802.5 令牌环网等。为了使数据链路层能更好地适应多种局域网标准,IEEE 802 委员会就把局域网的数据链路层拆成两个子层,即逻辑链路控制 LLC (Logical Link Control) 子层和媒体接入控制 MAC (Medium Access Control) 子层。与接入到传输媒体有关的内容都放在 MAC 子层,而

LLC 子层则与传输媒体无关,不管采用何种传输媒体和 MAC 子层的局域网对 LLC 子层来说都是透明的(如图 3-14 所示)。

08a1fa5922a09dfc19c5d3b43bbeb81125c1860633c89bda2575e1e7e8c74469.jpg

然而到了 20 世纪 90 年代后,激烈竞争的局域网市场逐渐明朗。以太网在局域网市场中已取得了垄断地位,并且几乎成为了局域网的代名词。这里不必叙述后来陆续出现的多种以太网标准的详细过程。目前使用最多的局域网只剩下 DIX Ethernet V2(简称为以太网),而不是 IEEE 802 委员会制定的几种局域网。IEEE 802 委员会制定的逻辑链路控制子层 LLC(即 IEEE 802.2 标准)的作用已经消失了,很多厂商生产的适配器上就仅装有 MAC 协议而没有 LLC 协议。本章在介绍以太网时就不再考虑 LLC 子层。这样对以太网工作原理的讨论会更加简洁。

2. 适配器的作用

首先我们从一般的概念上讨论一下计算机是怎样连接到局域网上的。

计算机与外界局域网的连接是通过适配器 (adapter)。适配器本来是在主机箱内插入的一块网络接口板(或者是在笔记本电脑中插入一块 PCMCIA 卡 —— 个人计算机存储器卡接口适配器)。这种接口板又称为网络接口卡 NIC (Network Interface Card) 或简称为 “网卡”。由于现在计算机主板上都已经嵌入了这种适配器,不再使用单独的网卡了,因此本书使用适配器这个更准确的术语。在这种通信适配器上面装有处理器和存储器(包括 RAM 和 ROM)。适配器和局域网之间的通信是通过电缆或双绞线以串行传输方式进行的,而适配器和计算机之间的通信则是通过计算机主板上的 I/O 总线以并行传输方式进行的。因此,适配器的一个重要功能就是要进行数据串行传输和并行传输的转换。由于网络上的数据率和计算机总线上的数据率并不相同,因此在适配器中必须装有对数据进行缓存的存储芯片。在主板上插入适配器时,还必须把管理该适配器的设备驱动程序安装在计算机的操作系统中。这个驱动程序以后就会告诉适配器,应当从存储器的什么位置上把多长的数据块发送到局域网,或者应当在存储器的什么位置上把局域网传送过来的数据块存储下来。适配器还要能够实现以太网协议。

请注意,虽然我们把适配器的内容放在数据链路层中讲授,但适配器所实现的功能却包含了数据链路层及物理层这两个层次的功能。现在的芯片的集成度都很高,以致很难把一个适配器的功能严格按照层次的关系精确划分开。

适配器在接收和发送各种帧时,不使用计算机的 CPU。这时计算机中的 CPU 可以处理其他任务。当适配器收到有差错的帧时,就把这个帧直接丢弃而不必通知计算机。当适配器收到正确的帧时,它就使用中断来通知该计算机,并交付协议栈中的网络层。当计算机要发送 IP 数据报时,就由协议栈把 IP 数据报向下交给适配器,组装成帧后发送到局域网。图 3-15 表示适配器的作用。我们特别要注意,计算机的硬件地址(在本章的 3.3.5 节讨论)就在适配器的 ROM 中,而计算机的软件地址 ——IP 地址(在第 4 章 4.2.3 节讨论),则在计算机的存储器中。

37277a09dde9b503ac23389f16888d8312bc58094eb0244e3149d5eef77dcc81.jpg

3.3.2 CSMA/CD 协议

最早的以太网是将许多计算机都连接到一根总线上。当初认为这种连接方法既简单又可靠,因为在那个时代普遍认为:“有源器件不可靠,而无源的电缆线才是最可靠的”。

总线的特点是:当一台计算机发送数据时,总线上的所有计算机都能检测到这个数据。这种就是广播通信方式。但我们并不总是要在局域网上进行一对多的广播通信。为了在总线上实现一对一的通信,可以使每一台计算机的适配器都拥有一个与其他适配器都不同的地址。在发送数据帧时,在帧的首部写明接收站的地址。现在的电子技术可以很容易做到:仅当数据帧中的目的地址与适配器 ROM 中存放的硬件地址一致时,该适配器才能接收这个数据帧。适配器对不是发送给自己的数据帧就丢弃。这样,具有广播特性的总线上就实现了一对一的通信。

人们也常把局域网上的计算机称为 “主机”“工作站”“站点” 或 “站”。在本书中,这几个名词都可以当成是同义词。

为了通信的简便,以太网采取了以下两种措施:

第一,采用较为灵活的无连接的工作方式,即不必先建立连接就可以直接发送数据。适配器对发送的数据帧不进行编号,也不要求对方发回确认。这样做可以使以太网工作起来非常简单,而局域网信道的质量很好,因通信质量不好产生差错的概率是很小的。因此,以太网提供的服务是尽最大努力的交付,即不可靠的交付。当目的站收到有差错的数据帧时(例如,用 CRC 查出有差错),就把帧丢弃,其他什么也不做。对有差错帧是否需要重传则由高层来决定。例如,如果高层使用 TCP 协议,那么 TCP 就会发现丢失了一些数据。于是经过一定的时间后,TCP 就把这些数据重新传递给以太网进行重传。但以太网并不知道这是重传帧,而是当作新的数据帧来发送。

我们知道,总线上只要有一台计算机在发送数据,总线的传输资源就被占用。因此,在同一时间只能允许一台计算机发送数据,否则各计算机之间就会互相干扰,使得所发送数据被破坏。因此,如何协调总线上各计算机的工作就是以太网要解决的一个重要问题。以太网采用最简单的随机接入,但有很好的协议用来减少冲突发生的概率。这好比有一屋子的人在开讨论会,没有会议主持人控制发言。想发言的随时可发言,不需要举手示意。但我们还必须有个协议来协调大家的发言。这就是:如果你听见有人在发言,那么你就必须等别人讲完了才能发言(否则就干扰了别人的发言)。但有时碰巧两个或更多的人同时发言了,那么一旦发现冲突,大家都必须立即停止发言,等听到没有人发言了你再发言。以太网采用的协调方法和上面的办法非常像,它使用的协议是 CSMA/CD,意思是载波监听多点接入 / 碰撞检测 (Carrier Sense Multiple Access with Collision Detection)。

第二,以太网发送的数据都使用曼彻斯特 (Manchester) 编码的信号。我们在第 2 章的 2.2.2 节中已经简单地介绍过曼彻斯特编码了。我们知道,二进制基带数字信号通常就是高、低电压交替出现的信号。使用这种信号的最大问题就是当出现一长串连续的 1 或连续的 0 时,接收端就无法从收到的比特流中提取位同步(即比特同步)信号。如图 3-16 所示,曼彻斯特编码的编码方法是把每一个码元再分成两个相等的间隔。码元 1 是前一个间隔为低电压而后一个间隔为高电压。码元 0 则正好相反,从高电压变到低电压(也可采用相反的约定,即 1 是 “前高后低” 而 0 是 “前低后高”)。这样就保证了在每一个比特的正中间出现一次电压的转换,而接收端就利用这种电压的转换很方便地把位同步信号提取出来。但是从曼彻斯特编码的波形图也不难看出其缺点,这就是它所占的频带宽度比原始的基带信号增加了一倍(因为每秒传送的码元数加倍了)。

2207e146032e78fb96d5aa62526080bb996313ed8fb59e56ba2ad6999e02fabd.jpg

下面介绍 CSMA/CD 协议的要点。

“多点接入” 就是说明这是总线型网络,许多计算机以多点接入的方式连接在一根总线上。协议的实质是 “载波监听” 和 “碰撞检测”。

“载波监听” 也就是 “边发送边监听”。这里必须指出,在通信领域,在大多数情况下,Carrier 的标准译名是 “载波”。但对于以太网,总线上根本没有什么 “载波”。其实英语 Carrier 有多种意思,如 “承运器”“传导管” 或 “运载工具” 等。因此在以太网中,把 Carrier 译为 “载体” 或 “媒体” 可能更加准确些。考虑到 “载波” 这个译名已经在我国广泛流行了好几十年,本书也就继续使用这个不准确的译名。我们知道,载波监听就是不管在想要发送数据之前,还是在发送数据之中,每个站都必须不停地检测信道。在发送前检测信道,是为了避免冲突。如果检测出已经有其他站在发送,则本站就暂时不要发送数据。在发送中检测信道,是为了及时发现如果有其他站也在发送,就立即中断本站的发送。这就称为碰撞检测。

“碰撞检测” 是适配器边发送数据边检测信道上的信号电压的变化情况。当两个或几个站同时在总线上发送数据时,总线上的信号电压变化幅度将会增大(互相叠加)。当适配器检测到的信号电压变化幅度超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。所谓 “碰撞” 就是发生了冲突。因此 “碰撞检测” 也称为 “冲突检测”。这时,总线上传输的信号产生了严重的失真,无法从中恢复出有用的信息来。因此,任何一个正在发送数据的站,一旦发现总线上出现了碰撞,其适配器就要立即停止发送,免得继续进行无效的发送,白白浪费网络资源,然后等待一段随机时间后再次发送。

既然每一个站在发送数据之前已经监听到信道为 “空闲”,那么为什么还会出现数据在总线上的碰撞呢?这是因为电磁波在总线上总是以有限的速率传播的。这和我们开讨论会时相似。一听见会场安静,我们就立即发言,但偶尔也会发生几个人同时抢着发言而产生冲突的情况。图 3-17 所示的例子可以说明这种情况。设图中的局域网两端的站 A 和 B 相距 \(1\mathrm{km}\) ,用同轴电缆相连。电磁波在 \(1\mathrm{km}\) 电缆的传播时延约为 \(5\mu \mathrm{s}\) (这个数字应当记住)。因此,A 向 B 发出的数据,在约 \(5\mu \mathrm{s}\) 后才能传送到 B。换言之,B 若在 A 发送的数据到达 B 之前发送自己的帧(因为这时 B 的载波监听检测不到 A 所发送的信息),则必然要在某个时间和 A 发送的帧发生碰撞。碰撞的结果是两个帧都变得无用。在局域网的分析中,常把总线上的单程端到端传播时延记为 \(\tau\) 。发送数据的站希望尽早知道是否发生了碰撞。那么,A 发送数据后,最迟要经过多长时间才能知道自己发送的数据和其他站发送的数据有没有发生碰撞?从图 3-17 不难看出,这个时间最多是两倍的总线端到端的传播时延 \((2\tau)\) ,或总线的端到端往返传播时延。由于局域网上任意两个站之间的传播时延有长有短,因此局域网必须按最坏情况设计,即取总线两端的两个站之间的传播时延(这两个站之间的距离最大)为端到端传播时延。

4090131b865648d1ed8edfab69eabad44dea8417670f019f035b5fadc76a03d5.jpg

显然,在使用 CSMA/CD 协议时,一个站不可能同时进行发送和接收(但必须边发送边监听信道)。因此使用 CSMA/CD 协议的以太网不可能进行全双工通信而只能进行双向交替通信(半双工通信)。

下面是图 3-17 中的一些重要的时刻。

在 t=0 时,A 发送数据。B 检测到信道为空闲。

\(t = \tau - \delta\) 时(这里 \(\tau > \delta > 0\) ),A 发送的数据还没有到达 B 时,由于 B 检测到信道是空闲的,因此 B 发送数据。

经过时间 \(\delta/2\) 后,即在 \(t=\tau-\delta/2\) 时,A 发送的数据和 B 发送的数据发生了碰撞,但这时 A 和 B 都不知道发生了碰撞。

\(t=\tau\) 时,B 检测到发生了碰撞,于是停止发送数据。

\(t=2\tau-\delta\) 时,A 也检测到发生了碰撞,因而也停止发送数据。

A 和 B 发送数据均失败,它们都要推迟一段时间再重新发送。

由此可见,每一个站在自己发送数据之后的一小段时间内,存在着遭遇碰撞的可能性。这一小段时间是不确定的,它取决于另一个发送数据的站到本站的距离。因此,以太网不能保证在检测到信道空闲后的某一时间内,一定能够把自己的数据帧成功地发送出去(因为存在产生碰撞的可能)。以太网的这一特点称为发送的不确定性。如果希望在以太网上发生碰撞的机会很小,必须使整个以太网的平均通信量远小于以太网的最高数据率。

从图 3-17 可看出,最先发送数据帧的 A 站,在发送数据帧后至多经过时间 \(2\tau\) 就可知道所发送的数据帧是否遭受了碰撞。这就是 \(\delta \rightarrow 0\) 的情况。因此以太网的端到端往返时间 \(2\tau\) 称为争用期 (contention period),它是一个很重要的参数。争用期又称为碰撞窗口 (collision window)。这是因为一个站在发送完数据后,只有通过争用期的 “考验”,即经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞。这时,就可以放心把这一帧数据顺利发送完毕。

以太网使用截断二进制指数退避 (truncated binary exponential backoff) 算法来确定碰撞后重传的时机。截断二进制指数退避算法并不复杂。这种算法让发生碰撞的站在停止发送数据后,不是等待信道变为空闲后就立即再发送数据,而是退避一个随机的时间。这点很容易理解,因为几个发生碰撞的站将会同时检测到信道变成了空闲。如果大家都同时重传,必然接连发生碰撞。如果采用退避算法,生成了最小退避时间的站将最先获发送权。以后其余的站的退避时间到了,但发送数据之前监听到信道忙,就不会马上发送数据了。

为了尽可能减小重传时再次发生冲突的概率,退避算法有如下具体的规定:

(1) 基本退避时间为争用期 \(2\tau\) ,具体的争用期时间是 \(51.2 \mu s\) 。对于 \(10 \mathrm{Mbit} / \mathrm{s}\) 以太网,在争用期内可发送 512 比特,即 64 字节。也可以说争用期是 512 比特时间。1 比特时间就是发送 1 比特所需的时间。所以这种时间单位与数据率密切相关。为了方便,也可以直接使用比特作为争用期的单位。争用期是 512 比特,即争用期是发送 512 比特所需的时间。

(2) 从离散的整数集合 \([0,1,\cdots,(2^{k}-1)]\) 中随机取出一个数,记为 r。重传应推后的时间就是 r 倍的争用期。上面的参数 k 按下面的公式 (3-1) 计算:

\[ k = \operatorname{Min} [ \text { 重传次数 }, 1 0 ] \tag {3-1} \]

可见当重传次数不超过 10 时,参数 k 等于重传次数;但当重传次数超过 10 时,k 就不再增大而一直等于 10。

(3) 当重传达 16 次仍不能成功时(这表明同时打算发送数据的站太多,以致连续发生冲突),则丢弃该帧,并向高层报告。

例如,在第 1 次重传时, \(k = 1\) ,随机数 \(r\) 从整数 \(\{0, 1\}\) 中选一个数。因此重传的站可选择的重传推迟时间是 0 或 \(2\tau\) ,在这两个时间中随机选择一个。

若再发生碰撞,则在第 2 次重传时,k=2,随机数 r 就从整数 \(\{0,1,2,3\}\) 中选一个数。因此重传推迟的时间是在 \(0,2\tau,4\tau\)\(6\tau\) 这 4 个时间中随机地选取一个。

同样,若再发生碰撞,则重传时 \(k = 3\) ,随机数 \(r\) 就从整数 \(\{0,1,2,3,4,5,6,7\}\) 中选一个数。依此类推。

若连续多次发生冲突,就表明可能有较多的站参与争用信道。但使用上述退避算法可使重传需要推迟的平均时间随重传次数而增大(这也称为动态退避),因而减小发生碰撞的概率,有利于整个系统的稳定。

我们还应注意到,适配器每发送一个新的帧,就要执行一次 CSMA/CD 算法。适配器对过去发生过的碰撞并无记忆功能。因此,当好几个适配器正在执行指数退避算法时,很可能有某一个适配器发送的新帧能够碰巧立即成功地插入到信道中,得到了发送权,而已经推迟好几次发送的站,有可能很不巧,还要继续执行退避算法,继续等待。

现在考虑一种情况。某个站发送了一个很短的帧,但在发送完毕之前并没有检测出碰撞。假定这个帧在继续向前传播到达目的站之前和别的站发送的帧发生了碰撞,因而目的站将收到有差错的帧(当然会把它丢弃)。可是发送站却不知道这个帧发生了碰撞,因而不会重传这个帧。这种情况显然是我们所不希望的。为了避免发生这种情况,以太网规定了一个最短帧长 64 字节,即 512 比特。如果要发送的数据非常少,那么必须加入一些填充字节,使帧长不小于 64 字节。对于 10 Mbit/s 以太网,发送 512 比特的时间需要 \(51.2\mu \mathrm{s}\) ,也就是上面提到的争用期。

由此可见,以太网在发送数据时,如果在争用期(共发送了 64 字节)没有发生碰撞,那么后续发送的数据就一定不会发生冲突。换句话说,如果发生碰撞,就一定是在发送的前 64 字节之内。由于一检测到冲突就立即中止发送,这时已经发送出去的数据一定小于 64 字节,因此凡长度小于 64 字节的帧都是由于冲突而异常中止的无效帧。只要收到了这种无效帧,就应当立即将其丢弃。

前面已经讲过,信号在以太网上传播 1 km 大约需要 5 μs。以太网上最大的端到端时延必须小于争用期的一半(即 25.6 μs),这相当于以太网的最大端到端长度约为 5 km。实际上的以太网覆盖范围远远没有这样大。因此,实用的以太网都能在争用期 51.2 μs 内检测到可能发生的碰撞。以太网的争用期确定为 51.2 μs,不仅考虑到以太网的端到端时延,而且还包括其他的许多因素,如存在的转发器所增加的时延,以及下面要讲到的强化碰撞的干扰信号的持续时间等。

下面介绍强化碰撞的概念。这就是当发送数据的站一旦发现发生了碰撞时,除立即停止发送数据外,还要再继续发送 32 比特或 48 比特的人为干扰信号 (jamming signal),以便让所有用户都知道现在已经发生了碰撞(如图 3-18 所示)。对于 \(10\mathrm{Mbit / s}\) 以太网,发送 32(或 48)比特只需要 3.2(或 4.8) \(\mu \mathrm{s}\)

8abd7a830179872217c610292105e8cfe49962bb3843e2a0984caa21821ad58c.jpg

从图 3-18 可以看出,A 站从发送数据开始到发现碰撞并停止发送的时间间隔是 \(T_{B}\) 。A 站得知碰撞已经发生时所发送的强化碰撞的干扰信号的持续时间是 \(T_{J}\) 。图中的 B 站在得知发生碰撞后,也要发送人为干扰信号,但为简单起见,图 3-18 没有画出 B 站所发送的人为干扰信号。发生碰撞使 A 浪费时间 \(T_{B} + T_{J}\) 。可是整个信道被占用的时间还要增加一个单程端到端的传播时延 \(\tau\) 。因此总线被占用的时间是 \(T_{B} + T_{J} + \tau\)

以太网还规定了帧间最小间隔为 \(9.6 \mu s\) ,相当于 96 比特时间。这样做是为了使刚刚收到数据帧的站的接收缓存来得及清理,做好接收下一帧的准备。

根据以上所讨论的,可以把 CSMA/CD 协议的要点归纳如下:

以太网每发送完一帧,一定要把已发送的帧暂时保留一下。如果在争用期内检测出发生了碰撞,那么还要在推迟一段时间后再把这个暂时保留的帧重传一次。

3.3.3 使用集线器的星形拓扑

传统以太网最初使用粗同轴电缆,后来演进到使用比较便宜的细同轴电缆,最后发展为使用更便宜和更灵活的双绞线。这种以太网采用星形拓扑,在星形的中心则增加了一种可靠性非常高的设备,叫作集线器 (hub),如图 3-19 所示。双绞线以太网总是和集线器配合使用的。每个站需要用两对无屏蔽双绞线(放在一根电缆内),分别用于发送和接收。双绞线的两端使用 RJ-45 插头。由于集线器使用了大规模集成电路芯片,因此集线器的可靠性就大大提高了。1990 年 IEEE 制定出星形以太网 10BASE-T 的标准 802.3i。“10” 代表 10 Mbit/s 的数据率,BASE 表示连接线上的信号是基带信号,T 代表双绞线。实践证明,这比使用具有大量机械接头的无源电缆要可靠得多。由于使用双绞线电缆的以太网价格便宜和使用方便,因此粗缆和细缆以太网现在都已成为历史,并已从市场上消失了。

cab5d3c6adad04782c210a07137e144c10e5e4ee051ac27c5aa3def5737fc45f.jpg

但 10BASE-T 以太网的通信距离稍短,每个站到集线器的距离不超过 100 m。这种性价比很高的 10BASE-T 双绞线以太网的出现,是局域网发展史上的一个非常重要的里程碑,从此以太网的拓扑就从总线型变为更加方便的星形网络,而以太网也就在局域网中占据了统治地位。

使双绞线能够传送高速数据的主要措施是把双绞线的绞合度做得非常精确。这样不仅可使特性阻抗均匀以减少失真,而且大大减少了电磁波辐射和无线电频率的干扰。在多对双绞线的电缆中,还要使用更加复杂的绞合方法。

集线器的一些特点如下:

(1) 从表面上看,使用集线器的局域网在物理上是一个星形网,但由于集线器使用电子器件来模拟实际电缆线的工作,因此整个系统仍像一个传统以太网那样运行。也就是说,使用集线器的以太网在逻辑上仍是一个总线网,各站共享逻辑上的总线,使用的还是 CSMA/CD 协议 (更具体些说,是各站中的适配器执行 CSMA/CD 协议)。网络中的各站必须竞争对传输媒体的控制,并且在同一时刻至多只允许一个站发送数据。

(2) 一个集线器有许多端口 \(^{①}\) ,例如,8 至 16 个,每个端口通过 RJ-45 插头(与电话机使用的插头 RJ-11 相似,但略大一些)用两对双绞线与一台计算机上的适配器相连(这种插座可连接 4 对双绞线,实际上只用 2 对,即发送和接收各使用一对双绞线)。因此,一个集线器很像一个多端口的转发器。

(3) 集线器工作在物理层,它的每个端口仅仅简单地转发比特 —— 收到 1 就转发 1 , 收到 0 就转发 0 , 不进行碰撞检测。若两个端口同时有信号输入 (即发生碰撞), 那么所有的端口都将收不到正确的帧。图 3-20 是具有三个端口的集线器的示意图。

cd30327bca54b784501c1dd277d500c17aeb9addd56c7979bef4ac30a83447fe.jpg

(4) 集线器采用了专门的芯片,进行自适应串音回波抵消。这样就可使端口转发出去的较强信号不致对该端口接收到的较弱信号产生干扰(这种干扰即近端串音)。每个比特在转发之前还要进行再生整形并重新定时。

集线器本身必须非常可靠。现在的堆叠式 (stackable) 集线器由 4\~8 个集线器堆叠起来使用。集线器一般都有少量的容错能力和网络管理功能。例如,假定在以太网中有一个适配器出了故障,不停地发送以太网帧。这时,集线器可以检测到这个问题,在内部断开与出故障的适配器的连线,使整个以太网仍然能够正常工作。模块化的机箱式智能集线器有很高的可靠性。它全部的网络功能都以模块方式实现。各模块均可进行热插拔,出故障时不断电即可更换或增加新模块。集线器上的指示灯还可显示网络上的故障情况,给网络的管理带来了很大的方便。

IEEE 802.3 标准还可使用光纤作为传输媒体,相应的标准是 10BASE-F 系列,F 代表光

纤。它主要用作集线器之间的远程连接。

3.3.4 以太网的信道利用率

下面我们讨论一下以太网的信道利用率。

假定一个 10 Mbit/s 以太网同时有 10 个站在工作,那么每一个站所能发送数据的平均速率似乎应当是总数据率的 1/10(即 1Mbit/s)。其实不然,因为多个站在以太网上同时工作就可能会发生碰撞。当发生碰撞时,信道资源实际上是被浪费了。因此,当扣除碰撞所造成的信道损失后,以太网总的信道利用率并不能达到 100%。

图 3-21 的例子是以太网的信道被占用的情况。一个站在发送帧时出现了碰撞。经过一个争用期 \(2\tau\) 后( \(\tau\) 是以太网单程端到端传播时延),可能又出现了碰撞。这样经过若干个争用期后,一个站就发送成功了。假定发送帧需要的时间是 \(T_{0}\) 。它等于帧长 (bit) 除以发送速率(10 Mbit/s)。

34f6dff239dfc01f65eb898db6b0164a5f595a4b162df7b95e44d7bf08d98eb1.jpg

我们应当注意到,成功发送一个帧需要占用信道的时间是 \(T_{0} + \tau\) ,比这个帧的发送时间要多一个单程端到端时延 \(\tau\) 。这是因为当一个站发送完最后一个比特时,这个比特还要在以太网上传播。在最极端的情况下,发送站在传输媒体的一端,而比特在媒体上传输到另一端所需的时间是 \(\tau\) 。因此,必须在经过时间 \(T_{0} + \tau\) 后以太网的媒体才完全进入空闲状态,才能允许其他站发送数据。

从图 3-21 可看出,要提高以太网的信道利用率,就必须减小 \(\tau\)\(T_{0}\) 之比。在以太网中定义了参数 a,它是以太网单程端到端时延 \(\tau\) 与帧的发送时间 \(T_{0}\) 之比:

\[ a = \frac {\tau}{T _ {0}} \tag {3-2} \]

\(a \rightarrow 0\) 时,表示只要一发生碰撞,就立即可以检测出来,并立即停止发送,因而信道资源被浪费的时间非常非常少。反之,参数 a 越大,表明争用期所占的比例越大,这就使得每发生一次碰撞就浪费了不少的信道资源,使得信道利用率明显降低。因此,以太网的参数 a 的值应当尽可能小些。从 (3-2) 式可看出,这就要求 (3-2) 式分子 \(\tau\) 的数值要小些,而分母 \(T_{0}\) 的数值要大些。这就是说,当数据率一定时,以太网的连线的长度受到限制(否则 \(\tau\) 的数值会太大),同时以太网的帧长不能太短(否则 \(T_{0}\) 的值会太小,使 a 值太大)。

现在考虑一种理想化的情况。假定以太网上的各站发送数据都不会产生碰撞(这显然已经不是 CSMA/CD,而是需要使用一种特殊的调度方法),并且能够非常有效地利用网络的传输资源,即总线一旦空闲就有某一个站立即发送数据。这样,发送一帧占用线路的时间是 \(T_{0} + \tau\) ,而帧本身的发送时间是 \(T_{0}\) 。于是我们可计算出极限信道利用率 \(S_{max}\) 为:

\[ S _ {\max} = \frac {T _ {0}}{T _ {0} + \tau} = \frac {1}{1 + a} \tag {3-3} \]

(3-3) 式的意义是:虽然实际的以太网不可能有这样高的极限信道利用率,但 (3-3) 式指出了只有当参数 \(a\) 远小于 1 才能得到尽可能高的极限信道利用率。反之,若参数 \(a\) 远大于 1(即每发生一次碰撞,就要浪费相对较多的传输数据的时间),则极限信道利用率就远小于 1,而这时实际的信道利用率就更小了。据统计,当以太网的利用率达到 \(30\%\) 时就已经处于重载的情况。很多的网络容量被网上的碰撞消耗掉了。

3.3.5 以太网的 MAC 层

1. MAC 层的硬件地址

在局域网中,硬件地址又称为物理地址或 MAC 地址(因为这种地址用在 MAC 帧中)。

12ef2c5de3d6d38228896c3f29d334f576622bd273c07926e4f1129e94a1f15a.jpg

大家知道,在所有计算机系统的设计中,标识系统 (identification system) \(^{①}\) 都是一个核心问题。在标识系统中,地址就是识别某个系统的一个非常重要的标识符。在讨论地址问题时,很多人常常引用著名文献 [SHOC78] 给出的如下定义:

“名字指出我们所要寻找的那个资源,地址指出那个资源在何处,路由告诉我们如何到达该处。”

这个非形式的定义固然很简单,但有时却不够准确。严格地讲,名字应当与系统的所在地无关。这就像我们每一个人的名字一样,不随我们所处的地点而改变。为此 IEEE 802 标准为局域网规定了一种 48 位的全球地址(一般都简称为 “地址”),这就是局域网上的每一台计算机中固化在适配器的 ROM 中的地址。因此,请特别注意下面两点:

由此可见,局域网上的某台主机的 “地址” 并不指明这台主机位于什么地方。因此,严格地讲,局域网的 “地址” 应当是每一个站的 “名字” 或标识符 [PERL00]。不过,计算机的名字通常都是比较适合人记忆的不太长的字符串,而这种 48 位二进制的 “地址” 却很不像一般计算机的名字。但现在人们还是习惯于把这种 48 位的 “名字” 称为 “地址”。本书也采用这种习惯用法,尽管这种说法并不严格。

请注意,如果连接在局域网上的主机或路由器安装有多个适配器,那么这样的主机或路由器就有多个 “地址”。实际上,这种 48 位 “地址” 应当是某个接口的标识符。

在制定局域网的地址标准时,首先遇到的问题就是应当用多少位来表示一个网络的地址字段。为了减少不必要的开销,地址字段的长度应当尽可能地短些。起初人们觉得用两个字节(共 16 位)表示地址就够了,因为这一共可表示 6 万多个地址。但是,由于局域网的迅速发展,而处在不同地点的局域网之间又经常需要交换信息,这就希望在各地的局域网中的站具有互不相同的物理地址。为了使用户在买到适配器并把机器连到局域网后马上就能工作,而不需要等待网络管理员给他先分配一个地址,IEEE 802 标准规定 MAC 地址字段可采用 6 字节(48 位)或 2 字节(16 位)这两种中的一种。6 字节地址字段对局部范围内使用的局域网的确是太长了,但是由于 6 字节的地址字段可使全世界所有的局域网适配器都具有不相同的地址,因此现在的局域网适配器实际上使用的都是 6 字节 MAC 地址。

现在 IEEE 的注册管理机构 RA (Registration Authority) 是局域网全球地址的法定管理机构 [W-IEEERA],它负责分配地址字段的 6 个字节中的前三个字节(即高位 24 位)。世界上凡要生产局域网适配器的厂家都必须向 IEEE 购买由这三个字节构成的这个号(即地址块),这个号的正式名称是组织唯一标识符 OUI (Organizationally Unique Identifier),通常也叫作公司标识符 (company_id) [RFC 7042]。但应注意,24 位的 OUI 不能够单独用来标志一个公司,因为一个公司可能购买了几个 OUI,也可能有几个小公司合起来购买一个 OUI。例如,华为公司购买了多个 OUI,其中的一个是 A8-E5-44 \(^{①}\) 。地址字段中的后三个字节(即低位 24 位)则是由厂家自行指派,称为扩展标识符 (extended identifier),只要保证生产出的适配器没有重复地址即可。可见购买了一个 OUI,就可以生成出 2 \(^{24}\) 个不同的 6 字节(48 位)MAC 地址,这种地址又称为 EUI-48,这里 EUI 表示扩展的唯一标识符 (Extended Unique Identifier)。EUI-48 的使用范围并不局限于局域网的硬件地址,而是可以用于软件接口。在生产适配器时,这种 6 字节的 MAC 地址已被固化在适配器的 ROM 中。因此,MAC 地址也叫作硬件地址 (hardware address) 或物理地址 \(^{②}\) 。可见 “MAC 地址” 实际上就是适配器地址或适配器标识符 EUI-48。当这种适配器嵌入到某台计算机(或手机)后,适配器上的标识符 EUI-48 就成为这台计算机(或手机)的 MAC 地址了。

IEEE 规定地址字段的第一字节的最低有效位为 I/G 位。I/G 表示 Individual/Group。当 I/G 位为 0 时,地址字段表示一个单个站地址。当 I/G 位为 1 时表示组地址,用来进行多播(以前曾译为组播)。需要指出,有的书把上述最低有效位写为 “第一位”,但 “第一” 的定义是含糊不清的。这是因为在地址记法中有两种标准:第一种记法是把每一字节的最低位(即最低有效位)写在最左边(第一位)。IEEE 802.3 标准就采用这种记法。例如,十进制数 11 的二进制表示是 1011,最高位写在最左边。但若使用 IEEE 802.3 标准的记法,就应当记为 1101,把最低位写在最左边。当我们阅读 802.3 标准的有关文档时,需要特别注意。第二种记法是把每一字节的最高位(即最高有效位)写在最左边(这也叫第一位)。在发送数据时,两种记法都是按照字节的顺序发送,但每一个字节中先发送哪一位则不同:第一种记法先发送最低位,但第二种记法则先发送最高位。

IEEE 还考虑到可能有人并不愿意向 IEEE 的 RA 购买 OUI。为此,IEEE 把地址字段第一字节的最低第二位规定为 G/L 位,表示 Global/Local。当 G/L 位为 0 时是全球管理(保证在全球没有相同的地址),厂商向 IEEE 购买的 OUI 都属于全球管理。当地址字段的 G/L 位为 1 时是本地管理,这时用户可任意分配网络上的地址。采用 2 字节地址字段时全都是本地管理。但应当指出,以太网几乎不理会这个 G/L 位。

这样,在全球管理时,对每一个站的地址可用 46 位的二进制数字来表示(最低位和最低第二位均为 0 时)。剩下的 46 位组成的地址空间可以有 \(2^{46}\) 个地址,已经超过 70 万亿个,可保证世界上的每一个适配器都可有一个唯一的地址。当然,非无限大的地址空间总有用完的时候。但据测算,至少在近期还不需要考虑 MAC 地址耗尽的问题。

当路由器通过适配器连接到局域网时,适配器上的硬件地址就用来标志路由器的某个接口。路由器如果同时连接到两个网络上,那么它就需要两个适配器和两个硬件地址。

我们知道适配器有过滤功能。当适配器从网络上每收到一个 MAC 帧就先用硬件检查 MAC 帧中的目的地址。如果是发往本站的帧则收下,然后再进行其他的处理。否则就将此帧丢弃,不再进行其他的处理。这样做就不浪费主机的处理机和内存资源了。这里 “发往本站的帧” 包括以下三种帧:

(1) 单播 (unicast) 帧(一对一),即收到的帧的 MAC 地址与本站的 MAC 地址相同。

(2) 广播 (broadcast) 帧(一对全体),即发送给本局域网上所有站点的帧(全 1 地址)。

(3) 多播 (multicast) 帧(一对多),即发送给本局域网上一部分站点的帧。

所有的适配器都至少应当能够识别前两种帧,即能够识别单播和广播地址。有的适配器可用编程方法识别多播地址。当操作系统启动时,它就把适配器初始化,使适配器能够识别某些多播地址。显然,只有目的地址才能使用广播地址和多播地址。

以太网适配器还可设置为一种特殊的工作方式,即混杂方式 (promiscuous mode)。工作在混杂方式的适配器只要 “听到” 有帧在以太网上传输就都悄悄地接收下来,而不管这些帧发往哪个站。请注意,这样做实际上是 “窃听” 其他站点的通信而并不中断其他站点的通信。网络上的黑客 (hacker 或 cracker) 常利用这种方法非法获取网上用户的口令。因此,以太网上的用户不愿意网络上有工作在混杂方式的适配器。

但混杂方式有时却非常有用。例如,网络维护和管理人员需要用这种方式来监视和分析以太网上的流量,以便找出提高网络性能的具体措施。有一种很有用的网络工具叫作嗅探器 (Sniffer) 就使用了设置为混杂方式的网络适配器。此外,这种嗅探器还可帮助学习网络的人员更好地理解各种网络协议的工作原理。因此,混杂方式就像一把双刃剑,是利是弊要看你怎样使用它。

2. MAC 帧的格式

常用的以太网 MAC 帧格式有两种标准,一种是 DIX Ethernet V2 标准(即以太网 V2 标准),另一种是 IEEE 的 802.3 标准。这里只介绍使用得最多的以太网 V2 的 MAC 帧格式(如图 3-22 所示)。图中假定网络层使用的是 IP 协议。实际上使用其他的协议也是可以的。

a4f878a0e337d467c5fca16b3e33b6c3b0b176a4b28c29a1e9a5225e84c059ab.jpg

以太网 V2 的 MAC 帧较为简单,由五个字段组成。前两个字段分别为 6 字节长的目的地址和源地址字段。第三个字段是 2 字节的类型字段,用来标志上一层使用的是什么协议,以便把收到的 MAC 帧的数据上交给上一层的这个协议。例如,当类型字段的值是 0x0800 时,就表示上层使用的是 IP 数据报。第四个字段是数据字段,其长度在 46 到 1500 字节之间(46 字节是这样得出的:最小长度 64 字节减去 18 字节的首部和尾部就得出数据字段的最小长度)。最后一个字段是 4 字节的帧检验序列 FCS(使用 CRC 检验)。当传输媒体的误码率为 \(1 \times 10^{-8}\) 时,MAC 子层可使未检测到的差错小于 \(1 \times 10^{-14}\) 。FCS 检验的范围就是整个的 MAC 帧,从目的地址开始到 FCS 为止的这五个字段,但不包括物理层插入的 8 字节的前同步码和帧开始定界符。

这里我们要指出,在以太网 V2 的 MAC 帧格式中,其首部并没有一个帧长度(或数据长度)字段。那么,MAC 子层又怎样知道从接收到的以太网帧中取出多少字节的数据交付上一层协议呢?我们在前面讲述图 3-16 的曼彻斯特编码时已经讲过,这种曼彻斯特编码的一个重要特点就是:在曼彻斯特编码的每一个码元(不管码元是 1 或 0)的正中间一定有一次电压的转换(从高到低或从低到高)。当发送方把一个以太网帧发送完毕后,就不再发送其他码元了(既不发送 1,也不发送 0)。因此,发送方网络适配器的接口上的电压也就不再变化了。这样,接收方就可以很容易地找到以太网帧的结束位置。在这个位置往前数 4 字节(FCS 字段长度是 4 字节),就能确定数据字段的结束位置。

当数据字段的长度小于 46 字节时,MAC 子层就会在数据字段的后面加入一个整数字节的填充字段,以保证以太网的 MAC 帧长不小于 64 字节。我们应当注意到,MAC 帧的首部并没有指出在数据字段中是否有填充字段。接收端的 MAC 子层在剥去 MAC 帧的首部和尾部后,就把剩下的部分交给上面的 IP 层。那么 IP 层怎样知道这里有没有填充字段呢?大家知道,IP 协议的首部有一个 “总长度” 字段。如果 IP 数据报的 “总长度” 超过或等于 46 字节,那么肯定就没有填充字段。反之,如果 “总长度” 小于 46 字节,那么就很容易把填充字段计算出。例如,若 IP 数据报的总长度为 42 字节,填充字段就应当是 4 字节。当 MAC 帧把 46 字节的数据上交给 IP 层后,IP 层就把其中最后 4 字节的填充字段丢弃。

从图 3-22 可看出,在传输媒体上实际传送的要比 MAC 帧还多 8 个字节。这是因为当一个站在刚开始接收 MAC 帧时,由于适配器的时钟尚未与到达的比特流达成同步,因此 MAC 帧的最前面的若干位就无法接收,结果使整个的 MAC 成为无用的帧。为了接收端迅速实现位同步,从 MAC 子层向下传到物理层时还要在帧的前面插入 8 个字节(由硬件生成),它由两个字段构成。第一个字段是 7 个字节的前同步码(1 和 0 交替码),它的作用是使接收端的适配器在接收 MAC 帧时能够迅速调整其时钟频率,使它和发送端的时钟同步,也就是 “实现位同步”(位同步就是比特同步的意思)。第二个字段是帧开始定界符,定义为 10101011。它的前六位的作用和前同步码一样,最后的两个连续的 1 就是告诉接收端适配器:“MAC 帧的信息马上就要来了,请适配器注意接收。”MAC 帧的 FCS 字段的检验范围不包括前同步码和帧开始定界符。顺便指出,在使用 SONET/SDH 进行同步传输时则不需要用前同步码,因为在同步传输时收发双方的位同步总是一直保持着的。

还需注意,在以太网上传送数据时是以帧为单位传送的。以太网在传送帧时,各帧之间还必须有一定的间隙。因此,接收端只要找到帧开始定界符,其后面的连续到达的比特流就都属于同一个 MAC 帧。可见以太网不需要使用帧结束定界符,也不需要使用字节插入来保证透明传输。

IEEE 802.3 标准规定凡出现下列情况之一的即为无效的 MAC 帧:

(3) 收到的帧的 MAC 客户数据字段的长度不在 46~1500 字节之间。考虑到 MAC 帧首部和尾部的长度共有 18 字节,可以得出有效的 MAC 帧长度为 64~1518 字节之间。

对于检查出的无效 MAC 帧就简单地丢弃。以太网不负责重传丢弃的帧。

最后要提一下,IEEE 802.3 标准规定的 MAC 帧格式与上面所讲的以太网 V2 MAC 帧格式的区别就是以下三点。

第一,IEEE 802.3 规定的 MAC 帧的第三个字段是 “长度 / 类型”。由于以太网有效帧的最大长度是 1518 字节。因此当这个字段值大于 0x0600 时(相当于十进制的 1536),这个字段就表示 “类型”。这样的帧格式就和以太网 V2 MAC 帧格式完全一样。只有当这个字段值小于 0x0600 时才表示 “长度”,即 MAC 帧的数据部分长度。显然,在这种情况下,若数据字段的长度与实际的长度字段的值不一致,则该帧为无效的 MAC 帧。实际上,前面我们已经讲过,由于以太网采用了曼彻斯特编码,长度字段本来并无实际意义。

第二,当 “长度 / 类型” 字段值小于 0x0600 时,数据字段必须装入上面的逻辑链路控制 LLC 子层的 LLC 帧。

第三,在 802.3 标准的文档中,MAC 帧的帧格式包括了 8 字节的前同步码和帧开始定界符。有些教科书也是这样引用的。不过这并不影响我们对以太网工作原理的理解。

由于现在广泛使用的局域网只有以太网,因此 LLC 帧已经失去了原来的意义(见本章 3.3.1 节第 1 小节 “以太网的两个主要标准”)。现在市场上流行的都是以太网 V2 的 MAC 帧,但大家也常常把它称为 IEEE 802.3 标准的 MAC 帧。

3.4 扩展的以太网

在许多情况下,我们希望把以太网的覆盖范围扩展。本节先讨论在物理层把以太网扩展,然后讨论在数据链路层把以太网扩展。这种扩展的以太网在网络层看来仍然是一个网络。

3.4.1 在物理层扩展以太网

以太网上的主机之间的距离不能太远(例如,10BASE-T 以太网的两台主机之间的距离不超过 200 m),否则主机发送的信号经过铜线的传输就会衰减到使 CSMA/CD 协议无法正常工作。在过去广泛使用粗缆或细缆以太网时,常使用工作在物理层的转发器来扩展以太网的地理覆盖范围。那时,两个网段可用一个转发器连接起来。IEEE 802.3 标准还规定,任意两个站之间最多可以经过三个电缆网段。但随着双绞线以太网成为以太网的主流类型,扩展以太网的覆盖范围已很少使用转发器了。

现在,扩展主机和集线器之间的距离的一种简单方法就是使用光纤(通常是一对光纤)和一对光纤调制解调器,如图 3-23 所示。

c1583aea2e66ea701494c89a15fbc4ed7c49fb5dfc6bb9cdd23ed41200a02e33.jpg

光纤调制解调器的作用就是进行电信号和光信号的转换。由于光纤带来的时延很小,并且带宽很宽,因此使用这种方法可以很容易地使主机和几公里以外的集线器相连接。

如果使用多个集线器,就可以连接成覆盖更大范围的多级星形结构的以太网。例如,一个学院的三个系各有一个 10BASE-T 以太网(如图 3-24 (a) 所示),可通过一个主干集线器把各系的以太网连接起来,成为一个更大的以太网(如图 3-24 (b) 所示)。

36008e31ed1c2ac2e74aa732de9536b8cda225c83549ff070eef14aa9b8e45e7.jpg

62fab01ec9708ba76f0e9554dab3bc91d5b465375bd1341ac3f446f77c15a607.jpg

这样做可以有以下两个好处。第一,使这个学院不同系的以太网上的计算机能够进行跨系的通信。第二,扩大了以太网覆盖的地理范围。例如,在一个系的 10BASE-T 以太网中,主机与集线器的最大距离是 100 m,因而两台主机之间的最大距离是 200 m。但在通过主干集线器相连接后,不同系的主机之间的距离就可扩展了,因为集线器之间的距离可以是 100m(使用双绞线)或更远(如使用光纤)。

但这种多级结构的集线器以太网也带来了一些缺点。

(1) 如图 3-24 (a) 所示的例子,在三个系的以太网互连起来之前,每一个系的 10BASE-T 以太网是一个独立的碰撞域 (collision domain, 又称为冲突域),即在任一时刻,在每一个碰撞域中只能有一个站在发送数据。每一个系的以太网的最大吞吐量是 10 Mbit/s,因此三个系总的最大吞吐量是 30 Mbit/s。在三个系的以太网通过集线器互连起来后就把三个碰撞域变成一个碰撞域(范围扩大到三个系),如图 3-24 (b) 所示,而这时的最大吞吐量仍然是一个系的吞吐量 10 Mbit/s。这就是说,当某个系的两个站在通信时所传送的数据会通过所有的集线器进行转发,使得其他系的内部在这时都不能通信(一发送数据就会碰撞)。

(2) 如果不同的系使用不同的以太网技术(如数据率不同),那么就不可能用集线器将它们互连起来。如果在图 3-24 中,一个系使用 10 Mbit/s 的适配器,而另外两个系使用 10/100 Mbit/s 的适配器,那么用集线器连接起来后,大家都只能工作在 10 Mbit/s 的速率。集线器基本上是个多端口(也称为接口)的转发器,它并不能把帧进行缓存。

3.4.2 在数据链路层扩展以太网

扩展以太网更常用的方法是在数据链路层进行的。最初人们使用的是网桥 (bridge)。网桥对收到的帧根据其 MAC 帧的目的地址进行转发和过滤。当网桥收到一个帧时,并不是向所有的端口转发此帧,而是根据此帧的目的 MAC 地址,查找网桥中的地址表,然后确定将该帧转发到哪一个端口,或者是把它丢弃(即过滤)。

1990 年问世的交换式集线器 (switching hub),很快就淘汰了网桥。交换式集线器常称为以太网交换机 (switch) 或第二层交换机 (L2 switch),强调这种交换机工作在数据链路层。

“交换机” 并无准确的定义和明确的概念。著名网络专家 Perlman 认为:“交换机” 应当是一个市场名词,而交换机的出现的确使数据的转发更加快速了 [PERL00]。本书也使用这个广泛被接受的名词 —— 以太网交换机。下面简单地介绍以太网交换机的特点。

1. 以太网交换机的特点

以太网交换机实质上就是一个多端口的网桥,通常都有十几个或更多的端口,和工作在物理层的转发器、集线器有很大的差别。以太网交换机的每个端口都直接与一个单台主机或另一个以太网交换机相连,并且一般都工作在全双工方式。以太网交换机还具有并行性,即能同时连通多对端口,使多对主机能同时通信(而网桥只能一次分析和转发一个帧)。相互通信的主机都独占传输媒体,无碰撞地传输数据。换句话说,每一个端口和连接到端口的主机构成了一个碰撞域,具有 N 个端口的以太网交换机的碰撞域共有 N 个。

以太网交换机的端口还有存储器,能在输出端口繁忙时把到来的帧进行缓存。因此,如果连接在以太网交换机上的两台主机,同时向另一台主机发送帧,那么当这台主机的端口繁忙时,发送帧的这两台主机的端口会把收到的帧暂存一下,以后再发送出去。

以太网交换机是一种即插即用设备,其内部的帧交换表(又称为地址表)是通过自学习算法自动地逐渐建立起来的。实际上,这种交换表就是一个内容可寻址存储器 CAM (Content Addressable Memory)。以太网交换机由于使用了专用的交换结构芯片,用硬件转发收到的帧,其转发速率要比使用软件转发的网桥快很多。

以太网交换机的性能远远超过普通的集线器,而且价格也不贵,这就使工作在物理层的集线器逐渐地退出了市场。

对于传统的 10 Mbit/s 的共享式以太网,若共有 10 个用户,则每个用户占有的平均带宽只有 1 Mbit/s。若使用以太网交换机来连接这些主机,虽然在每个端口到主机的带宽还是 10 Mbit/s,但由于一个用户在通信时是独占而不是和其他网络用户共享传输媒体的带宽,因此对于拥有 10 个端口的交换机的总容量则为 100 Mbit/s。这正是交换机的最大优点。

从共享总线以太网转到交换式以太网时,所有接入设备的软件和硬件、适配器等都不需要做任何改动。

以太网交换机一般都具有多种速率的端口,例如,可以具有 10 Mbit/s, 100 Mbit/s 和 1 Gbit/s 的端口的各种组合,这就大大方便了各种不同情况的用户。

虽然许多以太网交换机对收到的帧采用存储转发方式进行转发,但也有一些交换机采用直通 (cut-through) 的交换方式。直通交换不必把整个数据帧先缓存后再进行处理,而是在接收数据帧的同时就立即按数据帧的目的 MAC 地址决定该帧的转发端口,因而提高了帧的转发速度。如果在这种交换机的内部采用基于硬件的交叉矩阵,交换时延就非常小。直通交换的一个缺点是它不检查差错就直接将帧转发出去,因此有可能也将一些无效帧转发给其他的站。在某些情况下,仍需要采用基于软件的存储转发方式进行交换,例如当需要进行线路速率匹配、协议转换或差错检测时。现在有的厂商已生产出能支持两种交换方式的以太网交换机。以太网交换机的发展与建筑物结构化布线系统的普及应用密切相关。在结构化布线系统中,广泛地使用了以太网交换机。

2. 以太网交换机的自学习功能

我们用一个简单例子来说明以太网交换机是怎样进行自学习的。

假定在图 3-25 中的以太网交换机有 4 个端口,各连接一台计算机,其 MAC 地址分别是 A, B, C 和 D。交换表最重要的就是两个项目:目的 MAC 地址和转发端口。在一开始,以太网交换机里面的交换表是空的(如图 3-25 (a) 所示)。

c19407c9fb96b0a06b74a31e2ff9fbecd845a5a1bb8db07add9252e34540fb85.jpg

假定 A 先向 B 发送一帧,从端口 1 进入到交换机。交换机收到帧后,先查找交换表。现在表中没有 B 的地址。于是,交换机把此帧的源地址 A 和端口 1 写入交换表中,并向除端口 1 以外的所有端口广播这个帧(从端口 1 收到的帧显然不应再从端口 1 转发出去)。

广播发送可以保证让 B 收到这个帧,而 C 和 D 在收到帧后,因目的地址不匹配将丢弃此帧。这一过程也称为过滤。

由于在交换表中写入了项目 (A, 1),因此以后不管从哪个端口收到帧,只要其目的地址是 A,就把收到的帧从端口 1 转发出去送交 A。这样做的依据是:既然 A 发送的帧是从端口 1 进入交换机的,那么从端口 1 转发出的帧肯定到达 A。

接下来假定 B 通过端口 3 向 A 发送一帧。交换机查找交换表,发现交换表中的 MAC 地址有 A,表明凡是发给 A 的帧(即目的地址为 A 的帧)都应从端口 1 转发。显然,现在应直接把收到的帧从端口 1 转发给 A,而没有必要再广播收到的帧。交换表这时用源地址 B 写入一个项目 (B,3),表明今后如有发送给 B 的帧,应从端口 3 转发。

经过一段时间后,只要主机 C 和 D 也向其他主机发送帧,以太网交换机中的交换表就会把转发到 C 或 D 应当经过的端口号(2 或 4)写入交换表中。这样,交换表中的项目就逐渐增多了,以后再转发帧时就可以直接从交换表中找到转发的端口,而不必使用发送广播帧

的方法了。

考虑到有时可能要在交换机的端口更换主机,或者主机要更换其网络适配器,这就需要及时更改交换表中的项目。为此,当交换表中写入一个项目时就记下当时的时间,只要超过预先设定的时间(例如 300 秒),该项目就自动被删除。用这样的方法保证交换表中的数据都符合当前网络的实际状况。这就是说,图 3-25 中的交换表实际上是有三列,即 MAC 地址、端口和写入时间。

以太网交换机的这种自学习方法使得以太网交换机能够即插即用,不必人工进行配置,因此非常方便。

但有时为了增加网络的可靠性,在使用以太网交换机组网时,往往会增加一些冗余的链路。在这种情况下,自学习的过程就可能导致以太网帧在网络的某个环路中无限制地兜圈子。我们用图 3-26 的简单例子来说明这个问题。

在图 3-26 中,假定一开始主机 A 通过端口交换机 #1 向主机 B 发送一帧①。

由于交换表目前是空的,因此交换机 #1 收到帧①后就向本交换机的所有其他端口进行广播发送。我们现在观察其中一个帧的走向:

离开交换机 #1 端口 3 的帧②到达交换机 #2 端口 1,然后向交换机 #2 所有其他端口广播发送;

广播发送的帧中有一个帧③到达交换机 #2 端口 2;

交换机 #2 端口 2 把这个帧(帧④)发送到交换机 #1 端口 4,接着又向交换机 #1 所有其他端口广播发送帧;

广播发送的帧中有一个帧⑤到达交换机 #1 端口 3;

......

上述过程就这样无限制地循环兜圈子(②→③→④→⑤)。显然,这就白白消耗了网络资源。

68d8ea6b7254f42d6770f2bcc55a5579d53d159ad1dff5c1c9aea5b1b930c550.jpg

为了解决这种兜圈子问题,IEEE 的 802.1D 标准制定了一个生成树协议 STP (Spanning Tree Protocol)。其要点就是不改变网络的实际拓扑,但在逻辑上则切断某些链路,使得从一台主机到所有其他主机的路径是无环路的树状结构,从而消除了兜圈子现象。

3. 从总线以太网到星形以太网

大家知道,传统的电话网是星形结构,其中心就是电话交换机。那么在 20 世纪 70 年代中期出现的局域网,为什么不采用这种星形结构呢?这是因为在当时的技术条件下,还很难用廉价的方法制造出高可靠性的以太网交换机。所以那时的以太网就采用无源的总线结构。这种总线式以太网一问世就受到广大用户的欢迎,并获得了很快的发展。

然而随着以太网上站点数目的增多,使得总线结构以太网的可靠性下降。与此同时,大规模集成电路以及专用芯片的发展,使得星形结构的以太网交换机可以做得既便宜又可靠。在这种情况下,采用以太网交换机的星形结构就成为以太网的首选拓扑,而传统的总线以太

网也很快从市场上消失了。

总线以太网使用 CSMA/CD 协议,以半双工方式工作。但以太网交换机不使用共享总线,没有碰撞问题,因此不使用 CSMA/CD 协议,而是以全双工方式工作。既然连以太网的重要协议 CSMA/CD 都不使用了(相关的 “争用期” 也没有了),为什么还叫作以太网呢?原因就是它的帧结构未改变,仍然采用以太网的帧结构。

3.4.3 虚拟局域网

以太网交换机的问世,加速了以太网的普及应用。一个以太网交换机可以非常方便地连接几十台计算机,构成一个星形以太网。

但是,当一个以太网包含的计算机太多时,往往会带来两个缺点。

首先,一个以太网是一个广播域。在以太网上经常会出现大量的广播帧。在交换机的交换表的建立过程中要使用许多广播帧。我们经常使用的 ARP 和 DHCP 协议(这将在后面两章中讲到),也都要在以太网中传送很多的广播帧。在一个主机数量很大的以太网上传播广播帧,必然会消耗很多的网络资源。如果网络的配置出了些差错,就有可能发生广播帧在网络中无限制地兜圈子(如图 3-26 所示那样),形成了 “广播风暴”,使整个的网络瘫痪。

其次,一个单位的以太网往往为好几个下属部门所共享。但有些部门的信息是需要保密的(例如,财务部门或人事部门)。许多部门共享一个局域网对信息安全不利。

如果使每一个小部门各拥有自己的较小的局域网,那么这不但可使局域网的广播域范围缩小,同时也提高了局域网的安全性。在以太网交换机出现后,我们可以很方便灵活地建立虚拟局域网 VLAN (Virtual LAN)。这样就把一个较大的局域网,分割成为一些较小的局域网,而每一个局域网是一个较小的广播域。

在 IEEE 802.1Q 标准中,对虚拟局域网 VLAN 是这样定义的:

虚拟局域网 VLAN 是由一些局域网网段构成的与物理位置无关的逻辑组,而这些网段具有某些共同的需求。每一个 VLAN 的帧都有一个明确的标识符,指明发送这个帧的计算机属于哪一个 VLAN。

虚拟局域网其实只是局域网给用户提供的一种服务,而并不是一种新型局域网。

1988 年 IEEE 批准了 802.3ac 标准,这个标准定义了以太网的帧格式的扩展,以便支持虚拟局域网。虚拟局域网协议允许在以太网的帧格式中插入一个 4 字节的标识符(如图 3-27 所示),称为 VLAN 标签 (tag),用来指明发送该帧的计算机属于哪一个虚拟局域网。插入 VLAN 标签的帧称为 802.1Q 帧。

faaf365ed3c9aafc4b49775c46bcbf8cc84e1a200e807a98186b52cf879318a3.jpg

VLAN 标签字段的长度是 4 字节,插入在以太网 MAC 帧的源地址字段和类型字段之间。VLAN 标签的前两个字节总是设置为 0x8100(即二进制的 10000001 00000000),称为 IEEE

802.1Q 标签类型。VLAN 标签的后两个字节中,前面 4 位实际上并没有什么作用,这里不讨论,后面的 12 位是该虚拟局域网 VLAN 标识符 VID (VLAN ID),它唯一地标志了 802.1Q 帧属于哪一个 VLAN。12 位的 VID 可识别 4096 个不同的 VLAN。插入 VLAN 标签后,802.1Q 帧最后的帧检验序列 FCS 必须重新计算。

当数据链路层检测到 MAC 帧的源地址字段后面的两个字节的值是 0x8100 时,就知道现在插入了 4 字节的 VLAN 标签。由于用于 VLAN 的以太网帧的首部增加了 4 个字节,因此以太网的最大帧长从原来的 1518 字节(1500 字节的数据加上 18 字节的首部和尾部)变为 1522 字节。

这样的 802.1Q 帧在什么地方使用呢?我们可以用图 3-28 给出的简单例子来说明。交换机 #1 连接了 7 台计算机,组成了一个局域网(一个广播域)。现在把局域网划分为两个虚拟局域网 VLAN-10 和 VLAN-20。这里的 10 和 20 是虚拟局域网的编号,由交换机管理人员设定。这个编号就是图 3-27 中的 VID 字段的值。

9d64498106164af224d915a446205cdc3cef9c90d5fb4e3fee3823f52a077c84.jpg

现在我们有了两个较小的广播域。每台计算机都是通过接入链路 (access link) 连接到以太网交换机的。管理人员划分虚拟局域网的方法有多种。例如,按交换机的端口划分,或按 MAC 地址划分。每台主机并不知道自己的 VID 值(但交换机必须知道这些信息)。这些主机通过接入链路发送到交换机的帧都是标准的以太网帧。

在一个用多个交换机连接起来的较大的局域网中,可以灵活地划分虚拟局域网,不受地理位置的限制。一个虚拟局域网的范围可以跨越不同的交换机。当然,所使用的交换机必须要能够识别和处理虚拟局域网。在图 3-28 中,在另外一层楼的交换机 #2 连接了 5 台计算机,并与交换机 #1 相连接。交换机 #2 中的两台计算机加入到 VLAN-10,而另外 3 台加入到 VLAN-20。这两个虚拟局域网虽然都跨越了两个交换机,但都各自是一个广播域。

连接两个交换机端口之间的链路称为汇聚链路 (trunk link) 或干线链路。

现在假定 A 向 B 发送帧。由于交换机 #1 能够根据帧首部的目的 MAC 地址,识别 B 属于本交换机管理的 VLAN-10,因此就像在普通以太网中那样直接进行帧的转发,不需要使用 VLAN 标签。这是最简单的情况。

现在假定 A 向 E 发送帧。交换机 #1 查到 E 并没有连接到本交换机,因此必须从汇聚链路把帧转发到交换机 #2,但在转发之前,要插入 VLAN 标签。不插入 VLAN 标签,交换机 #2 就不知道应把帧转发给哪一个 VLAN。因此在汇聚链路传送的帧是 802.1Q 帧。交换机 #2 在向 E 转发帧之前,要拿走已插入的 VLAN 标签,因此 E 收到的帧就是 A 发送的标准以太网帧,而不是 802.1Q 帧。图 3-28 说明了这种情况。

如果 A 向 C 发送帧,情况又怎样呢?这种情况就复杂些了,因为这是在不同网络之间的通信。虽然 A 和 C 都连接到同一个交换机,但它们已经处在不同的网络中(VLAN-10 和

VLAN-20)。这问题是互连网络中的通信问题,已经超过了本章数据链路层的范围。这要由属于上面的网络层中的路由器来解决。

不过有的交换机中嵌入了一个用专用芯片构成的转发模块,用来在不同的 VLAN 之间转发帧。这样就可以不必再使用另外的路由器,而就在交换机中实现了第 3 层的转发功能(由于使用硬件转发,转发帧的速率提高了,比使用路由器要快)。这种转发功能被称为第 3 层交换,而这种交换机常称为 L3/L2 交换机。

有了这种第 3 层交换机,连接到不同交换机的 A 和 F,都能不需要经过另外的路由器而相互通信。更详细的转发过程这里就不继续讨论了。

3.5 高速以太网

随着电子技术的发展,以太网的速率也不断提升。从传统的 10 Mbit/s 以太网一直发展到现在常用的速率为 1 Gbit/s 的吉比特以太网,甚至更快的以太网。下面简单介绍几种高速以太网技术。

3.5.1 100BASE-T 以太网

100BASE-T 是在双绞线上传送 100 Mbit/s 基带信号的星形拓扑以太网,仍使用 IEEE 802.3 的 CSMA/CD 协议,它又称为快速以太网 (Fast Ethernet)。用户只要使用 100 Mbit/s 的适配器和 100 Mbit/s 的集线器或交换机,就可很方便地由 10BASE-T 以太网直接升级到 100 Mbit/s,而不必改变网络的拓扑结构。所有在 10BASE-T 上的应用软件和网络软件都可保持不变。100BASE-T 的适配器有很强的自适应性,能够自动识别 10 Mbit/s 和 100 Mbit/s。1995 年 IEEE 已把 100BASE-T 快速以太网定为正式标准(IEEE 802.3u),是对现行的 IEEE 802.3 标准的补充。

100BASE-T 可使用以太网交换机提供很好的服务质量,可在全双工方式下工作而无冲突发生。因此,CSMA/CD 协议对全双工方式工作的快速以太网是不起作用的(但在半双工方式工作时则一定要使用 CSMA/CD 协议)。快速以太网使用的 MAC 帧格式仍然是 IEEE 802.3 标准规定的帧格式。

然而 IEEE 802.3u 的标准未包括对同轴电缆的支持。这意味着想从细缆以太网升级到快速以太网的用户必须重新布线。因此,现在 10/100 Mbit/s 以太网都使用无屏蔽双绞线布线。

100 Mbit/s 以太网的新标准改动了原 10 Mbit/s 以太网的某些规定。我们知道,以太网有一个重要的参数 a,它必须保持为很小的数值。在 3.3.4 节曾给出了参数 a 的公式 (3-2):

\[ a = \frac {\tau}{T _ {0}} \tag {3-2} \]

这里 \(\tau\) 是以太网单程端到端时延, \(T_{0}\) 是帧的发送时间。我们知道, \(T_{0}\) 是帧长与发送速率之比,可见为了保持参数 a 不变,可以使 \(\tau\) 与发送速率的乘积不变。在帧长一定的条件下,若数据率提高到 10 倍,可把网络电缆长度(因而使 \(\tau\) )减小到原有数值的十分之一。

在 100 Mbit/s 的以太网中采用的方法是保持最短帧长不变,对于铜缆 100 Mbit/s 以太网,一个网段的最大长度是 100 m,其最短帧长仍为 64 字节,即 512 比特。因此 100 Mbit/s 以太网的争用期是 5.12 μs,帧间最小间隔现在是 0.96 μs,都是 10 Mbit/s 以太网的 1/10。

表 3-1 是 100 Mbit/s 以太网的新标准规定的三种不同的物理层标准。

表 3-1 100 Mbit/s 以太网的物理层标准

名称媒体网段最大长度特点
100BASE-TX铜缆100 m两对 UTP 5 类线或屏蔽双绞线 STP
100BASE-T4铜缆100 m4 对 UTP 3 类线或 5 类线
100BASE-FX光缆2000 m两根光纤,发送和接收各用一根

在标准中把上述的 100BASE-TX 和 100BASE-FX 合在一起称为 100BASE-X。

100BASE-T4 使用 4 对 UTP 3 类线或 5 类线时,使用 3 对线同时传送数据(每一对线以 \(33\frac{1}{3}\) Mbit/s 的速率传送数据),用 1 对线作为碰撞检测的接收信道。

3.5.2 吉比特以太网

IEEE 在 1997 年通过了吉比特以太网的标准 802.3z,并在 1998 年成为正式标准。几年来,吉比特以太网迅速占领了市场,成为以太网的主流产品。

吉比特以太网的标准 IEEE 802.3z 有以下几个特点:

吉比特以太网可用作现有网络的主干网,也可在高带宽(高速率)的应用场合中(如医疗图像或 CAD 的图形等)用来连接计算机和服务器。

吉比特以太网的物理层使用两种成熟的技术:一种来自现有的以太网,另一种则是美国国家标准协会 ANSI 制定的光纤通道 FC (Fibre Channel)。采用成熟技术就能大大缩短吉比特以太网标准的开发时间。

表 3-2 是吉比特以太网的物理层的标准。

表 3-2 吉比特以太网物理层标准

名称媒体网段最大长度特点
1000BASE-SX光缆550 m多模光纤(50 和 62.5 μm)
1000BASE-LX光缆5000 m单模光纤(10 μm)多模光纤(50 和 62.5 μm)
1000BASE-CX铜缆25 m使用 2 对屏蔽双绞线电缆 STP
1000BASE-T铜缆100 m使用 4 对 UTP 5 类线

现在 1000BASE-X(包括表 3-2 中的前三项)的标准是 IEEE 802.3z,而 1000BASE-T 的标准是 IEEE 802.3ab。

吉比特以太网工作在半双工方式时,就必须进行碰撞检测。由于数据率提高了,因此只有减小最大电缆长度或增大帧的最小长度,才能使参数 a 保持为较小的数值。若将吉比特以太网最大电缆长度减小到 10 m,那么网络的实际价值就大大减小。而若将最短帧长提高到 640 字节,则在发送短数据时开销又太大。因此,吉比特以太网仍然保持一个网段的最大长度为 100 m,但采用了 “载波延伸”(carrier extension) 的办法,使最短帧长仍为 64 字节(这样可以保持兼容性),同时将争用期增大为 512 字节。凡发送的 MAC 帧长不足 512 字节时,就用一些特殊字符填充在帧的后面,使 MAC 帧的发送长度增大到 512 字节,这对有效载荷 \(^{①}\) 并无影响。接收端在收到以太网的 MAC 帧后,要把所填充的特殊字符删除后才向高层交付。当原来仅 64 字节长的短帧填充到 512 字节时,所填充的 448 字节就造成了很大的开销。

为此,吉比特以太网还增加了一种功能称为分组突发 (packet bursting)。这就是当很多短帧要发送时,第一个短帧要采用上面所说的载波延伸的方法进行填充。但随后的一些短帧则可一个接一个地发送,它们之间只需留有必要的帧间最小间隔即可。这样就形成一串分组的突发,直到达到 1500 字节或稍多一些为止。当吉比特以太网工作在全双工方式时(即通信双方可同时进行发送和接收数据),不使用载波延伸和分组突发。

吉比特以太网交换机可以直接与多个图形工作站相连,也可用作百兆以太网的主干网,与百兆比特或吉比特交换机相连,然后再和大型服务器连接在一起。图 3-29 是吉比特以太网的一种配置举例。

4591a14c7f784b9482827db257a37f0814d16c8bdcd1963c7ece7c7f84e21a47.jpg

3.5.3 10 吉比特以太网 (10GbE) 和更快的以太网

10GbE 并非把吉比特以太网的速率简单地提高到 10 倍,因为还有许多技术上的问题要解决。下面是 10GbE 的主要特点。顺便指出,10 吉比特就是 \(10 \times 10^{9}\) 比特,有人愿意称之为 “万兆比特”。虽然 “万” 是中国的一种常用的计量单位,但这与国际上通用的表示方法不一致,因此本书不予采用。

10GbE 的帧格式与 10 Mbit/s, 100 Mbit/s 和 1 Gbit/s 以太网的帧格式完全相同,并保留了 802.3 标准规定的以太网最小帧长和最大帧长。这就使用户在将其已有的以太网进行升级时,仍能和较低速率的以太网很方便地通信。

10GbE 只工作在全双工方式,因此不存在争用问题,当然也不使用 CSMA/CD 协议。这就使得 10GbE 的传输距离大大提高了(因为不再受必须进行碰撞检测的限制)。

表 3-3 是 10GbE 的物理层标准。

表 3-3 10GbE 的物理层标准

名称媒体网段最大长度特点
10GBASE-SR光缆300 m多模光纤(0.85 μm)
10GBASE-LR光缆10 km单模光纤(1.3 μm)
10GBASE-ER光缆40 km单模光纤(1.5 μm)
10GBASE-CX4铜缆15 m使用 4 对双芯同轴电缆(twinax)
10GBASE-T铜缆100 m使用 4 对 6A 类 UTP 双绞线

表 3-3 中的前三项的标准是 IEEE 802.3ae,在 2002 年 6 月完成。第四项的标准是 IEEE 802.3ak,完成于 2004 年。最后一项的标准是 IEEE 802.3an,完成于 2006 年。

以太网的技术发展得很快。在 10GbE 之后又制定了 40GbE/100GbE(即 40 吉比特以太网和 100 吉比特以太网)的标准 IEEE 802.3ba-2010 和 802.3bm-2015。表 3-4 是 40GbE 和 100GbE 的物理层名称及传输距离,其中有两项带 * 号的是 802.3bm 提出的。

表 3-4 40GbE/100GbE 的物理层标准

物理层40GbE100GbE
在背板上传输至少超过1m40GBASE-KR4
在铜缆上传输至少超过7m40GBASE-CR4100GBASE-CR10
在多模光纤上传输至少100m40GBASE-SR4100GBASE-SR10, *100GBASE-SR4
在单模光纤上传输至少10km40GBASE-LR4100GBASE-LR4
在单模光纤上传输至少40km*40GBASE-ER4100GBASE-ER4

需要指出的是,40GbE/100GbE 以太网只工作在全双工的传输方式(因而不使用 CSMA/CD 协议),并且仍然保持了以太网的帧格式以及 802.3 标准规定的以太网最小和最大帧长。100GbE 在使用单模光纤传输时,仍然可以达到 40 km 的传输距离,但这需要波分复用(使用 4 个波长复用一根光纤,每一个波长的有效传输速率是 25 Gbit/s)。

由于大型数据中心迫切需要非常高速的数据传送,在 2017 年 12 月,更高速率的以太网标准颁布了,这就是 IEEE 802.3bs 标准,共有两种速率,即 200GbE(速率为 200 Gbit/s)和 400GbE(速率为 400 Gbit/s),全部用光纤传输(单模和多模)。根据传输方式的不同,传输距离从 100 m 至 10 km 不等。今后还会有更快的以太网问世。

现在以太网的工作范围已经从局域网(校园网、企业网)扩大到城域网和广域网,从而实现了端到端的以太网传输。这种工作方式的好处是:

以太网从 10 Mbit/s 到 10 Gbit/s 甚至到 400 Gbit/s 的演进,证明了以太网是:

3.5.4 使用以太网进行宽带接入

现在人们也在使用以太网进行宽带接入互联网。为此,IEEE 在 2001 年初成立了 802.3EFM 工作组 \(^{①}\) ,专门研究高速以太网的宽带接入技术问题。

以太网接入的一个重要特点是它可以提供双向的宽带通信,并且可以根据用户对带宽的需求灵活地进行带宽升级(例如,把 10 兆的以太网交换机更新为吉比特的以太网交换机)。当城域网和广域网都采用吉比特以太网或 10 吉比特以太网时,采用以太网接入可以实现端到端的以太网传输,中间不需要再进行帧格式的转换。这就提高了数据的传输效率且降低了传输的成本。

然而以太网的帧格式标准中,在地址字段部分并没有用户名字段,也没有让用户键入密码来鉴别用户身份的过程。如果网络运营商要利用以太网接入到互联网,就必须解决这个问题。

于是有人就想法子把数据链路层的两个成功的协议结合起来,即把 PPP 协议中的 PPP 帧再封装到以太网中来传输。这就是 1999 年公布的 PPPoE (PPP over Ethernet),意思是 “在以太网上运行 PPP” [RFC 2516]。现在的光纤宽带接入 FTTx 都要使用 PPPoE 的方式进行接入。

例如,如果使用光纤到大楼 FTTB 的方案,就在每个大楼的楼口安装一个光网络单元 ONU(其作用和以太网交换机差不多),然后根据用户所申请的带宽,用 5 类线(请注意,到这个地方,传输媒体已经变为铜线了)接到用户家中。如果大楼里上网的用户很多,那么还可以在每一个楼层再安装一个 100 Mbit/s 的以太网交换机。各大楼的以太网交换机通过光缆汇接到光汇接点(光汇接点一般通过城域网连接到互联网的主干网)。

使用这种方式接入到互联网时,在用户家中不再需要使用任何调制解调器,只要一个 RJ-45 的插口即可。用户把自己的个人电脑通过 5 类网线连接到墙上的 RJ-45 插口中,然后在 PPPoE 弹出的窗口中键入在网络运营商处购买的用户名(就是一串数字)和密码(严格说就是口令),就可以进行宽带上网了。请注意,使用这种以太网宽带接入时,从用户家中的个人电脑到户外的第一个以太网交换机的带宽是能够得到保证的。因为这个带宽是用户独占的,没有和其他用户共享。但这个以太网交换机到上一级的交换机的带宽,是许多用户共享的。因此,如果过多的用户同时上网,则有可能使每一个用户实际上享受到的带宽减少。这时,网络运营商就应当及时进行扩容,以保证用户的利益不受损伤。

顺便指出,当用户利用 ADSL(非对称数字用户线)进行宽带上网时,从用户个人电脑到家中的 ADSL 调制解调器之间,也是使用 RJ-45 和 5 类线(即以太网使用的网线)进行连接的,并且也是使用 PPPoE 弹出的窗口进行拨号连接的。但是用户个人电脑发送的以太网帧到了家里的 ADSL 调制解调器后,就转换成为 ADSL 使用的 PPP 帧。需要注意的是,在用户家中墙上是通过电话使用的 RJ-11 插口,用普通的电话线传送 PPP 帧。这已经和以太网没有关系了。所以这种上网方式不能称为以太网上网,而是利用电话线宽带接入到互联网。

本章的重要概念

一个多端口的网桥,而每个端口都直接与某台单主机或另一个集线器相连,且工作在全双工方式。以太网交换机能同时连通许多对端口,使每一对相互通信的主机都能像独占通信媒体那样,无碰撞地传输数据。

- 高速以太网有 100 Mbit/s 的快速以太网、吉比特以太网和 10 Gbit/s 的 10 吉比特以太网。最近还发展到 400 吉比特以太网。在宽带接入技术中,也常使用高速以太网进行接入。

习题

若要发送的数据在传输过程中最后一个 1 变成了 0,即变成了 1101011010,问接收端能否发现?

若要发送的数据在传输过程中最后两个 1 都变成了 0,即变成了 1101011000,问接收端能否发现?

采用 CRC 检验后,数据链路层的传输是否就变成了可靠的传输?

(1) 普通的电话通信。

(2) 互联网提供的电子邮件服务。

太网选择总线拓扑结构而不使用星形拓扑结构,但现在却改为使用星形拓扑结构呢?

3-15 什么叫作传统以太网?以太网有哪两个主要标准?

3-16 数据率为 10 Mbit/s 的以太网在物理媒体上的码元传输速率(即码元 / 秒)是多少?

3-17 为什么 LLC 子层的标准已制定出来了但现在却很少使用?

3-18 试说明 10BASE-T 中的 “10” “BASE” 和 “T” 所代表的意思。

3-19 以太网使用的 CSMA/CD 协议是以争用方式接入到共享信道的,这与传统的时分复用 TDM 相比有何优缺点?

3-20 假定 1 km 长的 CSMA/CD 网络的数据率为 1 Gbit/s。设信号在网络上的传播速率为 200000 km/s。求能够使用此协议的最短帧长。

3-21 什么叫作比特时间?使用这种时间单位有什么好处?100 比特时间是多少微秒?

3-22 假定在使用 CSMA/CD 协议的 10 Mbit/s 以太网中某个站在发送数据时检测到碰撞,执行退避算法时选择了随机数 r = 100。试问这个站需要等待多长时间后才能再次发送数据?如果是 100 Mbit/s 的以太网呢?

3-23 公式 (3-3) 表示,以太网的极限信道利用率与连接在以太网上的站点数无关。能否由此推论出:以太网的利用率也与连接在以太网上的站点数无关?请说明你的理由。

3-24 假定站点 A 和 B 在同一个 10 Mbit/s 以太网网段上。这两个站点之间的传播时延为 225 比特时间。现假定 A 开始发送一帧,并且在 A 发送结束之前 B 也发送一帧。如果 A 发送的是以太网所容许的最短的帧,那么 A 在检测到和 B 发生碰撞之前能否把自己的数据发送完毕?换言之,如果 A 在发送完毕之前并没有检测到碰撞,那么能否肯定 A 所发送的帧不会和 B 发送的帧发生碰撞?(提示:在计算时应当考虑到每一个以太网帧在发送到信道上时,在 MAC 帧前面还要增加若干字节的前同步码和帧定界符。)

3-25 上题中的站点 A 和 B 在 t = 0 时同时发送了数据帧。当 t = 225 比特时间,A 和 B 同时检测到发生了碰撞,并且在 \(t = 225 + 48 = 273\) 比特时间完成了干扰信号的传输。A 和 B 在 CSMA/CD 算法中选择不同的 r 值退避。假定 A 和 B 选择的随机数分别是 \(r_{A} = 0\)\(r_{B} = 1\) 。试问 A 和 B 各在什么时间开始重传其数据帧?A 重传的数据帧在什么时间到达 B?A 重传的数据会不会和 B 重传的数据再次发生碰撞?B 会不会在预定的重传时间停止发送数据?

3-26 以太网上只有两个站,它们同时发送数据,产生了碰撞。于是按截断二进制指数退避算法进行重传。重传次数记为 \(i, i = 1,2,3,\dots\) 。试计算第 1 次重传失败的概率、第 2 次重传失败的概率、第 3 次重传失败的概率,以及一个站成功发送数据之前的平均重传次数 \(I\)

3-27 有 10 个站连接到以太网上。试计算以下三种情况下每一个站所能得到的带宽。

(1) 10 个站都连接到一个 10 Mbit/s 以太网集线器;

(2) 10 个站都连接到一个 100 Mbit/s 以太网集线器;

(3) 10 个站都连接到一个 10 Mbit/s 以太网交换机。

3-28 10 Mbit/s 以太网升级到 100 Mbit/s、1 Gbit/s 和 10 Gbit/s 时,都需要解决哪些技术问题?为什么以太网能够在发展的过程中淘汰掉自己的竞争对手,并使自己的应用范围从局域网一直扩展到城域网和广域网?

3-29 以太网交换机有何特点?用它怎样组成虚拟局域网?

3-30 在图 3-30 中,某学院的以太网交换机有三个端口分别和学院三个系的以太网相连,另外三个端口分别和电子邮件服务器、万维网服务器以及一个连接互联网的路由器相连。图中的 A, B 和 C 都是 100 Mbit/s 以太网交换机。假定所有的链路的速率都是 100 Mbit/s,并且图中的 9 台主机中的任何一个都可以和任何一个服务器或主机通信。试计算这 9 台主机和两个服务器产生的总的吞吐量的最大值。为什么?

1a30436b9e32f7bac8b6f629a9c7d34206f5b27c45e00b41f8c22f84c1346e60.jpg

3-31 假定图 3-30 中的所有链路的速率仍然为 100 Mbit/s,但三个系的以太网交换机都换成为 100 Mbit/s 的集线器。试计算这 9 台主机和两个服务器产生的总的吞吐量的最大值。为什么?

3-32 假定图 3-30 中的所有链路的速率仍然为 100 Mbit/s,但所有的以太网交换机都换成为 100 Mbit/s 的集线器。试计算这 9 台主机和两个服务器产生的总的吞吐量的最大值。为什么?

3-33 在图 3-31 中,以太网交换机有 6 个端口,分别接到 5 台主机和一个路由器。

f1c711d3e7cf03b5db7e6ceddad67fbcf44a0513b7dd73dea4b551f5476fce0b.jpg

在下面表中的 “动作” 一栏中,表示先后发送了 4 个帧。假定在开始时,以太网交换机的交换表是空的。试把该表中其他的栏目都填写完。

动作交换表的状态向哪些端口转发帧说明
A 发送帧给 D
D 发送帧给 A
E 发送帧给 A
A 发送帧给 E