前言
数据链路层使用的信道主要有两种类型:
点对点信道
。这种信道使用一对一的点对点通信方式。广播信道
。这种信道使用一对多的广播通信方式,因此过程比较复杂。广播信道上连接的主机很多,因此必须使用专用的共享信道协议
来协调这些主机的数据发送。
我们研究的是在同一个局域网中,分组怎样从一台主机传送到另一台主机,但并不经过路由器转发。
两台主机通过互联网进行通信时数据链路层
所处的地位:
-
图(a)表示用户主机H1通过电话线上网,中间经过三个路由器(R1,R2 和 R3)连接到远程主机H2。所经过的网络可以是多种的,如电话网、局域网和广域网。
-
当主机 H1 向 H2 发送数据时,从协议的层次上看,数据的流动如图(b)所示。主机 H1 和 H2 都有完整的五层协议栈,但路由器在转发分组时使用的协议栈只有下面的三层(1)。
-
数据进入路由器后要先从物理层上到网络层,在转发表中找到下一地址后,再下到物理层转发出去。因此,数据从主机 H1 传送到主机 H2 需要在路径中的各结点的协议栈向上和向下流动多次,如图中的浅灰色箭头所示。
当我们专门研究数据链路层的问题时,在许多情况下我们可以只关心在协议栈中水平方向的各数据链路层。
一、使用点对点信道的数据链路层
1、数据链路和帧
“链路” 和 “数据链路” 并不是一回事:
链路
(link)就是从一个结点到相邻结点的一段物理线路(有线或无线),而中间没有任何其他的交换结点。在进行数据通信时,两台计算机之间的通信路径往往要经过许多段这样的链路。可见链路只是一条路径的组成部分。
数据链路
(data link)则是另一个概念。这是因为当需要在一条线路上传送数据时,除了必须有一条物理线路外,还必须有一些必要的通信协议
来控制这些数据的传输。若把实现这些协议的硬件和软件加到链路上,就构成了数据链路。现在最常用的方法是使用网络适配器
(网卡)(既有硬件,也包括软件)来实现这些协议。一般的适配器都包括了数据链路层和物理层这两层的功能。
也有人采用另外的术语。这就是把链路分为
物理链路
和逻辑链路
。物理链路就是上面所说的链路,而逻辑链路就是上面的数据链路,是物理链路加上必要的通信协议。
点对点信道的数据链路层的协议数据单元——帧
。
数据链路层 把 网络层 交下来的数据构成帧
发送到链路上,以及把接收到的帧中的数据取出并上交给网络层 。在互联网中,网络层协议数据单元就是IP数据报
(或简称为数据报
、分组
或包
)。
一个帧最多 1500 字节。
点对点信道的数据链路层在进行通信时的主要步骤如下:
- 结点A的数据链路层把网络层交下来的
IP数据报
添加首部和尾部封装成帧
。 - 结点A把封装好的帧发送给结点B的数据链路层。
- 若结点B的数据链路层收到的帧无差错,则从收到的帧中提取出
IP数据报
交给上面的网络层;否则丢弃这个帧。
2、三个基本问题
数据链路层协议有许多种,但有三个基本问题则是共同的。这三个基本问题是:封装成帧
、透明传输
和差错检测
。
2.1、封装成帧
- 封装成帧(
framing
)就是在一段数据的前后分别添加首部和尾部,这样就构成了一个帧。 - 接收端在收到物理层上交的比特流后,就能根据首部和尾部的标记,从收到的比特流中识别帧的开始和结束。
分组交换的一个重要概念就是:所有在互联网上传送的数据都以分组
(即IP数据报)为传送单位。网络层的 IP数据报 传送到数据链路层就成为帧
的数据部分
。在帧的数据部分的前面和后面分别添加上首部和尾部
,构成了一个完整的帧
。这样的帧就是数据链路层的数据传送单元。
- 一个帧的帧长等于帧的数据部分长度加上帧首部和帧尾部的长度。首部和尾部的一个重要作用就是进行帧定界(即确定帧的界限)。
- 首部和尾部还包括许多必要的控制信息。
- 在发送帧时,是从帧首部开始发送的。
- 各种数据链路层
协议
都对帧首部和帧尾部的格式有明确的规定。 - 每一种链路层协议都规定了所能传送的帧的数据部分长度上限——最大传送单元
MTU
(Maximum Transfer Unit)
当数据是由可打印的 ASCII 码组成的文本文件时,帧定界可以使用特殊的帧定界符
,即使用不可打印的 ASCII 码。
控制字符SOH
(Start Of Header)放在一帧的最前面,表示帧的首部开始。另一个控制字符EOT
(End Of Transmission)表示帧的结束。
SOH 和 EOT 都是控制字符的名称。它们的十六进制编码分别是
01
(二进制是00000001)和04
(二进制是00000100)。
当数据在传输中出现差错时,帧定界符的作用更加重要。假定发送端在尚未发送完一个帧时突然出故障,中断了发送。但随后很快又恢复正常,于是重新从头开始发送刚才未发送完的帧。由于使用了帧定界符,接收端就知道前面收到的数据是个不完整的帧(只有首部开始符SOH而没有传输结束符EOT),必须丢弃。而后面收到的数据有明确的帧定界符(SOH和EOT),因此这是一个完整的帧,应当收下。
2.2、透明传输
由于帧的开始和结束的标记使用专门指明的控制字符,因此,所传输的数据中的任何 8 比特的组合一定不允许和用作帧定界的控制字符的比特编码一样,否则就会出现帧定界的错误。
当传送的帧是用文本文件
组成的帧时(文本文件中的字符都是从键盘上输入的),其数据部分显然不会出现像 SOH 或 EOT 这样的帧定界控制字符。可见不管从键盘上输入什么字符都可以放在这样的帧中传输过去,因此这样的传输就是透明传输。
但当数据部分是非 ASCII 码
的文本文件时(如二进制代码的计算机程序或图像等),情况就不同了。如果数据中的某个字节的二进制代码恰好和SOH或EOT这种控制字符一样,数据链路层就会错误地“找到帧的边界”,把部分帧收下(误认为是个完整的帧),而把剩下的那部分数据丢弃(这部分找不到帧定界控制字符SOH)。
如图所示的帧的传输显然就不是 “透明传输” ,因为当遇到数据中碰巧出现字符 “EOT” 时就传不过去了。数据中的 “EOT” 将被接收端错误地解释为 “传输结束” 的控制字符,而在其后面的数据因找不到 “SOH” 被接收端当作无效帧而丢弃。但实际上在数据中出现的字符 “EOT” 并非控制字符而仅仅是二进制数据 00000100
。
“在数据链路层透明传送数据” 表示无论什么样的比特组合的数据,都能够按照原样没有差错地通过这个数据链路层。因此,对所传送的数据来说,这些数据就 “看不见” 数据链路层有什么妨碍数据传输的东西。或者说,数据链路层对这些数据来说是透明的。
具体的方法是:发送端的数据链路层在数据中出现控制字符 “SOH” 或 “EOT” 的前面插入一个转义字符“ESC”
(其十六进制编码是1B,二进制是00011011)。而在接收端的数据链路层在把数据送往网络层之前删除这个插入的转义字符。这种方法称为字节填充
(byte stuffing)或字符填充
(character stuffing)。
如果转义字符也出现在数据当中,那么解决方法仍然是在转义字符的前面插入一个转义字符。因此,当接收端收到连续的两个转义字符时,就删除其中前面的一个。
2.3、差错检测
现实的通信链路都不会是理想的。这就是说,比特在传输过程中可能会产生差错:1可能会变成0,而0也可能变成1。这就叫做比特差错
。比特差错是传输差错中的一种。
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率BER
(Bit ErrorRate)。
例如,误码率为10−10时,表示平均每传送1010个比特就会出现一个比特的差错。
误码率
与信噪比
有很大的关系。如果设法提高信噪比,就可以使误码率减小。
实际的通信链路并非是理想的,它不可能使误码率下降到零。因此,为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施
。目前在数据链路层广泛使用了循环冗余检验CRC
(Cyclic Redundancy Check)的检错技术。
栗子:
在发送端,先把数据划分为组,假定每组 k 个比特。现假定待传送的数据 M=101001(k=6)。CRC运算 就是在数据 M 的后面添加供差错检测用的 n 位冗余码,然后构成一个帧发送出去,一共发送(k+n)
位。在所要发送的数据后面增加 n 位的冗余码,虽然增大了数据传输的开销,但却可以进行差错检测。当传输可能出现差错时,付出这种代价往往是很值得的。
这 n 位冗余码
可用以下方法得出:
-
用二进制的
模2运算
进行 2n 乘 M 的运算(相当于左移),这相当于在M后面添加n个0。 -
得到的(k+n)位的数
除以
收发双方事先商定的长度为(n+1)位的除数P
,得出商是Q
而余数是R
(n位,比P少一位)。关于除数P下面介绍。
在图中的例子中,M=101001(即k=6)。假定除数P=1101(即n=3)。经模2除法运算后的结果是:商Q=110101(这个商并没有什么用处),而余数R=001。这个余数R就作为冗余码拼接在数据M的后面发送出去
。这种为了进行检错而添加的冗余码常称为帧检验序列FCS
(Frame Check Sequence)。因此加上FCS后发送的帧是101001001
(即 2n M+FCS),共有(k+n)位。
如果是 1 就商 1 ,是 0 就商 0 。
每一层是减法,运算规则特殊的地方: 0-1=1,其实就是异或运算
,异则1。
循环冗余检验 CRC 和帧检验序列 FCS 并不是同一个概念。CRC 是一种检错方法,而 FCS 是添加在数据后面的冗余码,在检错方法上可以选用 CRC ,但也可不选用 CRC 。
在接收端把接收到的数据以帧为单位进行CRC检验
:把收到的每一个帧都除以同样的除数P(模2运算),然后检查得到的余数R。
如果在传输过程中无差错,那么经过CRC检验后得出的余数R肯定是0(读可以自己验算一下。被除数现在是101001001,而除数是P=1101,看余数R是否为0)。
不仅能够检错还可以纠错:海明码。
在接收端对收到的每一帧经过CRC检验后,有以下两种情况:
- 若得出的余数
R=0
,则判定这个帧没有差错,就接受(accept)。 - 若余数
R≠0
,则判定这个帧有差错(但无法确定究竟是哪一位或哪几位出现了差错),就丢弃。
在数据链路层,发送端帧检验序列FCS
的生成和接收端的CRC检验
都是用硬件完成的,处理很迅速,因此并不会延误数据的传输。
如果我们在传送数据时不以帧为单位来传送,那么就无法加入冗余码以进行差错检验。因此,如果要在数据链路层进行差错检验,就必须把数据划分为帧,每一帧都加上冗余码,一帧接一帧地传送,然后在接收方逐帧进行差错检验。
我们现在并没有要求数据链路层向网络层提供“可靠传输”的服务。所谓“可靠传输”就是:数据链路层的发送端发送什么,在接收端就收到什么。
传输差错可分为两大类:一类就是前面所说的最基本的比特差错
,而另一类传输差错
则更复杂些,这就是收到的帧并没有出现比特差错,但却出现了帧丢失、帧重复或帧失序。
“无比特差错”与“无传输差错”并不是同样的概念。在数据链路层使用CRC检验,能够实现无比特差错的传输,但这还不是可靠传输。
过去OSI的观点是:必须让数据链路层向上提供可靠传输。因此在CRC检错的基础上,增加了帧编号
、确认
和重传
机制。收到正确的帧就要向发送端发送确认。发送端在一定的期限内若没有收到对方的确认,就认为出现了差错,因而就进行重传,直到收到对方的确认为止。这种方法在历史上曾经起到很好的作用。但现在的通信线路的质量已经大大提高了,由通信链路质量不好引起差错的概率已经大大降低。
现在互联网就采取了区别对待的方法:对于通信质量良好的有线传输链路,数据链路层协议不使用确认和重传机制,即不要求数据链路层向上提供可靠传输的服务。如果在数据链路层传输数据时出现了差错并且需要进行改正,那么改正差错的任务就由上层协议(例如,运输层的TCP协议)来完成。对于通信质量较差的无线传输链路,数据链路层协议使用确认和重传机制,数据链路层向上提供可靠传输的服务。实践证明,这样做可以提高通信效率。
二、点对点协议PPP
点对点协议PPP
(Point-to-Point Protocol)
1、PPP协议的特点
互联网用户通常都要连接到某个 ISP 才能接入到互联网。PPP 协议就是用户计算机和 ISP 进行通信时所使用的数据链路层协议。
PPP协议是IETF在1992年制定的。经过1993年和1994年的修订,现在的PPP协议在1994年就已成为互联网的正式标准。
1.1、PPP协议应满足的需求
- 简单
- 封装成帧:PPP 协议必须规定特殊的字符作为帧定界符。
- 透明性:PPP 协议必须保证数据传输的透明性。
- 多种网络层协议
- 多种类型链路:这里特别要提到的是在 1999 年公布的在 以太网 上运行的 PPP,即
PPP over Ethernet
,简称为PPPoE
。 - 差错检测:PPP协议必须能够对接收端收到的帧进行检测,并立即丢弃有差错的帧。
- 检测连接状态
- 最大传送单元:MTU
- 网络层地址协商
- 数据压缩协商
在 TCP/IP 协议族中,可靠传输由运输层的 TCP 协议负责,因此数据链路层的 PPP 协议不需要进行纠错,不需要设置序号,也不需要进行流量控制。PPP 协议不支持多点线路(即一个主站轮流和链路上的多个从站进行通信),而只支持点对点的链路通信。此外,PPP 协议只支持全双工链路。
1.2、PPP协议的组成
PPP协议有三个组成部分:
- 一个将 IP 数据报封装到串行链路的方法。PPP 既支持异步链路(无奇偶检验的8比特数据),也支持面向比特的同步链路。IP数据报 在 PPP 帧中就是其信息部分。这个信息部分的长度受最大传送单元 MTU 的限制。
- 一个用来建立、配置和测试数据链路连接的链路控制协议
LCP
(Link Control Protocol)。通信的双方可协商一些选项。在RFC 1661中定义了11种类型的LCP分组。 - 一套网络控制协议
NCP
(Network Control Protocol),其中的每一个协议支持不同的网络层协议,如 IP、OSI 的网络层、DECnet,以及 AppleTalk 等。(从 ISP 获取一个 ip 地址)
2、PPP协议的帧格式
2.1、各字段的意义
PPP 帧的首部和尾部分别为四个字段和两个字段。
首部的第一个字段和尾部的第二个字段都是标志字段F
(Flag),规定为 0x7E(符号“0x”表示它后面的字符是用十六进制表示的。十六进制的7E的二进制表示是01111110)。标志字段表示一个帧的开始或结束。因此标志字段就是 PPP帧的定界符
。连续两帧之间只需要用一个标志字段。如果出现连续两个标志字段,就表示这是一个空帧,应当丢弃。
首部中的地址字段 A
规定为0xFF(即11111111),控制字段C
规定为0x03(即00000011)。最初曾考虑以后再对这两个字段的值进行其他定义,但至今也没有给出。可见这两个字段实际上并没有携带PPP帧的信息。
PPP首部的第四个字段是2字节的协议字段
。当协议字段为0x0021时,PPP帧的信息字段就是IP数据报。若为0xC021,则信息字段是PPP链路控制协议 LCP 的数据,而0x8021表示这是网络层的控制数据。
信息字段的长度是可变的,不超过1500字节
。
尾部中的第一个字段(2字节)是使用CRC
的帧检验序列FCS
。
2.2、字节填充
当信息字段中出现和标志字段一样的比特(0x7E
)组合时,就必须采取一些措施使这种形式上和标志字段一样的比特组合不出现在信息字段中。
当PPP使用异步传输时,它把转义符定义为0x7D
(即01111101),并使用字节填充:
RFC 1662规定了如下所述的填充方法:
- 把信息字段中出现的每一个 0x7E 字节转变成为2字节序列(0x7D,0x5E)。
- 若信息字段中出现一个
0x7D
的字节(即出现了和转义字符一样的比特组合),则把0x7D
转变成为2字节序列(0x7D,0x5D)。 - 若信息字段中出现 ASCII 码的控制字符(即数值小于0x20的字符),则在该字符前面要加入一个
0x7D
字节,同时将该字符的编码加以改变。例如,出现0x03(在控制字符中是“传输结束”ETX)就要把它转变为2字节序列(0x7D,0x23)。
由于在发送端进行了字节填充,因此在链路上传送的信息字节数就超过了原来的信息字节数。但接收端在收到数据后再进行与发送端字节填充相反的变换,就可以正确地恢复出原来的信息。
2.3、零比特填充
PPP协议用在SONET/SDH链路时,使用同步传输(一连串的比特连续传送)而不是异步传输(逐个字符地传送)。在这种情况下,PPP协议采用零比特填充方法来实现透明传输。
零比特填充的具体做法是:
- 在发送端,先扫描整个信息字段(通常用硬件实现,但也可用软件实现,只是会慢些)。只要发现有5个连续1,则立即填入一个0。
- 因此经过这种零比特填充后的数据,就可以保证在信息字段中不会出现6个连续1。
- 接收端在收到一个帧时,先找到标志字段F以确定一个帧的边界,接着再用硬件对其中的比特流进行扫描。每当发现5个连续1时,就把这5个连续1后的一个0删除,以还原成原来的信息比特流。
3、PPP协议的工作状态
知道了 PPP 帧是怎样组成的了之后,那么 PPP 链路一开始是怎样被初始化的?
- 当用户拨号接入
ISP
后,就建立了一条从用户个人电脑到 ISP 的物理连接
。 - 这时,用户个人电脑向 ISP 发送一系列的链路控制协议
LCP
分组(封装成多个 PPP 帧),以便建立LCP
连接。这些分组及其响应选择了将要使用的一些 PPP 参数。 - 接着还要进行网络层配置,网络控制协议
NCP
给新接入的用户个人电脑分配一个临时的 IP 地址。这样,用户个人电脑就成为互联网上的一个有IP地址的主机了。 - 当用户通信完毕时,
NCP
释放网络层连接,收回原来分配出去的IP地址。接着,LCP
释放数据链路层连接。最后释放的是物理层的连接。
PPP 链路的起始和终止状态永远是图中的 “链路静止
”(Link Dead)状态,这时在用户个人电脑和 ISP 的路由器之间并不存在物理层的连接。
当用户个人电脑通过 调制解调器
呼叫 路由器
时(通常是在屏幕上用鼠标点击一个连接按钮),路由器就能够检测到 调制解调器 发出的载波信号。在双方建立了物理层连接后,PPP 就进入 “链路建立” (Link Establish)状态,其目的是建立链路层的LCP连接。
这时LCP
开始协商一些配置选项,即发送 LCP 的配置请求帧
(ConfigureRequest)。这是个 PPP 帧,其协议字段置为 LCP 对应的代码,而信息字段包含特定的配置请求。链路的另一端可以发送以下几种响应中的一种:
- 配置确认帧(Configure-Ack) 所有选项都接受。
- 配置否认帧(Configure-Nak) 所有选项都理解但不能接受。
- 配置拒绝帧(Configure-Reject) 选项有的无法识别或不能接受,需要协商。
LCP配置选项包括链路上的最大帧长、所使用的鉴别协议(authentication protocol)的规约(如果有的话),以及不使用 PPP 帧中的地址和控制字段(因为这两个字段的值是固定的,没有任何信息量,可以在PPP帧的首部中省略这两个字节)。
协商结束后双方就建立了 LCP 链路,接着就进入 “鉴别”(Authenticate)状态。在这一状态,只允许传送 LCP 协议的分组、鉴别协议的分组以及监测链路质量的分组。
-
若使用口令鉴别协议 PAP(Password Authentication Protocol),则需要发起通信的一方发送身份标识符和口令。系统可允许用户重试若干次。
-
如果需要有更好的安全性,则可使用更加复杂的口令握手鉴别协议CHAP(ChallengeHandshakeAuthentication Protocol)。若鉴别身份失败,则转到“链路终止”(Link Terminate)状态。若鉴别成功,则进入“网络层协议”(NetworkLayer Protocol)状态。
在“网络层协议”状态,PPP 链路的两端的网络控制协议 NCP 根据网络层的不同协议互相交换网络层特定的网络控制分组。PPP 协议两端的网络层可以运行不同的网络层协议,但仍然可使用同一个 PPP 协议进行通信。
如果在 PPP 链路上运行的是 IP 协议,则对 PPP 链路的每一端配置 IP 协议模块(如分配 IP 地址)时就要使用 NCP 中支持 IP 的协议——IP控制协议IPCP
(IP ControlProtocol)。IPCP 分组也封装成 PPP 帧(其中的协议字段为0x8021
)在 PPP 链路上传送。在低速链路上运行时,双方还可以协商使用压缩的 TCP 和 IP 首部,以减少在链路上发送的比特数。
当网络层配置完毕后,链路就进入可进行数据通信的“链路打开”(LinkOpen)状态。链路的两个PPP端点可以彼此向对方发送分组。
数据传输结束后,可以由链路的一端发出终止请求LCP分组(TerminateRequest)请求终止链路连接,在收到对方发来的终止确认LCP分组(Terminate-Ack)后,转到“链路终止”状态。
三、使用广播信道的数据链路层
局域网可按网络拓扑进行分类。图(a)是星形网。由于集线器(hub)的出现和双绞线大量用于局域网中,星形以太网以及多级星形结构的以太网获得了非常广泛的应用。图b)是环形网,图(c)为总线网,各站直接连在总线上。总线两端的匹配电阻吸收在总线上传播的电磁波信号的能量,避免在总线上产生有害的电磁波反射。总线网以传统以太网最为著名。
局域网可使用多种传输媒体。双绞线
最便宜,原来只用于低速(1~2Mbit/s)基带局域网。现在从 10Mbit/s 至 10Gbit/s 的局域网都可使用双绞线。双绞线已成为局域网中的主流传输媒体。当数据率很高时,往往需要使用光纤
作为传输媒体。
共享信道要着重考虑的一个问题就是如何使众多用户能够合理而方便地共享通信媒体资源。有两种方法:
- 静态划分信道:频分复用、时分复用、波分复用和码分复用等都属于这一种。用户只要分配到了信道就不会和其他用户发生冲突。但这种划分信道的方法代价较高,不适合于局域网使用。
- 动态媒体接入控制:它又称为多点接入(multiple access),其特点是信道并非在用户通信时固定分配给用户。它又分为两种:
- 随机接入:随机接入的特点是所有的用户可随机地发送信息。但如果恰巧有两个或更多的用户在同一时刻发送信息,那么在共享媒体上就要产生碰撞(即发生了冲突),使得这些用户的发送都失败。因此,必须有解决碰撞的网络协议。
- 受控接入 :受控接入的特点是用户不能随机地发送信息而必须服从一定的控制。这类的典型代表有分散控制的令牌环局域网和集中控制的多点线路探询(polling),或称为
轮询
。
我们重点学习随机接入。
1、以太网的两个标准
1980 年 9 月,DEC 公司、英特尔(Intel)公司和施乐公司联合提出了10Mbit/s以太网规约的第一个版本 DIX V1( DIX 是这三个公司名称的缩写)。1982 年又修改为第二版规约(实际上也就是最后的版本),即 DIX Ethernet V2
,成为世界上第一个局域网产品的规约。
在此基础上,IEEE 802 委员会的 802.3 工作组于 1983 年制定了第一个IEEE的以太网标准 IEEE 802.3
[W-IEEE802.3],数据率为 10Mbit/s。
为了使数据链路层能更好地适应多种局域网标准,IEEE 802 委员会就把局域网的数据链路层拆成两个子层,即逻辑链路控制 LLC
(Logical Link Control)子层和媒体接入控制 MAC
(Medium AccessControl)子层。与接入到传输媒体有关的内容都放在 MAC 子层,而 LLC 子层则与传输媒体无关,不管采用何种传输媒体和 MAC 子层的局域网对 LLC 子层来说都是透明的。
以太网在局域网市场中已取得了垄断地位,并且几乎成为了局域网的代名词。由于互联网发展很快而TCP/IP 体系经常使用的局域网只剩下 DIX Ethernet V2 而不是 IEEE 802.3 标准中的局域网,因此现在 IEEE 802 委员会制定的逻辑链路控制子层LLC(即IEEE802.2标准)的作用已经消失了,很多厂商生产的适配器上就仅装有MAC
协议而没有LLC协议。
2、适配器的作用
首先我们来看一下计算机是怎么连接到局域网上的:
计算机与外界局域网的连接是通过通信适配器(adapter
)进行的。适配器本来是在主机箱内插入的一块网络接口板(或者是在笔记本电脑中插入一块 PCMCIA 卡——个人计算机存储器卡接口适配器)。这种接口板又称为网络接口卡 NIC(Network Interface Card)或简称为“网卡”。在这种通信适配器上面装有处理器和存储器(包括 RAM 和 ROM )。适配器和局域网之间的通信是通过电缆或双绞线以串行传输方式
进行的,而适配器和计算机之间的通信则是通过计算机主板上的 I/O 总线以并行传输方式
进行的。因此,适配器的一个重要功能就是要进行数据串行传输和并行传输的转换。
由于网络上的数据率和计算机总线上的数据率并不相同,因此在适配器中必须装有对数据进行缓存的存储芯片。在主板上插入适配器时,还必须把管理该适配器的设备驱动程序安装在计算机的操作系统中。这个驱动程序以后就会告诉适配器,应当从存储器的什么位置上把多长的数据块发送到局域网,或者应当在存储器的什么位置上把局域网传送过来的数据块存储下来。适配器还要能够实现以太网协议。
适配器在接收和发送各种帧时,不使用计算机的 CPU 。这时计算机中的 CPU 可以处理其他任务。当适配器收到有差错的帧时,就把这个帧直接丢弃而不必通知计算机。当适配器收到正确的帧时,它就使用中断来通知该计算机,并交付协议栈中的网络层。当计算机要发送 IP 数据报时,就由协议栈把 IP 数据报向下交给适配器,组装成帧后发送到局域网。
计算机的硬件地址就在适配器的ROM中,而计算机的软件地址——IP地址则在计算机的存储器中。
3、CSMA/CD协议
最早的以太网是将许多计算机都连接到一根总线上。总线的特点是:当一台计算机发送数据时,总线上的所有计算机都能检测到这个数据。这种就是广播通信方式。但我们并不总是要在局域网上进行一对多的广播通信。为了在总线上实现一对一的通信,可以使每一台计算机的适配器拥有一个与其他适配器都不同的地址。在发送数据帧时,在帧的首部写明接收站的地址。
为了通信的方便,以太网采取了以下措施:
第一,采用较为灵活的无连接的工作方式,即不必先建立连接就可以直接发送数据。适配器对发送的数据帧不进行编号,也不要求对方发回确认。因此,以太网提供的服务是尽最大努力的交付,即不可靠的交付。当目的站收到有差错的数据帧时(例如,用CRC查出有差错),就把帧丢弃,其他什么也不做。对有差错帧是否需要重传则由高层来决定。例如,如果高层使用 TCP 协议,那么 TCP 就会发现丢失了一些数据。于是经过一定的时间后,TCP 就把这些数据重新传递给以太网进行重传。但以太网并不知道这是重传帧,而是当作新的数据帧来发送。总线上只要有一台计算机在发送数据,总线的传输资源就被占用。因此,在同一时间只能允许一台计算机发送数据,否则各计算机之间就会互相干扰,使得所发送数据被破坏。因此,如何协调总线上各计算机的工作就是以太网要解决的一个重要问题。
以太网采用最简单的随机接入
,但有很好的协议用来减少冲突发生的概率。
有一屋子的人在开讨论会,没有会议主持人控制发言。想发言的随时可发言,不需要举手示意。但我们还必须有个协议来协调大家的发言。这就是:如果你听见有人在发言,那么你就必须等别人讲完了才能发言(否则就干扰了别人的发言)。但有时碰巧两个或更多的人同时发言了,那么一旦发现冲突,大家都必须立即停止发言,等听到没有人发言了你再发言。
以太网采用的协调方法和上面的办法非常像,它使用的协议是CSMA/CD
,意思是载波监听多点接入/碰撞检测( Carrier Sense Multiple Access with Collision Detection )。
第二,以太网发送的数据都使用曼彻斯特
(Manchester)编码的信号。二进制基带数字信号通常就是高、低电压交替出现的信号。使用这种信号的最大问题就是当出现一长串的连 1 或连 0 时,接收端就无法从收到的比特流中提取位同步(即比特同步)信号。曼彻斯特编码的编码方法是把每一个码元再分成两个相等的间隔。
码元1是前一个间隔为低电压而后一个间隔为高电压。码元0则正好相反,从高电压变到低电压(也可采用相反的约定,即1是“前高后低”而0是“前低后高”)。
这样就保证了在每一个码元的正中间出现一次电压的转换,而接收端就利用这种电压的转换很方便地把位同步信号提取出来。但是从曼彻斯特编码的波形图也不难看出其缺点,这就是它所占的频带宽度比原始的基带信号增加了一倍(因为每秒传送的码元数加倍了)。
简记为:
曼切斯特编码为:中间向下跳变为 1 ,中间向上跳变为 0。
差分曼切斯特编码为:起始位置有跳变为 0,没有跳变为 1。
下面介绍:CSMA/CD
载波监听多点接入/碰撞检测。
1、多点接入:
“多点接入”就是说明这是总线型网络,许多计算机以多点接入的方式连接在一根总线上。协议的实质是“载波监听”和“碰撞检测”。
2、载波监听:
“载波监听” 就是用电子技术检测总线上有没有其他计算机也在发送。其实总线上并没有什么“载波”,这里只不过借用一下 “载波” 这个名词而已。因此载波监听就是检测信道,这是个很重要的措施。不管在发送前,还是在发送中,每个站都必须不停地检测信道。
3、碰撞检测:
“碰撞检测” 也就是 “边发送边监听” ,即适配器边发送数据边检测信道上的信号电压的变化情况,以便判断自己在发送数据时其他站是否也在发送数据。当几个站同时在总线上发送数据时,总线上的信号电压变化幅度将会增大(互相叠加)。当适配器检测到的信号电压变化幅度超过一定的门限值时,就认为总线上至少有两个站同时在发送数据,表明产生了碰撞。所谓 “碰撞” 就是发生了冲突。因此 “碰撞检测” 也称为 “冲突检测” 。
任何一个正在发送数据的站,一旦发现总线上出现了碰撞,其适配器就要立即停止发送,免得继续进行无效的发送,白白浪费网络资源,然后等待一段随机时间后再次发送。
电磁波在 1km 电缆的传播时延约为 5µs
。因此,A 向 B 发出的数据,在约 5µs 后才能传送到 B 。换言之,B 若在 A 发送的数据到达 B 之前发送自己的帧(因为这时 B 的载波监听检测不到 A 所发送的信息),则必然要在某个时间和 A 发送的帧发生碰撞。碰撞的结果是两个帧都变得无用。在局域网的分析中,常把总线上的单程端到端传播时延记为τ
。
使用CSMA/CD
协议的以太网不可能进行全双工通信而只能进行双向交替通信(半双工通信)。
下面是图中的一些重要的时刻:
- 在t=
0
时,A 发送数据。B 检测到信道为空闲。 - 在t=
τ−δ
时(这里τ>δ>0
),A 发送的数据还没有到达 B 时,由于 B 检测到信道是空闲的,因此 B 发送数据。 - 经过时间
δ/2
后,即在t=τ−δ/2
时,A 发送的数据和 B 发送的数据发生了碰撞。但这时 A 和 B 都不知道发生了碰撞。 - 在t=
τ
时,B 检测到发生了碰撞,于是停止发送数据。 - 在t=
2τ−δ
时,A 也检测到发生了碰撞,因而也停止发送数据。 - A 和 B 发送数据均失败,它们都要推迟一段时间再重新发送。
以太网不能保证某一时间之内一定能够把自己的数据帧成功地发送出去(因为存在产生碰撞的可能)。以太网的这一特点称为发送的不确定性。如果希望在以太网上发生碰撞的机会很小,必须使整个以太网的平均通信量远小于以太网的最高数据率。
最先发送数据帧的 A 站,在发送数据帧后至多经过时间2τ
就可知道所发送的数据帧是否遭受了碰撞。这就是δ→0
的情况。因此以太网的端到端往返时间2τ
称为争用期(contention period),它是一个很重要的参数。争用期又称为碰撞窗口(collision window)。这是因为一个站在发送完数据后,只有通过争用期的“考验”,即经过争用期这段时间还没有检测到碰撞,才能肯定这次发送不会发生碰撞。这时,就可以放心把这一帧数据顺利发送完毕。
就好像一辆火车一样,如果火车头没有和对面来的火车相撞的话,那么无论这个火车有多长他都能安全的通过,因为对面会不断的进行信道检测,检测到有火车他是不会发车的。
以太网使用截断二进制指数退避(truncated binary exponential backoff)算法来确定碰撞后重传的时机。这种算法让发生碰撞的站在停止发送数据后,不是等待信道变为空闲后就立即再发送数据,而是推迟(这叫做退避)一个随机的时间。这点很容易理解,因为如果几个发生碰撞的站都在监听信道,那么都会同时发现信道变成了空闲。如果大家都同时再重新发送,那么肯定又会发生碰撞。
1、协议规定了基本退避时间为争用期2τ
,具体的争用期时间是 51.2µs。对于 10Mbit/s 以太网,在争用期内可发送 512bit ,即 64 字节。也可以说争用期是 512比特时间。1 比特时间就是发送 1 比特所需的时间。争用期是512bit,即争用期是发送512bit所需的时间。
2、从离散的整数集合[0,1,…,(2k−1)]中随机取出一个数,记为r
。重传应推后的时间就是 r 倍的争用期。上面的参数k
按下面的公式计算:
当重传次数不超过 10 时,参数 k 等于重传次数;但当重传次数超过10时,k 就不再增大而一直等于 10 。
3、当重传达 16 次仍不能成功时(这表明同时打算发送数据的站太多,以致连续发生冲突),则丢弃该帧,并向高层报告。
- 在第1次重传时,k=1,随机数r从整数{0,1}中选一个数。因此重传的站可选择的重传推迟时间是0或
2τ
,在这两个时间中随机选择一个。 - 若再发生碰撞,则在第2次重传时,k=2,随机数r就从整数{0,1,2,3}中选一个数。因此重传推迟的时间是在0,
2τ
,4τ
和6τ
这4个时间中随机地选取一个。 - 同样,若再发生碰撞,则重传时 k=3,随机数r就从整数{0,1,2,3,4,5,6,7}中选一个数。依此类推。
若连续多次发生冲突,就表明可能有较多的站参与争用信道。但使用上述退避算法可使重传需要推迟的平均时间随重传次数而增大(这也称为动态退避),因而减小发生碰撞的概率,有利于整个系统的稳定。
设想一种情况:某个站发送了一个很短的帧,但在发送完毕之前并没有检测出碰撞。假定这个帧在继续向前传播到达目的站之前和别的站发送的帧发生了碰撞,因而目的站将收到有差错的帧(当然会把它丢弃)。可是发送站却不知道这个帧发生了碰撞,因而不会重传这个帧。这种情况显然是我们所不希望的。为了避免发生这种情况,以太网规定了一个最短帧长 64 字节,即512bit
。如果要发送的数据非常少,那么必须加入一些填充字节,使帧长不小于 64 字节。对于 10Mbit/s 以太网,发送 512bit 的时间需要 51.2µs ,也就是上面提到的争用期。
信号在以太网上传播 1km 大约需要 5µs 。以太网上最大的端到端时延必须小于争用期的一半(即 25.6µs ),这相当于以太网的最大端到端长度约为 5km 。实际上的以太网覆盖范围远远没有这样大。因此,实用的以太网都能在争用期 51.2µs 内检测到可能发生的碰撞。
下面介绍强化碰撞
的概念。这就是当发送数据的站一旦发现发生了碰撞时,除了立即停止发送数据外,还要再继续发送 32 比特或 48 比特的人为干扰信号
(jamming signal),以便让所有用户都知道现在已经发生了碰撞。
A 站从发送数据开始到发现碰撞并停止发送的时间间隔是 TB 。A 站得知碰撞已经发生时所发送的强化碰撞的干扰信号的持续时间是 TJ 。图中的B站在得知发生碰撞后,也要发送人为干扰信号,但为简单起见,图中没有画出 B 站所发送的人为干扰信号。发生碰撞使 A 浪费时间 TB+TJ。可是整个信道被占用的时间还要增加一个单程端到端的传播时延 t 。因此总线被占用的时间是 TB+TJ+τ
。
以太网还规定了帧间最小间隔为9.6µs,相当于96比特时间。这样做是为了使刚刚收到数据帧的站的接收缓存来得及清理。
CSMA/CD
协议的要点归纳:
- 准备发送: 适配器从网络层获得一个分组,加上以太网的首部和尾部,组成以太网帧,放入适配器的缓存中。但在发送之前,必须先检测信道。
- 检测信道: 若检测到信道忙,则应不停地检测,一直等待信道转为空闲。若检测到信道空闲,并在 96 比特时间内信道保持空闲(保证了帧间最小间隔),就发送这个帧。
- 在发送过程中仍不停地检测信道,即网络适配器要边发送边监听。这里只有两种可能性:
- ①发送成功:在争用期内一直未检测到碰撞。这个帧肯定能够发送成功。发送完毕后,其他什么也不做。然后回到(1)。
- ②发送失败:在争用期内检测到碰撞。这时立即停止发送数据,并按规定发送人为干扰信号。适配器接着就执行指数退避算法,等待
r
倍512比特时间后,返回到步骤(2),继续检测信道。但若重传达 16 次仍不能成功,则停止重传而向上报错。
以太网每发送完一帧,一定要把已发送的帧暂时保留一下。如果在争用期内检测出发生了碰撞,那么还要在推迟一段时间后再把这个暂时保留的帧重传一次。
4、使用集线器的星形拓扑
传统以太网最初是使用粗同轴电缆,后来演进到使用比较便宜的细同轴电缆,最后发展为使用更便宜和更灵活的双绞线。由于使用双绞线电缆的以太网价格便宜和使用方便,因粗缆和细缆以太网现在都已成为历史,并已从市场上消失了。
1990 年 IEEE 制定出星形以太网
10BASE-T
的标准 802.3i。“10” 代表 10Mbit/s 的数据率,BASE 表示连接线上的信号是基带信号,T 代表双绞线。
这种以太网采用星形拓扑
,在星形的中心则增加了一种可靠性非常高的设备,叫做集线器
(hub),如图所示。双绞线以太网总是和集线器配合使用的。每个站需要用两对无屏蔽双绞线(放在一根电缆内),分别用于发送和接收。双绞线的两端使用RJ-45
插头。由于集线器使用了大规模集成电路芯片,因此集线器的可靠性就大大提高了。
集线器的特点:
- 从表面上看,使用集线器的局域网在物理上是一个星形网,但由于集线器使用电子器件来模拟实际电缆线的工作,因此整个系统仍像一个传统以太网那样运行。也就是说,使用集线器的以太网在逻辑上仍是一个总线网,各站共享逻辑上的总线,使用的还是
CSMA/CD
协议(更具体些说,是各站中的适配器执行CSMA/CD
协议)。网络中的各站必须竞争对传输媒体的控制,并且在同一时刻至多只允许一个站发送数据。 - 一个集线器有许多接口,例如 8 至 16 个,每个接口通过
RJ-45
插头(与电话机使用的插头RJ-11
相似,但略大一些)用两对双绞线与一台计算机上的适配器相连(这种插座可连接 4 对双绞线,实际上只用2对,即发送和接收各使用一对双绞线)。因此,一个集线器很像一个多接口的转发器。 - 集线器工作在物理层,它的每个接口仅仅简单地转发比特——收到 1 就转发 1 ,收到 0 就转发 0 ,不进行碰撞检测。若两个接口同时有信号输入(即发生碰撞),那么所有的接口都将收不到正确的帧。图中是具有三个接口的集线器的示意图。
- 集线器采用了专门的芯片,进行自适应串音回波抵消。这样就可使接口转发出去的较强信号不致对该接口接收到的较弱信号产生干扰(这种干扰即近端串音)。每个比特在转发之前还要进行再生整形并重新定时。
IEEE 802.3 标准还可使用光纤作为传输媒体,相应的标准是 10BASE-F
系列, F 代表光纤。它主要用作集线器之间的远程连接。
5、以太网的信道利用率
假定一个 10Mbit/s 以太网同时有 10 个站在工作,那么每一个站所能发送数据的平均速率似乎应当是总数据率的 1/10(即1Mbit/s)。其实不然,因为多个站在以太网上同时工作就可能会发生碰撞。当发生碰撞时,信道资源实际上是被浪费了。因此,当扣除碰撞所造成的信道损失后,以太网总的信道利用率并不能达到 100% 。
图中的例子是以太网的信道被占用的情况。一个站在发送帧时出现了碰撞。经过一个争用期2τ
后(τ
是以太网单程端到端传播时延),可能又出现了碰撞。这样经过若干个争用期后,一个站发送成功了。假定发送帧需要的时间是T0
。它等于帧长(bit)除以发送速率(10Mbit/s)。
可以看到成功发送一个帧需要占用信道的时间是T0+τ
,比这个帧的发送时间要多一个单程端到端时延τ。这是因为当一个站发送完最后一个比特时,这个比特还要在以太网上传播。在最极端的情况下,发送站在传输媒体的一端,而比特在媒体上传输到另一端所需的时间是τ
。因此,必须在经过时间T0+τ
后以太网的媒体才完全进入空闲状态,才能允许其他站发送数据。
要提高以太网的信道利用率,就必须减小τ
与 T0 之比。在以太网中定义了参数a
,它是以太网单程端到端时延τ
与帧的发送时间 T0 之比:
当a→0
时,表示只要一发生碰撞,就立即可以检测出来,并立即停止发送,因而信道资源被浪费的时间非常非常少。反之,参数 a 越大,表明争用期所占的比例越大,这就使得每发生一次碰撞就浪费了不少的信道资源,使得信道利用率明显降低。因此,以太网的参数 a 的值应当尽可能小些。
当数据率一定时,以太网的连线的长度受到限制(否则τ
的数值会太大),同时以太网的帧长不能太短(否则T0
的值会太小,使 a 值太大)。
现在考虑一种理想化的情况。假定以太网上的各站发送数据都不会产生碰撞(这显然已经不是CSMA/CD,而是需要使用一种特殊的调度方法),并且能够非常有效地利用网络的传输资源,即总线一旦空闲就有某一个站立即发送数据。这样,发送一帧占用线路的时间是 T0+τ
,而帧本身的发送时间是 T0 。于是我们可计算出极限信道利用率 Smax 为:
意义是:虽然实际的以太网不可能有这样高的极限信道利用率,但式中指出了只有当参数 a 远小于 1 才能得到尽可能高的极限信道利用率。反之,若参数 a 远大于 1 (即每发生一次碰撞,就要浪费相对较多的传输数据的时间),则极限信道利用率就远小于 1 ,而这时实际的信道利用率就更小了。据统计,当以太网的利用率达到 30% 时就已经处于重载的情况。很多的网络容量被网上的碰撞消耗掉了。
6、以太网的 MAC 层
6.1、MAC层的硬件地址
在局域网中,硬件地址又称为物理地址或MAC地址(因为这种地址用在MAC帧中)。
“名字指出我们所要寻找的那个资源,地址指出那个资源在何处,路由告诉我们如何到达该处。”
IEEE 802 标准为局域网规定了一种 48 位的全球地址(一般都简称为“地址”),是指局域网上的每一台计算机中固化在适配器的 ROM 中的地址。
- 假定连接在局域网上的一台计算机的适配器坏了而我们更换了一个新的适配器,那么这台计算机的局域网的“地址”也就改变了,虽然这台计算机的地理位置一点也没有变化,所接入的局域网也没有任何改变。
- 假定我们把位于南京的某局域网上的一台笔记本电脑携带到北京,并连接在北京的某局域网上。虽然这台电脑的地理位置改变了,但只要电脑中的适配器不变,那么该电脑在北京的局域网中的“地址”仍然和它在南京的局域网中的“地址”一样。
严格地讲,局域网的“地址”应当是每一个站的“名字”或标识符。
现在IEEE的注册管理机构RA
(Registration Authority)是局域网全球地址的法定管理机构,它负责分配地址字段的 6 个字节中的前三个字节(即高位 24 位)。世界上凡要生产局域网适配器的厂家都必须向 IEEE 购买由这三个字节构成的这个号(即地址块),这个号的正式名称是组织唯一标识符OUI
(Organizationally Unique Identifier),通常也叫做公司标识符(company_id)。
每一字节的最低位写在最左边(最左边的最低位是第一位)
IEEE规定地址字段的第一字节的最低位为 I/G 位。 I/G 表示 Individual/Group
。当 I/G 位为 0 时,地址字段表示一个单个站地址。当I/G
位为 1 时表示组地址,用来进行多播
(以前曾译为组播)。因此,IEEE 只分配地址字段前三个字节中的 23 位。当 I/G 位分别为 0 和 1 时,一个地址块可分别生成 224 个单个站地址和 224 个组地址。
IEEE 还考虑到可能有人并不愿意向 IEEE 的 RA 购买 OUI 。为此,IEEE 把地址字段第 1 字节的最低第二位规定为 G/L
位,表示 Global/Local
。当 G/L 位为 0 时是全球管理(保证在全球没有相同的地址),厂商向 IEEE 购买的 OUI 都属于全球管理。当地址字段的 G/L 位为 1 时是本地管理,这时用户可任意分配网络上的地址。采用 2 字节地址字段时全都是本地管理。但应当指出,以太网几乎不理会这个 G/L 位。
这样,在全球管理时,对每一个站的地址可用 46 位的二进制数字来表示(最低位和最低第 2 位均为 0 时)。剩下的 46 位组成的地址空间可以有 246 个地址,已经超过 70 万亿个,可保证世界上的每一个适配器都可有一个唯一的地址。当然,非无限大的地址空间总有用完的时候。
当路由器通过适配器连接到局域网时,适配器上的硬件地址就用来标志路由器的某个接口。路由器如果同时连接到两个网络上,那么它就需要两个适配器和两个硬件地址。
我们知道适配器有过滤功能。但适配器从网络上每收到一个MAC帧就先用硬件检查MAC帧中的目的地址。如果是发往本站的帧则收下,然后再进行其他的处理。否则就将此帧丢弃,不再进行其他的处理。这样做就不浪费主机的处理机和内存资源。
这里“发往本站的帧”包括以下三种帧:
- 单播(unicast)帧(一对一),即收到的帧的 MAC 地址与本站的硬件地址相同。
- 广播(broadcast)帧(一对全体),即发送给本局域网上所有站点的帧(全 1 地址)。
- 多播(multicast)帧(一对多),即发送给本局域网上一部分站点的帧。
所有的适配器都至少应当能够识别前两种帧,即能够识别单播和广播地址。有的适配器可用编程方法识别多播地址。当操作系统启动时,它就把适配器初始化,使适配器能够识别某些多播地址。显然,只有目的地址才能使用广播地址和多播地址。
6.2、MAC帧的格式
常用的以太网 MAC 帧格式有两种标准,一种是 DIX Ethernet V2 标准(即以太网 V2 标准),另一种是 IEEE 的 802.3 标准。这里只介绍使用得最多的以太网 V2 的 MAC 帧格式:
以太网 V2 的 MAC 帧较为简单,由五个字段组成。前两个字段分别为 6 字节长的目的地址和源地址字段。第三个字段是 2 字节的类型字段,用来标志上一层使用的是什么协议,以便把收到的 MAC 帧的数据上交给上一层的这个协议。
当类型字段的值是 0x0800 时,就表示上层使用的是 IP数据报。若类型字段的值为 0x8137,则表示该帧是由 Novell IPX 发过来的。
第四个字段是数据字段,其长度在 46 到 1500 字节之间( 46 字节是这样得出的:最小长度 64 字节减去 18 字节的首部和尾部就得出数据字段的最小长度)。最后一个字段是 4 字节的帧检验序列FCS(使用CRC检验)。
当传输媒体的误码率为 1×10−8 时,MAC子层可使未检测到的差错小于 1×10−14。
这里有三个问题说明一下:
1、MAC 子层怎样知道从接收到的以太网帧中取出多少字节的数据交付上一层协议?
在 以太网V2 的 MAC 帧格式中,其首部并没有一个帧长度
(或数据长度)字段。那么,MAC 子层又怎样知道从接收到的以太网帧中取出多少字节的数据交付上一层协议呢?我们在前面讲述的曼彻斯特编码时已经讲过,这种曼彻斯特编码
的一个重要特点就是:在曼彻斯特编码的每一个码元(不管码元是 1 或 0 )的正中间一定有一次电压的转换(从高到低或从低到高)。当发送方把一个以太网帧发送完毕后,就不再发送其他码元了(既不发送 1 ,也不发送 0 )。因此,发送方网络适配器的接口上的电压也就不再变化了。这样,接收方就可以很容易地找到以太网帧的结束位置。在这个位置往前数 4 字节( FCS 字段长度是 4 字节),就能确定数据字段的结束位置。
2、上层协议如何知道填充字段的长度呢?
当数据字段的长度小于 46 字节时,MAC 子层就会在数据字段的后面加入一个整数字节的填充字段,以保证以太网的 MAC 帧长不小于 64 字节。我们应当注意到,MAC 帧的首部并没有指出数据字段的长度是多少。在有填充字段的情况下,接收端的 MAC 子层在剥去首部和尾部后就把数据字段和填充字段一起交给上层协议。现在的问题是:上层协议如何知道填充字段的长度呢?( IP 层应当丢弃没有用处的填充字段。)可见,上层协议必须具有识别有效的数据字段长度的功能。我们知道,当上层使用 IP 协议时,其首部就有一个“总长度”字段。因此,“总长度”加上填充字段的长度,应当等于 MAC 帧数据字段的长度。例如,当 IP数据报 的总长度为 42 字节时,填充字段共有 4 字节。当 MAC 帧把 46 字节的数据上交给 IP 层后,IP 层就把其中最后 4 字节的填充字段丢弃。
3、物理层比 MAC 层多出来的 8 个字节是什么?
在传输媒体上实际传送的要比 MAC 帧还多8个字节。这是因为当一个站在刚开始接收 MAC 帧时,由于适配器的时钟尚未与到达的比特流达成同步,因此 MAC 帧的最前面的若干位就无法接收,结果使整个的 MAC 成为无用的帧。为了接收端迅速实现位同步,从 MAC 子层向下传到物理层时还要在帧的前面插入 8 字节(由硬件生成),它由两个字段构成。第一个字段是 7 个字节的前同步码( 1 和 0 交替码),它的作用是使接收端的适配器在接收 MAC 帧时能够迅速调整其时钟频率,使它和发送端的时钟同步,也就是“实现位同步”(位同步就是比特同步的意思)。第二个字段是帧开始定界符,定义为 10101011 。它的前六位的作用和前同步码一样,最后的两个连续的1就是告诉接收端适配器:“ MAC 帧的信息马上就要来了,请适配器注意接收”。 MAC 帧的 FCS 字段的检验范围不包括前同步码和帧开始定界符。
四、扩展的以太网
我们先讨论在物理层对以太网扩展,然后讨论在数据链路层对以太网扩展。
1、在物理层扩展以太网
以太网上的主机之间的距离不能太远(例如,10 BASE-T 以太网的两台主机之间的距离不超过 200 米),否则主机发送的信号经过铜线的传输就会衰减到使 CSMA/CD 协议无法正常工作。
扩展主机和集线器之间的距离的一种简单方法就是使用光纤(通常是一对光纤)和一对光纤调制解调器:
光纤调制解调器的作用就是进行电信号和光信号的转换。由于光纤带来的时延很小,并且带宽很宽,因此使用这种方法可以很容易地使主机和几公里以外的集线器相连接。
如果使用多个集线器,就可以连接成覆盖更大范围的多级星形结构的以太网。
这种结构的缺点是:
- 在三个系的以太网互连起来之前,每一个系的 10BASE-T 以太网是一个独立的碰撞域(collision domain,又称为冲突域),即在任一时刻,在每一个碰撞域中只能有一个站在发送数据。每一个系的以太网的最大吞吐量是 10Mbit/s ,因此三个系总的最大吞吐量共有 30Mbit/s 。在三个系的以太网通过集线器互连起来后就把三个碰撞域变成一个碰撞域(范围扩大到三个系),而这时的最大吞吐量仍然是一个系的吞吐量 10Mbit/s 。这就是说,当某个系的两个站在通信时所传送的数据会通过所有的集线器进行转发,使得其他系的内部在这时都不能通信(一发送数据就会碰撞)。
- 如果不同的系使用不同的以太网技术(如数据率不同),那么就不可能用集线器将它们互连起来。如果一个系使用 10Mbit/s 的适配器,而另外两个系使用 10/100Mbit/s 的适配器,那么用集线器连接起来后,大家都只能工作在 10Mbit/s 的速率。集线器基本上是个多接口(即多端口)的转发器,它并不能把帧进行缓存。
2、在数据链路层扩展以太网
扩展以太网更常用的方法是在数据链路层进行。最初人们使用的是网桥(bridge)。网桥对收到的帧根据其 MAC 帧的目的地址进行转发和过滤。当网桥收到一个帧时,并不是向所有的接口转发此帧,而是根据此帧的目的 MAC 地址,查找网桥中的地址表,然后确定将该帧转发到哪一个接口,或者是把它丢弃(即过滤)。1990 年问世的交换式集线器
(switching hub),很快就淘汰了网桥。交换式集线器常称为以太网交换机
(switch)或第二层交换机(L2 switch),强调这种交换机工作在数据链路层。
2.1、以太网交换机的特点
以太网交换机实质上就是一个多接口的网桥,通常都有十几个或更多的接口,和工作在物理层的转发器、集线器有很大的差别。以太网交换机的每个接口都直接与一个单台主机或另一个以太网交换机相连,并且一般都工作在全双工方式。以太网交换机还具有并行性,即能同时连通多对接口,使多对主机能同时通信(而网桥只能一次分析和转发一个帧)。相互通信的主机都是独占传输媒体,无碰撞地传输数据。
以太网交换机的接口还有存储器,能在输出端口繁忙时把到来的帧进行缓存。因此,如果连接在以太网交换机上的两台主机,同时向另一台主机发送帧,那么当这台主机的接口繁忙时,发送帧的这两台主机的接口会把收到的帧暂存一下,以后再发送出去。
以太网交换机是一种即插即用设备,其内部的帧交换表(又称为地址表)是通过自学习算法自动地逐渐建立起来的。以太网交换机由于使用了专用的交换结构芯片,用硬件转发,其转发速率要比使用软件转发的网桥快很多。
以太网交换机的性能远远超过普通的集线器,而且价格并不贵,这就使工作在物理层的集线器逐渐地退出了市场。
对于传统的 10Mbit/s 的共享式以太网,若共有 10 个用户,则每个用户占有的平均带宽只有 1Mbit/s 。若使用以太网交换机来连接这些主机,虽然在每个接口到主机的带宽还是 10Mbit/s ,但由于一个用户在通信时是独占而不是和其他网络用户共享传输媒体的带宽,因此对于拥有10个接口的交换机的总容量则为 100Mbit/s 。这正是交换机的最大优点。
2.2、以太网交换机的自学习功能
假定图中的以太网交换机有 4 个接口,各连接一台计算机,其MAC地址分别是 A,B,C 和 D 。在一开始,以太网交换机里面的交换表是空的。
A 先向 B 发送一帧,从接口 1 进入到交换机。交换机收到帧后,先查找交换表,没有查到应从哪个接口转发这个帧(在 MAC 地址这一列中,找不到目的地址为 B 的项目)。接着,交换机把这个帧的源地址 A 和接口 1 写入交换表中,并向除接口 1 以外的所有接口广播这个帧(这个帧就是从接口1进来的,当然不应当把它再从接口 1 转发出去)。
C 和 D 将丢弃这个帧,因为目的地址不对。只 B 才收下这个目的地址正确的帧。这也称为过滤。
接下来 B 通过接口 3 向 A 发送一帧。交换机查找交换表,发现交换表中的 MAC 地址有 A 。表明要发送给 A 的帧(即目的地址为 A 的帧)应从接口 1 转发。于是就把这个帧传送到接口 1 转发给 A 。显然,现在已经不需要再广播收到的帧。交换表这时新增加的项目(B,3),表明今后如有发送给 B 的帧,就应当从接口 3 转发出去。
考虑到有时可能要在交换机的接口更换主机,或者主机要更换其网络适配器,这就需要更改交换表中的项目。为此,在交换表中每个项目都设有一定的有效时间。过期的项目就自动被删除。
但有时为了增加网络的可靠性,在使用以太网交换机组网时,往往会增加一些冗余的链路。在这种情况下,自学习的过程就可能导致以太网帧在网络的某个环路中无限制地兜圈子。
假定一开始主机 A 通过接***换机#1 向主机 B 发送一帧。交换机#1 收到这个帧后就向所有其他接口进行广播发送。现观察其中一个帧的走向:离开交换机#1 的接口 3→交换机#2 的接口 1→接口 2 →交换机 #1 的接口 4 →接口 3 →交换机 #2 的接口 1 →……。这样就无限制地循环兜圈子下去,白白消耗了网络资源。
为了解决这种兜圈子问题,IEEE的802.1D 标准制定了一个生成树协议STP
(Spanning Tree Protocol)。其要点就是不改变网络的实际拓扑,但在逻辑上则切断某些链路,使得从一台主机到所有其他主机的路径是无环路的树状结构,从而消除了兜圈子现象。
2.3、从总线以太网到星形以太网
随着以太网上站点数目的增多,使得总线结构以太网的可靠性下降。与此同时,大规模集成电路以及专用芯片的发展,使得星形结构的以太网交换机可以做得既便宜又可靠。在这种情况下,采用以太网交换机的星形结构又成为以太网的首选拓扑,而传统的总线以太网也很快从市场上消失了。
总线以太网使用 CSMA/CD 协议,以半双工方式工作。但以太网交换机不使用共享总线,没有碰撞问题,因此不使用 CSMA/CD 协议,而是以全双工方式
工作。既然连以太网的重要协议 CSMA/CD 都不使用了(相关的“争用期”也没有了),为什么还叫做以太网呢?原因就是它的帧结构未改变,仍然采用以太网的帧结构。
3、虚拟局域网
虚拟局域网其实只是局域网给用户提供的一种服务,而并不是一种新型局域网。
设有10台计算机分配在三个楼层中,构成了三个局域网,即:
LAN1:(A1,A2,B1,C1),LAN2:(A3,B2,C2),LAN3:(A4,B3,C3)
但这10个用户划分为三个工作组,也就是说划分为三个虚拟局域网VLAN。即:
VLAN1:(A1,A2,A3,A4),VLAN2:(B1,B2,B3);VLAN3:(C1,C2,C3)。
利用以太网交换机可以很方便地将这10台计算机划分为三个虚拟局域网:VLAN1,VLAN2 和 VLAN3。在虚拟局域网上的每一个站都可以收到同一个虚拟局域网上的其他成员所发出的广播。以太网交换机不向虚拟局域网以外的计算机传送 B1 的广播信息。这样,虚拟局域网限制了接收广播信息的计算机数,使得网络不会因传播过多的广播信息(即所谓的“广播风暴”)而引起性能恶化。
1988年 IEEE 批准了 802.3ac 标准,这个标准定义了以太网的帧格式的扩展,以便支持虚拟局域网。虚拟局域网协议允许在以太网的帧格式中插入一个 4 字节的标识符,称为 VLAN 标记(tag),用来指明发送该帧的计算机属于哪一个虚拟局域网。插入 VLAN 标记得出的帧称为 802.1Q 帧。
VLAN 标记字段的长度是 4 字节,插入在以太网 MAC 帧的源地址字段和类型字段之间。VLAN 标记的前两个字节总是设置为 0x8100
(即二进制的10000001 00000000),称为 IEEE 802.1Q 标记类型。
当数据链路层检测到 MAC 帧的源地址字段后面的两个字节的值是 0x8100 时,就知道现在插入了 4 字节的 VLAN 标记。于是就接着检查后面两个字节的内容。在后面的两个字节中,前 3 位是用户优先级字段,接着的一位是规范格式指示符 CFI
(Canonical Format Indicator),最后的 12 位是该虚拟局域网 VLAN 标识符 VID(VLAN ID),它唯一地标志了这个以太网帧属于哪一个 VLAN 。
由于用于 VLAN 的以太网帧的首部增加了 4 个字节,因此以太网的最大帧长从原来的 1518 字节( 1500 字节的数据加上 18 字节的首部)变为 1522 字节。
五、高速以太网
以下内容不太重要,这里一带而过。
1、100BASE-T以太网
100BASE-T
是在双绞线上传送 100Mbit/s 基带信号的星形拓扑以太网,仍使用 IEEE 802.3 的 CSMA/CD 协议,它又称为快速以太网(Fast Ethernet)。
100BASE-T可使用以太网交换机提供很好的服务质量,可在全双工方式下工作而无冲突发生。因此,CSMA/CD 协议对全双工方式工作的快速以太网是不起作用的(但在半双工方式工作时则一定要使用CSMA/CD协议)。
2、吉比特以太网
吉比特以太网的标准 IEEE 802.3z 有以下几个特点:
- 允许在 1Gbit/s 下以全双工和半双工两种方式工作。
- 使用 IEEE 802.3 协议规定的帧格式。
- 在半双工方式下使用 CSMA/CD 协议,而在全双工方式不使用 CSMA/CD 协议。
- 与 10BASE-T 和 100BASE-T 技术向后兼容。
吉比特以太网工作在半双工方式时,就必须进行碰撞检测。由于数据率提高了,因此只有减小最大电缆长度或增大帧的最小长度,才能使参数 a 保持为较小的数值。若将吉比特以太网最大电缆长度减小到 10m ,那么网络的实际价值就大大减小。而若将最短帧长提高到 640 字节,则在发送短数据时开销又嫌太大。因此,吉比特以太网仍然保持一个网段的最大长度为 100m ,但采用了“载波延伸”(carrier extension)的办法,使最短帧长仍为 64 字节(这样可以保持兼容性),同时将争用期增大为 512 字节。
吉比特以太网还增加了一种功能称为分组突发(packet bursting)。这就是当很多短帧要发送时,第一个短帧要采用上面所说的载波延伸的方法进行填充。但随后的一些短帧则可一个接一个地发送,它们之间只需留有必要的帧间最小间隔即可。这样就形成一串分组的突发,直到达到 1500 字节或稍多一些为止。
3、10吉比特以太网(10GE)和更快的以太网
现在以太网的工作范围已经从局域网(校园网、企业网)扩大到城域网和广域网,从而实现了端到端的以太网传输。这种工作方式的好处是:
- 以太网是一种经过实践证明的成熟技术,无论是互联网服务提供者ISP还是端用户都很愿意使用以太网。当然对ISP来说,使用以太网还需要在更大的范围进行试验。
- 以太网的互操作性也很好,不同厂商生产的以太网都能可靠地进行互操作。
- 在广域网中使用以太网时,其价格大约只有同步光纤网SONET的五分之一和异步传递方式ATM的十分之一。以太网还能够适应多种传输媒体,如铜缆、双绞线以及各种光缆。
- 端到端的以太网连接使帧的格式全都是以太网的格式,而不需要再进行帧的格式转换,这就简化了操作和管理。
以太网从 10Mbit/s 到 10Gbit/s 甚至到 100Gbit/s 的演进,证明了以太网是:
- 可扩展的
- 灵活的
- 易于安装
- 稳健性好
4、使用以太网进行宽带接入
以太网接入的一个重要特点是它可以提供双向的宽带通信,并且可以根据用户对带宽的需求灵活地进行带宽升级(例如,把10兆的以太网交换机更新为吉比特的以太网交换机)。当城域网和广域网都采用吉比特以太网或10吉比特以太网时,采用以太网接入可以实现端到端的以太网传输,中间不需要再进行帧格式的转换。这就提高了数据的传输效率且降低了传输的成本。
是 1999 年公布的PPPoE
(PPP over Ethernet),意思是 “在以太网上运行PPP”[RFC 2516]。现在的光纤宽带接入 FTTx 都要使用 PPPoE 的方式进行接入。