计算机网络02:数据链路层与局域网
第二章 链路层与LAN局域网
2.1 简介,链路层提供的服务
与链路层相关的一些术语:
- 主机与路由器在链路层中都属于节点 Node
- 主机之间的通信链路上相邻的节点之间的通信信道称为一条链路
- 有线
- 无线
- LANs
- 链路层的协议数据单元(Protocal Data Unit):帧(frame)和封装数据报
链路层负责将上层(网络层)传输的数据报从一个节点通过链路传递到另一个节点。从链路中就可以看出,从一台主机到另一台主机之间经过了多少次转发,故链路层所提供的服务就是在相邻节点之间将网络层传输的数据报转发给下一个节点。
通过不同链路传输的数据报可以遵循不同的链路协议。用实际的例子进行模拟:有一个乘客从A到B旅行,而旅行社会提前设计好从A到B的路线,首先需要按照规划从A坐车到C机场,坐飞机从C到D,再坐火车到B。这里的旅客就可以看作数据报,旅行路段可以看作通信链路,而不同的交通工具方式可以看作链路协议。实际上,旅行代理可以看作路由算法。
1.2.1 链路层提供的服务
- 封装
从网络层发送来的数据报,会由链路层加上首部和尾部,这个过程称为封装,形成帧。首部通常包含数据报的源地址和目的地址,尾部则包含纠错或检测的信息比特位。
如何实现相邻节点之间的可靠的数据传输?
- 差错检测
信号经过传输可能会发生衰减和噪声,这个信号就可能发生错误。而接收端可以检测到错误的发生。
采用编码机制,在接收端根据编码原理进行纠错,这个用来纠错的信息称为纠错码,这个方法在错误发生不频繁的地方较少使用。因为无线链路上的信息错误率较高,因此需要凭借纠错机制实现可靠的信息传输。
- 流量控制
链路层的流量控制相当于协调发送节点和接收节点的发送速率。
- 纠错
接收端不需要要求重新传输就可以纠正错误的信息
- 半双工和全双工通信
半双工:既可以接收信息也可以发送信息,但同一时刻只能接收或发送;全双工则可以同时实现接收和发送。
1.2.2 链路层的功能在哪里实现?
在每一个主机的适配器(网卡)或芯片中实现链路层服务。对于端系统实现了计算机网络的全部五层功能,但对于网卡则只有下两层,即物理层和链路层。
网卡是插在主机的系统总线上的,即网卡和主机进行连接时词用的是并行连接方式,但网卡通过缆线接入到路由器或交换机采用的是一条电缆数据传输,因此网卡需要将并行数据转换为串行数据并发送到网络上。
计算机网络的上三层(应用层、传输层、网络层)都是用软件实现的,而网卡是软硬件和固件结合起来的。(网卡要与OS交互则需要驱动程序,而驱动其实就相当于固件)
网卡通信示意图:
在发送端接收网络层数据报并封装成帧,放到链路上进行传输(信号)。接收端收到后,先检测是否发生错误,如果有错误则进行错误处理,如果没有错误则将首部和尾部去除,并将中间内容交付给网络层,此时需要触发CPU中断。
网卡是半自治的,即本身无电源,必须插入计算机电源,并接受计算机的控制。
1.2.3 适配器的作用
适配器/网卡/网络接口卡(Network Interface Card, NIC)
- 串行/并行转换
- 对数据进行缓存:总线读取数据的速度与链路传输的速度不匹配
- 在计算机的操作系统安装设备驱动程序:网卡插入主板,进行正常工作,必须要先在计算机上安装驱动程序
- 实现以太网协议
计算机通过适配器和局域网进行通信:
2.2 错误检测和处理
下图展示了链路层的错误检测机制:
EDC:Error Detection and Correction bits,错误检测和校正位(冗余位)
D:通过错误检测机制保护的数据,可能包含首部,即互不相关彼此独立的01序列,可以通过某种规则加入冗余的比特位,与正确的信息建立关系,而接收端则可以通过观察这个关系是否满足某种条件来判断是否发生错误。
datagram为真实数据,长度为\(d\space bits\),通过规则\(F\)加入冗余比特位得到\(EDC\),将这个整体放到物理链路上进行传输。假设物理链路发生错误,接收端接收到了传输后的\(D'\),对\(D'\)采用与发送端相同的规则\(F\)得到\(EDC'\),如果\(EDC’\)与\(EDC\)相同则说明没有出错,去除首部和尾部后发送给下一层;否则说明有错误,后续处理由协议规定。
错误检测机制并非一定有效,协议可能会遗漏一些错误,但这种情况很少发生。
2.2.1 奇偶校验 Parity Checking
如图所示:
- 单比特奇偶校验
通过向冗余位中添加0或1来保证数据中的1的个数为奇数个/偶数个,在接收端检查数据中的1的个数是否仍然为奇数个/偶数个。
显然单比特校验并不实用,如果同时有两位发生反转则无法检测。
- 二维奇偶校验
将数据分成\(i\)行\(j\)列的矩阵,对每一行进行单比特奇偶校验,对每一列进行奇偶校验,如果发生了错误,可以准确定位哪一位发生了错误。
但这个方式也有局限性,如果一行中同时有两位发生翻转,这个错误也无法被检测,此时对应的列只能发现错误而无法定位错误。
2.2.2 因特网校验和 Internet Checksum
可以用来检测传输链路中的错误,例如位翻转。此方法只能用在传输层。
发送端将数据分割为16比特的整数,用补码求和后进行翻转,作为校验和字段,放在TCP
/UDP
域内,发送给接收端。接收端以同样的方式计算校验和,检查与之前的校验和是否相等。 如果相等则无错误,否则说明出错。
2.2.3 循环冗余校验 Cyclic Redundancy Check, CRC
一种能力更强的检测编码方式,要求发送端将D bits的数据看作一个二进制数,选择一个\(r+1\) bits 的生成多项式G,根据G算出\(r\) bits的CRC校验位R,使得<D, R>可以被G整除(模二除法,相当于异或)。接收端需要检查<D, R>是否仍然可以整除G,如果可以则无错误。当然发送端和接收端需要协调好G的内容。
此方法可以检测所有小于\(r+1\) bits的突发错误(例如连续比特翻转)。
计算过程:
需要得到G:
等价于:
等价于:
得到:
得到:
对于发送端和接收端需要协商G的内容,而G的设置有一些国际标准,规定了8位、12位、16位和32位生成表达式的标准,许多链接级IEEE协议中都采用了CRC 32位标准。每一个CRC标准都可以检测不多于\(r+1\)位的图法错误,而且每一个CRC标准都可以检测到任何奇数位错误。
通常,校验和方法是在传输层的软件中实现的,而连路程的CRC是在适配器中的专用硬件中实现的,可以快速执行复杂的CRC操作。
2.3 多路访问协议 Multiple Acesss Protocals, MAP
根据两端节点的种类,链路可以分为两种:
-
点对点连接
- PPP,用于拨号访问
- 以太网交换机和主机之间的点对点链接
-
广播(共享链路或媒介),采用总线式连接
- 上行HFC
- 802.11无线局域网
如果只有一个站点发送数据则可以直接发送,但是如果多个站点同时发送则可能互相之间会产生干扰,即信号发生碰撞。这时就需要进行协调。
多路访问协议:
- 需要采用分布式算法决定节点如何共享信道
- 关于信道共享进行通信必须针对共享信道本身来说,而不能额外采用其他信道
碰撞检测:
- 碰撞检测就是计算机边发送数据边检测信道上的信号电压的大小
- 当几个节点同时在总线上发送数据时,总线上的信号电压摆动值将会增加(互相叠加)
- 当一个节点检测到的信号电压摆动值超过一定的阈值时,就认为总线上至少有两个节点同时在发送数据,表明产生了碰撞。
- 所谓碰撞就是发生了冲突,因此,碰撞检测也称为冲突检测。
碰撞到检测后:
- 在发生碰撞时,总线上传输的信号产生了严重的失真,无法从中恢复出有用的信息
- 每一个正在发送数据的节点,一旦发现总线上出现了碰撞,就要立刻停止发送,避免浪费网络资源,然后等待一段随机时间后再次发送。(随机可以避免死锁现象的出现)
2.3.1 理想的多路访问协议
假设有一个传输速率位\(R\) bps的广播频道:
- 当一个节点要发送时,它可以以速率\(R\)发送
- 当\(M\)个节点要发送时,每个节点的平均速率位\(R/M\)
- 协议是非集中式的,没有节点专门负责数据的传输,没有时钟同步、时隙同步
- 协议必须足够简单
MAC(多路访问控制,Multiple Access Control)协议:一种分类方法
分为三种:
- 信道划分
类似频分复用技术,将信道分片并分配给站点
- 随机接入
不需要对信道进行划分,如果发生冲突,则使用某种手段从冲突中恢复
- 轮转协议
节点轮流发送数据,但要发送更多的节点可能需要更长的轮转周期
2.3.2 信道划分MAC协议
时分多址复用 Time Division Multiple Access, TDMA
类比时分复用技术:将时间划分为帧和时隙,每个时隙分配给一个用户,各个用户轮流使用
每个站点都可以得到一个给定长度的时隙。
- 时隙:一个分组的第一个bit发送上去到最后一个bit发送完成所经历的时间定义为一个时隙
与时分复用技术类似,此方式也存在资源浪费的问题:未使用的时隙处于空闲状态而被浪费。
例如:6个站点的局域网,1、3、4需要发送数据报,而时隙2、5、6空闲
频分多址复用 Frequency Division Multiple Access, FDMA
将信道频谱分为不同的频带,每个用户分配一个频带,但此方式也存在资源浪费的问题。
例如:6个站点的局域网,1、3、4需要发送数据报,2、5、6频带空闲
2.3.3 随机访问协议 Random Access Protocals,RAP
信道划分协议不会产生碰撞,但如果只有一个用户发送数据,理想情况下希望用户可以占用全部资源,但信道划分协议显然做不到。但如果不采用划分协议,如果有多个节点发送数据,就可能会产生冲突。
冲突的检测方式:
- 节点反馈
- 边传输边检测
MAC协议需要实现:
- 如何检测冲突
- 如果发生冲突,如何从冲突中恢复
有三种典型的随机访问协议:
- slotted ALOHA
- ALOHA
- CSMA,CSMA/CD,CSMA/CA
Slotted ALOHA
我们假设所有帧大小相同,将时间划分为大小相同的时隙,时隙大小刚好能够传输一帧(链路层的帧,数据单位),且每个节点仅在时隙开始时才开始发送帧。节点之间需要进行同步,如果多个节点传输且发生了冲突,所有节点都可以知道发生了冲突。虽然在当前时隙接触到了帧,但只有在每个时隙开始时才发送帧,因此只能在下一个时隙将其发送到存储区。
当节点获得新的帧,它会在下一个时隙中传输。如果未发生冲突,则节点可以再发送新帧;如果发生了冲突,节点将在每个后续的时隙中重新传输,直到成功。
优点:
- 单个节点可以连续以全速率传输
- 节点之间高速分散,每个节点只需要直到在哪个时隙开始,节点之间不需要同步
- 简单
缺点:
- 可能会发生碰撞,碰撞的信息不能被正确接收,这期间的时隙被浪费
- 有一定概率使得三个节点都没有发送数据,造成时隙空闲
- 无论是否检测到碰撞,节点都会将数据发送到链路上,在冲突时就浪费了信道资源
- 必须进行时钟同步
效率:
假设有\(N\)个节点要发送帧,每个节点在时隙中的传输速率为\(p\)。则节点1在每个时隙中成功传输帧的概率为\(p(1-p)^{N-1}\),任意节点在每个时隙中传输成功的概率为\(Np(1-p)^{N-1}\)。如果要使得效率最大化,则需要找到一个\(P^*\),使得\(Np(1-p)^{N-1}\)最大。计算得\(P^*=1/N\),当\(N\)趋于无穷大时,最大效率为\(1/e\approx0.37\)。
如何改进此方式以提高效率?
纯ALOHA (unslotted )
不进行时隙划分,当一个帧到达时立刻进行传输。当一个节点在发送帧时如果有另一个节点也要发送数据,则会发生冲突。
假设\(t_0\)时刻发送数据,则在\([t_0-1, t_0+1]\)这个时间段内都有可能发生碰撞。注意,这里的\(1\)指的是传输帧的单位时间。
如果一个节点要发送数据,则\(N-1\)个节点在其前后单位时间内都没有发送数据,则这个节点发送成功,这个概率为\((1-p)^{N-1}p(1-p)^{N-1}\)。继续求出\(p^*\),经过计算,可以得到最大效率为\(1/2e\approx 0.18\)。
这个结果甚至比时隙ALOHA更差。
纯ALOHA几乎是最早提出的随机访问协议。
ALOHA是夏威夷土著语中的“你好”。
载波监听多路访问 Carrier Sense Multiple Access, CSMA
随机访问协议只要开始发送帧就不会停止,这其实是一种损人不利己的行为。而CSMA则不同,节点在发送一个帧之前会先监听信道,如果信道是空闲的就会开始传输,否则会推迟当前帧的传输。
多点接入(Multiple Access)表示计算机以多点接入的方式连接在一根总线上,载波监听是指每一个节点在发送数据之前先要检测总线上是否有其他计算机在发送数据,如果有则暂时不要发送,以免产生碰撞。
总线上并没有什么”载波“,因此,载波监听就是用电子技术检测总线上有没有其他计算机发送的数据信号。
根据监听的持续程度可以分为两种:
- 持续监听,在整个过程中持续监听
- 非持续监听,以一定周期间断监听
- P监听,以概率P监听
CSMA方式当然不能完全避免冲突,因为感应冲突是根据信号强度实现的,但信号的传播存在延迟。实际上,距离和传播延迟在确定碰撞概率中会产生非常大的影响。
CSMA并不会终止冲突帧的传输,同样会浪费信道资源。
CSMA/CD (Collision Detection),带冲突检测的CSMA
冲突可能在短时间内被发现,如果发现冲突就放弃当前帧的传输,减少信道资源的浪费。
如何进行碰撞检测?
- 对于有线局域网(高低电平):测量信号强度
- 对于无线局域网:实现难度比较大,因为数据传输过程中的衰减会比较严重,接收端和发送端同时发送信号,可能信号功率非常大,远端经过衰减的信号被淹没,这样就无法检测是否有信号产生
与人类活动做一个类比,就像两个人进行着有礼貌的对话,一个人发言之前会先注意有没有其他人发言,如果有则先停止发言,进行等待。
CSMA/CD的操作过程:
- 如果信道是空闲的,则开始发送帧,否则等待
- 在传输过程中需要监听是否有其他信号存在于信道中,如果有则停止当前帧的传输,否则一直发送
- 如果放弃了当前帧的传输,则等待随机时间后返回第一步,具体时间长度与协议有关
- 二进制指数回退算法(The Binary Exponential Backoff algorithm)——在以太网和DOCSIS电缆网络多路访问协议中存在
B也可以检测到冲突,并立即停止发送数据帧,接着就发送干扰信号。这里为了简单起见,只画出A发送干扰信号的情况。
2.3.4 轮转MAC协议
信道划分MAC协议:
- 有效共享信道资源并且在网络负载比较重时是一个比较公平的协议
- 如果网络负载比较轻,比如只有一个用户使用资源,则利用率只有\(1/N\)
随机访问MAC协议:
- 如果网络负载比较轻,则用户可以独占资源,利用率非常高
- 如果网络负载重,可能会产生冲突,产生碰撞开销
轮转MAC协议:
- 结合了上述两个协议的优点,保证信道在使用过程中不会产生冲突
轮转MAC协议有两种实现方式:
1. 轮询过程 polling
所有节点分为主节点和从属结点,主节点轮流允许从属结点发送数据,且一次只邀请一个从属结点在总线上进行数据传输。
应用:哑终端(非智能从属设备,例如传感器设备)
但这种方式存在缺点:
-
主节点需要给从属结点发送轮询数据,询问其是否需要发送数据,即使网络中没有数据要发送,主节点也要不断进行询问。
-
存在时延问题,例如如果当前只有从属结点D要发送数据,但主节点需要从节点A开始。
-
单点故障问题,如果主节点故障,整个系统就无法运作
2. 令牌环 token passing
不分主从节点,每个节点地位相同,只有拿到令牌的节点才能够发送数据(令牌是一个特殊的帧)。每次只有一个节点可以获得令牌,当整个系统传输完毕后就将令牌还给网络。
这种方式也存在问题:
- 网络中没有数据需要传输时仍要传递令牌,占用信道资源
- 令牌本身也需要开销
- 单点故障问题:一旦令牌丢失,整个系统无法运作
- 解决方式:设置一个主节点,如果在等待足够长的时间后令牌仍未到达主节点,则主节点重新分配令牌
- 一旦当前节点完成数据传输后,需要等待令牌绕环一周后才能继续发送,存在时延问题
2.4 局域网技术 LANs
数据链路层需要进行寻址,链路层的地址称为MAC地址或物理地址,网络重要查找的目的地址就是通过IP地址查找路径,对网络层的数据报进行封装,而这个过程需要建立从IP地址到MAC地址的映射。
最常用的局域网技术:以太网 Ethernet
互联设备:hubs(集线器),switcher(交换机),router(路由器)
2.4.1 寻址与ARP协议
链路层的功能是在网卡上实现的,每一块网卡都应该有一个唯一的MAC地址:
局域网内的广播地址使用一个特殊的MAC地址:FF-FF-FF-FF-FF-FF
作用:用于局域网内标识数据帧是从哪一个地址发送的
MAC地址
路径选择就是MAC地址通过域名解析映射到一个32位IP地址(IPv4):
- IP地址是网络层的地址,作用是将数据报从源主机送至目的IP的子网
MAC地址(链路地址,物理地址,以太网地址):
-
将一个帧从一个接口发送到另一个物理上连接的接口,二者应该在同一个子网内,即以太网地址在同一个子网内起作用
-
MAC地址是48位的,在出厂时就已经刻录在网卡的ROM中,有时也可以用软件进行设置
-
MAC地址具有唯一性,如何保证每个网卡出厂时MAC地址唯一?——由IEEE组织统一分配管理
MAC地址类似于身份证号,IP地址类似于邮政地址;MAC地址是平面地址,所有的地址在一个平面内,没有区域划分,即一个网卡可以从一个子网移动搭配另一个子网;而IP地址具有层次结构,不能携带,只能归属于某一个网络。先有子网再有IP地址,即IP类似于子网的属性,是具有网络区域局限性的。
IP地址是网络层的地址,而MAC地址是链路层的地址,IP地址放在网络层的数据报首部,但MAC地址放在链路层的帧的首部,用来标示源主机的MAC地址与目的主机的MAC地址。
地址解析协议 Address Resolution Protocal, ARP
网络中通过IP地址进行路由选择,相当于在链路层需要知道发送给下一个节点的IP地址到MAC地址的应黑色。假设我们知道节点B的IP地址,如何确定B的MAC地址?
每个IP节点(主机和路由器)都有一个ARP表,该表保存着从IP到MAC地址的映射和超时时间(TTL)。(同一个子网内)。TTL(Time to Live):超过指定时间就认为这一行的地址映射无效,通常为20分钟。
- 为什么需要设置超时时间?——一旦更换网卡,MAC地址就发生了变化,再用原来的IP地址就无法联通。
注意:要发送和接收数据帧的主机必须在同一个局域网内(两个节点和路由器的一个接口相连):
如果A想要发送数据帧给B,且B的MAC地址不在A的ARP表中,A需要向局域网内广播一个查询报文(查询分组),ARP查询分组内包含了B的IP地址;局域网内的所有节点都可以收到广播帧,A发送的查询报文的目的地址就是广播地址(FF-FF-FF-FF-FF-FF)。当B收到查询报文后,会给A发送一个响应帧,源地址就是自己的MAC地址,目的地址就是AMAC地址,通过响应帧告诉A自己的MAC地址;这个传播是单向传播,因为目的地址明确指定。A由此得到了B的MAC地址与IP地址的映射,可以保持到TLL时限或TLL更新。
ARP协议是一个即插即用的协议,即只要将节点连接到网络就可以创建ARP表,不需要管理员干涉。
通过路由器R将数据报从A发送到B
分为以下三种情况:
- A知道B的IP地址
- A知道第一跳路由器R的IP地址
- A知道R的MAC地址
当一个主机第一次连接到一个子网,会被分配一个IP地址,此时其ARP表为空,当其与在同一个子网内的主机B连接时,需要知道B的IP地址,运行ARP协议后可以在ARP表中添加B的IP地址到MAC地址的映射;
如果A与B在不同的子网内:
- A知道B的IP地址
A运行ARP协议广播查询报文,获取B 的响应帧后获得B的IP地址到MAC地址的映射
- A知道第一跳路由器的IP(与路由器连接说明路由器作为A连接到Internet的网关)
A运行ARP协议广播查询报文,获得第一跳路由器响应帧后获得第一跳路由器的IP地址到MAC地址的映射;再以其MAC地址为源地址向右进行类似操作
- A知道路由器右侧的MAC地址(广播帧后获取)
以路由器MAC地址为源地址向右进行类似操作即可
从网络层的视角开始,整个过程相当于A创建IP层的数据报, 封装原主机IP地址和目的主机IP地址,交给下一层链路层进行封装(A到路由器左侧的MAC地址),原MAC地址为A的MAC地址,目的MAC地址为路由器左侧的MAC地址,帧到达路由器后检错排错,去掉首尾部后交付给网络层,网络层查看目的子网,以此类推。注意整个过程中,数据报的原IP地址和目的IP地址不变,而原MAC地址和目的MAC地址随时会更新。
数据链路层的两个子层
-
为了使得数据链路层能更好地适应多种局域网标准,802委员会就将局域网的数据链路层拆分成两个子层:
- 逻辑链路控制层(Logical Link Control, LLC)
- 媒体接入控制层(Medium Access Control,MAC)
-
与接入到传输媒体有关的内容都放在MAC子层,而LLC子层则与传输媒体无关,不管采用何种协议的局域网对LLC子层来说都是透明的。
一般不考虑LLC子层
- 由于 TCP/IP 体系经常使用的局域网是 DIX Ethernet V2 而不是 802.3 标准中的几种局域网,因此现在 802 委员会制定的逻辑链路控制子层 LLC(即 802.2 标准)的作用已经不大了。
- 很多厂商生产的适配器上就仅装有 MAC 协议而没有 LLC 协议
2.4.2 以太网 Ethernet
以太网的优点:
- 造价低
- 是应用最广泛的局域网技术
- 比令牌环局域网和ATM更简单便宜
- 以太网总是能够跟上网络速率发展的步伐
以太网对本地区域联网的重要性就像因特网对全球联网所具有的地位那样。
以太网是第一个广泛部署的高速局域网,且令牌环、ATM等其他局域网技术比以太网更加复杂和昂贵。由于以太网已经很流行了,所以以太网硬件(尤其是适配器和交换机)成为了一个普通商品,而且极为便宜。
Bob Metcalfe和David Boggs在20世纪70年代中期发明了初始的以太局域网。
在九十年代中期,总线网络比较流行:
采用同轴电缆,所有节点共享冲突域(冲突域是在一个范围内,如果两个基点同时发送数据,就构成了一个冲突域)。
到了20世纪90年代后期,大多数公司和大学使用一种基于集线器的星型拓扑以太网,主机和路由器直接用双绞线与一台集线器相连。集线器是一种物理层设备,作用于各个比特而不是作用于帧。当表示一个0或一个1的比特到达一个接口时,集线器只是重新生成这个比特,将其能量强度放大,并将该比特向其他接口传输出去。因此,基于集线器的星型拓扑以太网也是一个广播局域网。
而现代更通用的是基于交换机的星型拓扑结构:
中间是交换机(如果是一个集线器,则所有主机仍然在同一个冲突域内),交换机可以隔离碰撞,每个端口只连接一台计算机,不会发生碰撞,但仍然采用CSMA/CD检测协议。
2.4.2.1 以太网的帧结构
链路层的协议数据单元是帧,发送端的网卡需要对网络层数据报进行封装,而其他层的协议分组封装为以太网的帧:
以太网的帧分为以下几个部分:
- 前导码 preamble
长度为8个字节,前7个字节都是\(10101010\),最后一个字节为\(10101011\);相当于发送端网卡与接收端网卡进行时间同步,但当最后一个字节发送时发现是11则标识下一个帧的开始,称为帧定界符。
计算帧长度时不计算前8个字节。
- 地址 address
其中目的MAC地址与原MAC地址长度都是6个字节,如果网卡可以匹配目的MAC地址或者当前帧为广播帧,目的地址为全1的地址,则接收端会将数据进行校验,去除首尾部并将数据交付给网络层;否则网卡会丢弃帧。
- 类型 type
长度为2个字节,标识高层协议(主要是IP协议,但也可能支持其他协议),用来对帧进行复用和分用。
为了理解这一点,我们需要记住主机能够使用除了IP以外的其他网络层协议。事实上,一台给定的主机可以支持多种网络层协议,以对不同的应用采取不同的协议。当以太网帧到达目的适配器R,R需要知道他应该将数据字段的内容传递给哪个网络层协议(即分解)。IP和其他链路层协议都有各自的、标准化的类型编号。另外,ARP协议有自己的类型编号,并且如果到达的帧包含ARP分组(即类型字段的值为十六进制的0806),则该ARP分组将被多路分解给ARP协议。
- 数据 data
长度为46~1500字节。这个字段承载了IP数据报。以太网的最大传输单元(MTU)为1500字节,这意味着如果IP数据报超过了1500字节,则主机必须将该数据报分片。数据字段的最小长度为46字节,如果IP数据报小于46字节,则必须被填充到46字节。当采用填充时,传递到网络层的数据包括IP数据报和填充部分。网络层使用IP数据报首部中的长度字段来去除填充部分。
- CRC校验位
长度为4个字节,用来检测错误
整个以太网帧的首尾部(即不包含数据本身)的长度为18个字节。对于以太网,其最大帧和最小帧长度分别为1518字节、64字节。
MAC帧的格式
常用的以太网MAC帧格式有两种标准:
- DIX Ethernet V2标准
- IEEE的802.3标准
最常用的MAC帧是以太网V2的格式。
数据字段的正式名称是MAC客户数据字段,其最小长度64字节-18字节的首尾部=数据字段的最小长度。
当传输媒体的误码率为\(1\times 10^{-8}\)时,MAC子层可使未检测到的差错小于\(1\times 10^{-14}\)。
当数据字段的长度小于46字节时,应在数据字段的后面加入整数字节的填充字段,以保证以太网的MAC帧长度不小于64字节。
在帧的前面插入的8字节中的第一个字段共7个字节,称为前同步码,用来迅速实现MAC帧的比特同步。第二个字段是帧开始定界符,表示后面的信息就是MAC帧。
为了达到比特同步,在传输媒体上实际传送的要比MAC帧还多8个字节。
无效的MAC帧
以下情况MAC帧为无效帧:
- 帧的长度不是整数个字节
- 用收到的帧检验序列FCS查出有差错
- 数据字段的长度不在46~1500字节之间
- 有效的MAC帧长度为64~1518字节之间
- 对于检查出的无效MAC帧就简单地丢弃。以太网不负责重传丢弃的帧
以太网提供的服务
当目的适配器收到一个来自原适配器的帧,对该帧进行CRC校验,但是当该帧通过CRC校验时它不会发送确认帧,当该帧没有通过CRC校验时他也不发送否定确认帧。当某帧没有通过校验,它只是丢弃该帧。因此,原适配器根本不知道它传输的帧是否到达了目的地并通过了CRC校验。(在链路层)缺乏可靠的传输有助于使得以太网简单和便宜,但是它也意味着传递到网络层的数据报流能够有间隙。
所有以太网提供的是不可靠的无连接服务。其中,无连接指的是在发送数据帧之前不需要建立连接,即不需要握手;不可靠指的是接收适配器并不会给发送适配器发送确认请求,发送适配器也不会对数据进行重传;且传递到网络层的数据报流有可能存在间隙。此时如果应用程序使用的是TCP(面向连接),则可以填补空白;否则应用程序将看到间隙。
如果应用使用的是TCP,则目的主机中的TCP将不会确认包含在丢弃帧中的数据,从而引起原主机的TCP重传。注意到当TCP重传数据时,数据最终将回到曾经丢弃它的以太网适配器。因此,从这种意义上来说,以太网的确重传了系统,尽管以太网并不知道它正在传输一个新数据报还是一个包含已经被传输过至少一次的数据报。
以太网使用CSMA/CD协议
没有时隙,网卡如果发现其他适配器正在传输,则不会继续传输;如果监听到其他适配器发送数据而自己也在发送,则停止发送,重传之前等待随机时间。
传播时延对载波监听的影响:
A向B发送数据最多需要多少时间才可以检测到碰撞?
注意A能够检测到碰撞的前提是A有数据要发送。假设A发送数据长度为\(L\),速率为\(R\),且\(l/R>2\tau\)。
B也能够检测到冲突,并立刻停止发送数据帧,接着就发送干扰信号。这里为了简单起见,只画出A发送干扰信号的情况。
帧间最小间隔
帧间最小间隔为\(9.6\mu s\),相当于96 bits的发送时间;即一个节点在检测到总线开始空闲后,还要等待\(9.6\mu s\)才能再次发送数据。这样做的目的是为了使得刚刚收到数据帧的节点的接收缓存来得及清理,做好接收下一帧的准备。
以太网的CSMA/CD算法
- 适配器从网络层接收数据报并创建帧
- 如果适配器检测到信道空闲,就开始传输;如果信道被占用,则等到信道空闲后再发送
- 如果适配器发送了整个帧而未检测到其他传输,则适配器完成当前帧的传输
- 如果适配器正在传输时检测到另一个传输信号,则终止传输并发送拥塞信号
- 终止后,适配器调用指数回退算法:第\(m\)次碰撞后,适配器从\(\{0,1,2,...,2^m-1\}\)中随机选择一个数\(k\)。适配器等待\(k-512\)位时间,然后返回步骤2
拥塞信号:确保所有其他节点都知道有碰撞,相当于将碰撞信息广播出去,长度为48 bits
位时间:即网络中传输1 bit所需的时间,对于10\(Mbps\)的以太网为\(0.1\mu s\);对于\(k=1023\),等待时间大约为\(50 mesc\)。
指数回退:用来调整重传尝试,根据评估的当前网络负载来调整重传时间,如果负载重,则随机等待时间就比较长。
为什么是\(\{0,1,2.,,,.2^m-1\}\)?当适配器经历一次碰撞后,它不知道有多少适配器涉及碰撞;如果只有少量适配器涉及碰撞,从小集合重选择小数值K是明智的;如果有多个适配器设计碰撞,从更大、分散的集合中选择K是明智的。
算法效率:
假设\(T_{prop}\)为局域网中两个节点之间的最大传输延迟,\(T_{trans}\)表示传输最大帧所需时间;
当\(T_{prop}=0\)时,效率显然为1;当\(T_{trans}\)达到无穷大时,效率也为1;这个结果比ALOHA好得多,但仍然是分散的,简单便宜。
10BaseT 和 100BaseT
10/100表示10/100 Mbps 速率,后者称为“高速以太网”;T表示双绞线,节点连接到集线器采用星型拓扑结构,节点与集线器之间的最大距离为100米。
802.3以太网标准:链路层和物理层
有许多不同的以太网标准,采用通用的MAC协议和帧格式,但具有不同的速度,例如2Mbps、100Mbps、1Gbps等;也有不同的物理层介质,例如光纤、电缆等。
Gbit 以太网
使用标准以太网格式,允许点对点连接和共享广播信道。在共享模式下,使用CSMA/CD协议;出与效率考虑,节点之间的距离都很短。
使用了集线器,这里称为”缓冲分发器“。
2.4.3 hubs与交换机
互联局域网网段的网络设备:
- Repeater(中继器),位于物理层
- Convertor(转换器),信号转换的中继器
- 如光电转换,10base-2转换到10BaseT
- Hub(集线器),位于物理层,是中继器的一种形式,也称为多端口中继器
- Switch(交换机),位于链路层,是网桥的一种形式,也称为多端口网桥
2.4.3.1 hubs 集线器
是物理层的中继器,擦混第的数据是从入口将数据流经过整形放大再发送到所有出口链路上,且出入速率相同,没有对帧的缓存。
集线器是物理层的设备,不涉及到多路访问,不需要通过网络适配器检测碰撞。
集线器也提供网络管理功能,但不能隔离碰撞域;中继器可以扩展两台计算机之间的距离。
集线器的工作原理:
- 点对点
- 点到多点通信
整形放大:
主干集线器互联局域网段,可以延长节点之间的最大距离;但是单个端的碰撞域就变成了一个大的碰撞域;且无法互联10BaseT和100BaseT。
2.4.3.2 switcher 交换机
交换机的任务是接收入链路层帧并将它们转发到出链路。
交换机转发和过滤
过滤(filtering)是决定一个帧应该转发到某个接口还是应当将其丢弃的交换机功能;转发(forwarding)是决定一个帧应该被导向哪个接口,并将该帧移动到那些接口的交换机功能。
交换机的过滤和转发借助于交换机表(switch table)完成,该表包含某局域网上某些主机和路与其的但不必是全部的表项,其表项包括:MAC地址;通向该MAC地址的交换机的接口;表项放置在表中的时间。
为了理解交换机过滤和转发的工作过程,假定目的地址为DD-DD-DD-DD-DD-DD
的帧从交换机接口\(x\)到达。交换机用MAC地址DD-DD-DD-DD-DD-DD
索引它的表,有三种可能情况:
- 表中没有对于
DD-DD-DD-DD-DD-DD
的表项。在这种情况下,交换机向除了接口\(x\)之外的所有接口前面的输出缓存转发该帧的副本,换言之,如果没有对于目的地址的表项,交换机广播该帧。 - 表中有一个表项将
DD-DD-DD-DD-DD-DD
与接口\(x\)联系起来。在这种情况下,该帧从包括适配器DD-DD-DD-DD-DD-DD
的局域网网段到来。不需要将帧转发到任何其他接口,交换机通过丢弃该帧执行过滤功能即可。- 即该帧已经在包含目的地的局域网网段广播过了,因此交换机过滤(丢弃)该帧。
- 表中有一个表项将
DD-DD-DD-DD-DD-DD
与接口\(y\not=x\)联系起来。在这种情况下,该帧需要被转发到与接口\(y\)相连的局域网网段,交换机通过将该帧放到接口y前面的输出缓存完成转发功能。
只要交换机的表是完整和准确的,该交换机就无需任何广播就向着目的地转发帧。
在这种意义上,交换机比集线器更加聪明。
假设节点C要向节点D传递帧:
交换机从节点C接收帧,而交换机表中C节点位于接口1上,但D不在表中,因此将帧广播到接口2和3,D这才接收到。
假定D将帧回复给C:
交换机从D接收帧,交换机表中D对应接口2,因为C在表中,所以交换机只需要将帧转发到接口1即可,C接收到帧。
自学习
交换机的表是自动、动态和自洽地建立的,即没有来自网络管理员或来自配置协议的任何干扰。换句话说,交换机是自学习的。这种能力是以如下方式实现的:
-
交换机表初始为空
-
对于在每个接口接收到的每个入口帧,该交换机在表中存储:
-
在该帧源地址字段中的MAC地址
-
该帧到达的接口
-
当前时间
交换机以这种方式在其表中记录了发送节点所在的局域网网段。如果在局域网上的每个节点最终都发送了一个帧,则每个节点最终将在这张表中留有记录。
-
-
如果在一段时间(称为老化期(aging time))后,交换机没有接收到以该地址作为源地址的帧,就在表中删除这个地址。以这种方式,如果一台PC被另一台PC(具有不同的适配器)代替,原来的PC的MAC地址将最终从该交换机表中被清除掉。
交换机是即插即用设备,因为他们不需要网络管理员或用户的干预。要安装交换机的网络管理员除了将局域网网段与交换机的接口连接外,不需要做其他任何事。交换机是全双工的,即任何交换机接口都可以同时发送和接受。
转发表的建立过程举例:
为了避免转发的帧在网络中不断地兜圈子,透明网桥使用了生成树算法
链路层交换机的性质
- 消除碰撞
在使用交换机(不包括集线器)构建的局域网中,没有因碰撞而浪费的带宽。交换机缓存帧绝不会在网段上同时传输多于一个的帧,就像使用路由器一样,交换机的最大聚合带宽是该交换机所有接口速率之和。因此,交换机提供了比使用广播链路的局域网高得多的性能改善。
交换机将子网分成各个局域网段,相同局域网段的帧通常不会转发到其他局域网段,每个网段成为单独的碰撞域。
直通切换:帧从输入端口转发到输出端口,而不需要先收集整个帧,延迟时间略有减少。
- 异质的链路
交换机将链路彼此隔离,因此局域网中的不同链路可以以不同的速率运行并且能够在不同的媒体上运行。因此,对于原有的设备和新设备混用,交换机是理想的。
- 管理
除了提供强化的安全性,交换机也易于进行网络管理。例如,如果一个适配器工作异常并持续发送以太网帧,交换机能够检测到问题,并在内部断开异常适配器。
嗅探交换局域网:交换机毒化
当一台主机与某交换机连接时,它通常仅接收到明确发送给他的帧,而其他主机则不能嗅探到目的主机和原主机的帧。因此,在交换局域网的环境中,攻击者嗅探帧更为困难。然而因为交换机广播那些目的地址不在交换机表中的帧,对于其他主机的嗅探器仍然能够嗅探某些不是明确寻址到该主机的帧。此外,嗅探器能够嗅探到具有广播地址FF-FF-FF-FF-FF-FF的广播帧。一个众所周知的对抗交换机的攻击称为交换机毒化,它向交换机发送大量的具有不同伪造源MAC地址的分组,因而用伪造表项填满了交换机表,没有为合法主机留下空间。这使得该交换机广播大多数帧,这些帧则能够由嗅探器捕获到。由于这种攻击只有技艺高超的攻击者才能做到,因此交换机比起集线器和无线局域网来说更难收到嗅探。
交换机和路由器比较
二者都是存储转发的:
- 路由器是网络层设备(检查网络层首部)
- 交换机是链路层设备(检查链路层首部)
二者都有转发表:
- 路由器使用路由算法,IP地址计算表
- 交换机使用洪范,自学习,MAC地址来学习转发表
集线器 | 路由器 | 交换机 | |
---|---|---|---|
流量隔离 | no | yes | yes |
即插即用 | yes | no | yes |
优化路由 | no | yes | no |
直通式(cut through) |
交换机是即插即用的,这是世界上所有超负荷工作的网络管理员都喜爱的特性。交换机还具有相对高的分组过滤和转发速率,交换机必须处理高至第二层的帧,而路由器必须处理高至第三层的数据报。在另一方面,为了防止广播帧的循环,交换网络的活跃拓扑限制为一棵生成树。另外,一个大型交换网络将要求在主机和路由器有大的ARP表,这将生成客观的ARP流量和处理量。而且,交换机对于广播风暴并不提供任何保护措施,即如果某主机出了故障并传输没完没了的以太网广播帧流,该交换机将转发所有帧,使得整个以太网的崩溃。
2.4.4 虚拟局域网 VLANs
假设我们有一个CS系的用户搬到了EE系的一个楼的办公区,但又想与CS在同一个局域网网段内,该如何做到?如果专门为其拉一条网线可以实现,但显然这是不切实际的;另外一个方式是,CS系的数据在广播的情况下不想让EE系的其他人获取,能不能有一种方法使得CS系的广播不到达其他系,即实现隔离广播域?
- 可以直接将交换机换成路由器,但正常情况下我们不希望改变拓扑结构
- 可以采用虚拟局域网技术
现代机构的局域网常常是配置为等级结构的,每个工作组有自己的交换局域网,经过一个交换机等级结构与其他工作组的交换局域网互联。虽然这样的配置在理想世界中能够很好地工作,但是在现实世界中常常不尽如人意。主要有三个缺点:
- 缺乏流量隔离
广播流量必须跨越整个机构网络。限制这些广播流量的范围将改善局域网广播流量。通过路由器代替交换机可以提供这种类型的隔离。我们很快看到这种隔离也能够经过一种交换解决方案来取得。
- 交换机的无效使用
如果该机构有不止三个组,而是有10个组,则将要求有10个第一级交换机。如果每个组都较小,比如说少于10个人,则单台96端口的交换机将足以容纳每个人,但这台单一的交换机将不能提供流量控制。
- 管理用户
如果一个雇员在不同的组间移动,必须改变物理布线,以将该雇员连接到不同的交换机上。属于两个组的雇员将使得问题更加复杂。
幸运的是,这些难题中的每一个都可以通过支持虚拟局域网的交换机来处理。顾名思义,支持VLAN的交换机允许经一个单一的物理局域网基础设施定义多个虚拟局域网。在一个VLAN内的主机彼此通信,仿佛他们(并且没有其他主机)与交换机连接。在一个基于端口的VLAN(port-based VLAN)中,交换机的端口(接口)由网络管理员划分为组,每个组构成一个VLAN,在每个VLAN中的端口形成一个广播域(即来自一个端口的广播流量仅能到达该组中的其他端口)。
将一个物理局域网作为多个虚拟局域网运行:
这样就做到了将EE VLAN帧和CS VLAN帧彼此隔离,在交换机端口8的用户加入CS系时,网络操作员只需要重新配置VLAN软件,使得端口8与CS VLAN向关联即可。
人们容易想象到VLAN交换机配置和操作的方法,即网络管理员使用交换机管理软件声明一个端口属于某个给定的VLAN(其中未声明的端口属于一个默认的VLAN),在交换机中维护一张端口到VLAN的映射表;交换机软件仅在属于相同VLAN的端口之间交付帧。
但是完全隔离两个VLAN带来了新的问题:来自EE系的流量如何发送到CS系呢?解决这个问题的一种方式是将VLAN交换机的一个端口与一台外部的路由器相连,并且将该端口配置为属于EE VLAN和CS VLAN。在这个情况下,即使EE和CS共享相同的物理交换机,其逻辑配置看起来也仿佛是电子工程系和CS系具有分离的经路由器连接的交换机。从EE发往CS的数据报将首先跨越EE VLAN到达路由器,然后由该路由器转发跨越CS VLAN到达CS主机。
幸运的是交换机厂商使得这种配置变得容易,网络管理员通过构建包含一台VLAN交换机和一台路由器的单一设备,这样就不再需要分离的外部路由器了。
现在假设CS没有分离开来,某些EE和CS的员工位于同一座建筑物中,他们需要网络接入,并且他们希望成为各自VLAN的一部分。图中显示了第二台8端口交换机,其中交换机接口已经根据需要定义为属于EE VLAN或CS VLAN,但是这两台交换机应当如何互联呢?
一种简单的解决方案是在每一台交换机上定义一个属于CS VLAN的端口(对EE也类似处理),并且将这两个端口彼此互连起来:
然而这种方式不具有扩展星,因为在每一台交换机上N个VLAN将要求N个端口直接互联到这两台交换机。
一种更具扩展性互联VLAN交换机的方法称为VLAN干线连接(VLAN trunking):
每台交换机上的一个特殊端口(左侧的16端口,右侧的1端口)被配置为干线端口,用来互联两台VLAN交换机。该干线端口属于所有VLAN,发送到任何VLAN的帧经过干线链路转发到其他交换机。但这会引起另外的问题:一个交换机怎样知道到达干线端口的帧属于哪个特定的VLAN呢?IEEE定义了一种扩展的以太网帧格式——802.1Q,用于跨越VLAN干线的帧。
虚拟局域网协议允许在以太网的帧格式中插入一个4字节的标识符,称为VLAN标记,用来指明发送该帧的工作站属于哪一个VLAN:
利用以太网交换机可以方便地实现虚拟局域网。VLAN是由一些局域网网段构成的与物理位置无关的逻辑组,这些网段都具有某些共同的需求,每一个VLAN的帧都有一个明确的标识符,指明发送这个帧的工作站是属于哪一个VLAN。
虚拟局域网其实只是局域网给用户提供的一种服务,而不是一种新型局域网。
虚拟局域网限制了接收广播信息的工作站数,使得网络不会因传播过多的广播信息(即“广播风暴”)而引起性能恶化。
2.4.5 PPP
数字链路层更像是一个数字通道,我们常常在两个对等的数据链路层之间画出一个数字管道,而在这条数字管道上传输的数据单位是帧。
早期的数据通信协议曾叫做通信规程(procedure),因此在数据链路层,规程和协议是同义词。
数据链路层传送的是帧:
数据链路层有三个基本问题:
- 封装成帧
- 透明传输
- 差错控制
1. 封装成帧
framing就是在一段数据的前后分别添加首尾部,就构成了一个帧,确定帧的界限。
首尾部的一个重要作用就是进行帧定界。
2. 透明传输
发送端的数据链路层在数据中出现控制字符“SOH”(其十六进制编码是01)或“EOT”(其十六进制编码是04)的前面插入一个转义字符“ESC”(其十六进制编码是1B),转发设备就会将EOT误认为是帧的尾部,后面的数据都会被接收端当作无效帧而丢弃:
字节填充或字符填充可以解决这种问题。接收端的数据链路层在将数据发送到网络层之前会删除插入的转义字符。如果转义字符也出现在数据当中,那么应在转义字符前面在插入一个转义字符。当接收端收到连续的两个转义字符时,就删除其中前面的一个。
用字节填充法解决透明传输问题:
数据透明度要求:必须允许数据字段包含标志模式<01111110>
。接收端接收到这个标志时,会将其看作数据还是标志字符?
发送方:在每个<01111110>
数据字节后面添加额外的<01111110>
字节;接收方接收到连续两个<01111110>
字节后会丢弃第一个字节,继续接收数据。而单个<01111110>
会被视作标志字节。
字节填充举例:
3. 差错检测
在传输过程中可能会产生比特差错:1可能变成0而0可能也会变成1.
在一段时间内,传输错误的比特占所传输比特总数的比率称为误码率(Bit Error Rate, BER),而误码率与信噪比有很大关系。
为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测机制。
点到点的数据连接控制
数据连接控制只包含一个发送者、一个接收者、一个连接,比广播连接更简单;也没有媒体访问控制,无需显式MAC寻址。
流行的点到点的数据连接控制:
- PPP(point-to-point protocal, 点到点协议)
- HDLC(High Level Data Link Control,高级数据链接控制)
用户到ISP的链路使用PPP协议:
PPP协议的组成:
1992年制定了PPP协议,经过1993年和1994年的修订,现在的PPP协议已经成为因特网的正式标准。PPP协议有三个组成部分:
- 一个将IP数据包封装到串行链路的方法
- 链路控制协议 LCP:用来建立、配置和测试数据链路连接的链路控制协议,通信双方需要协议一些选项
- 网络控制协议 NCP:每一个协议支持不同的网络层协议,如IP的网络层、OSI的网络层、AppleTalk网络层
PPP数据帧
-
首尾标志位:1 bit,帧定界符
-
地址:不执行任何操作(只有一种选择)
-
控制位:不执行任何操作,将来可能有多个控制领域
-
协议:帧的目的地址的高层协议
-
数据部分:需要传输的来自底层协议的数据部分
-
校验位:CRC轮询的错误检测
PPP的透明传输问题
当PPP用在同步传输链路时,协议规定采用硬件来完成比特填充(与HDLC的做法一样)。
当PPP用在异步传输时,就使用一种特殊的字符填充法:
-
将信息字段中出现的每一个 0x7E 字节转变成为 2 字节序列(0x7D, 0x5E)。
-
若信息字段中出现一个 0x7D 的字节, 则将其转变成为 2 字节序列(0x7D, 0x5D)。
-
若信息字段中出现 ASCII 码的控制字符(即数值小于 0x20 的字符),则在该字符前面要加入一个 0x7D 字节,同时将该字符的编码加以改变。
零比特填充:
-
PPP 协议用在 SONET/SDH 链路时,是使用同步传输(一连串的比特连续传送)。这时 PPP 协议采用零比特填充方法来实现透明传输。
-
在发送端,只要发现有 5 个连续 1,则立即填入一个 0。接收端对帧中的比特流进行扫描。每当发现 5 个连续1时,就把这 5 个连续 1 后的一个 0 删除
PPP协议的工作状态
-
当用户拨号接入ISP时,路由器的调制解调器对拨号做出确认,并建立一条物理连接。
-
PC机向路由器发送一系列的LCP分组(封装成多个PPP帧)。
-
这些分组及其响应选择一些PPP参数,和进行网络层配置,NCP给新接入的PC机分配一个临时的IP地址,使PC机成为因特网上的一个主机。
-
通信完毕时,NCP释放网络层连接,收回原来分配出去的IP地址。接着,LCP释放数据链路层连接。最后释放的是物理层的连接。