目录
3.4.3 交换机(Switch):数据链路层(多接口网桥)
数据链路层的协议有多种,但有三个基本问题是共同的,分别如下:
- 封装成帧:在一段数据(IP数据报)的前后分别添加帧首部和帧尾部
- MTU(Maximum Transmission Unit):数据链路层中的最大传输单元(网络层传输给数据链路层的IP数据报的最大长度)
- MTU越大,帧中包含的有效数据越多,单次传输的数据量越多,传输次数越少,网络开销越小(优点)
- MTU越大,占据链路的时间越长,网络延迟就会变大;而且如果一大段数据里面有一个 bit 出错了,这一大段就会整个重传,重传的代价是很大的(缺点)
- 发送的数据过大:分片操作(每个片都需要添加上IP首部)
- 发送的数据过小:填充操作,在实际数据内容后面添加填充数据,使得数据包总长度达到最小长度要求(填充数据可以是任意无意义的字节,例如全0或全1的数据)
- MTU的默认值是1500字节
- 帧首部、帧尾部:帧定界(确定帧的界限),并包含重要的控制信息
- 控制字符SOH(Start of Header):放在帧首部,标识帧开始(二进制00000001)
- 控制字符EOT(End of Transmission):放在帧尾部,标识帧结束(二进制00000100)
- 透明传输:
- 问题引入:帧的数据部分可能包含与帧首部/帧尾部控制字符编码相同的比特组合,数据链路层会错误地认为其是帧的边界。
- 解决方案:字节填充(byte stuffing) 或 字符填充(character stuffing)
- 发送端的数据链路层:在帧的数据部分出现的“SOH”或“EOT”字符前面插入一个转义字符ESC(二进制00011011)
- 接收端的数据链路层:在将数据送往网络层之前,删除插入的转义字符
- 注:如果原始数据中包含转义字符ESC,则应在转义字符前面再插入一个转义字符ESC。当接收端收到连续的两个转义字符时,就删除其中前面的一个。
- 透明:指某一个实际存在的事物看起来却好像不存在一样
- “在数据链路层透明传送数据”表示无论发送什么样的比特组合的数据,这些数据都能够按照原样没有差错地通过这个数据链路层。
- 注:不同数据链路层协议实现透明传输的方式不同,使用的转义字符也各不相同,但是都必须实现透明传输。
- 差错控制:
- 问题引入:在传输过程中可能会产生比特差错,使得1可能会变成0,而0也可能变成1。为了保证数据传输的可靠性,在计算机网络传输数据时,必须采用各种差错检测措施。
- BER(Bit Error Rate, 误码率):在一段时间内,传输错误的比特占所传输比特总数的比率(误码率与信噪比有很大的关系)
- 解决方案:循环冗余检验CRC(广泛使用) → 类比“寄书”
- 发送端:假定数据划分为组(每组k位),在每组后面添加供差错检测用的n位冗余码
- 接收端:对收到的每一帧进行同样的CRC检验
- 余数R=0:判定帧没有差错 → 接受
- 余数R≠0:判定帧有差错 → 丢弃
- 冗余码的计算:假设原始数据为M,添加冗余码的位数为n位,除数为P(每种协议都必须事先定义好,且发送方和接收方都悉知)
- Step1:用二进制的模2运算进行 乘M 的运算(相当于在M后面添加n个0)
- Step2:将Step1得到的(k + n)位数 除以 (n+1)位的除数P,得出商Q、n位余数R
- Step3:将余数R作为冗余码拼接在数据M后面,一起发送出去。
- 注:除数的位数 要比 冗余码的位数 多1位
- CRC VS. FCS:
- CRC(Cyclic Redundancy Check, 循环冗余检验):一种常用的检错方法
- FCS(Frame Check Sequence, 帧校验序列):添加在数据后面的冗余码
- FCS可以用CRC这种方法得出,但CRC并非用来获得FCS的唯一方法。
- 无差错接受 VS. 无差错传输/可靠传输 VS. 无比特差错:
- 无差错接受:凡是接收端数据链路层接受的帧(即不包括丢弃的帧),我们都能以接近于1的概率认为这些帧在传输过程中没有产生差错(有差错的帧就丢弃而不接受)。对于CRC差错检测算法,只要经过严格的挑选,并使用位数足够多的除数P,那么出现检测不到的差错的概率就很小很小。但这种检测方法并不能确定究竟是哪一个或哪几个比特出现了差错。
- 无差错传输/可靠传输:所有发送的数据都能被无差错接受(即发送什么就收到什么)
- 无比特差错:
- 注1:仅用循环冗余检验CRC差错检测技术,只能做到无差错接受,不能实现“无差错传输”或“可靠传输”。若要做到“无差错传输”,就必须再加上确认和重传机制。
- 注2:本章介绍的数据链路层协议都是不可靠传输的协议。
- 小结(重要!!!):当传输数据为ASCII 码打印字符组成的文本文件时,传输数据不可能含有控制字符(SOH/EOT/ESC等),此时无需考虑透明传输;当传输数据为图片或程序时,传输数据就可能含有控制字符(SOH/EOT/ESC等),此时需要考虑透明传输。
对于点对点的链路,目前使用的数据链路层协议有:
封装成帧
PPP 帧的首部和尾部分别为4个字段和2个字段:
透明传输
问题引入:当帧的数据部分包含与帧首部/帧尾部编码相同的比特组合时(即数据部分出现0x7E),如何解决?
- PPP用在同步传输链路:
- PPP协议用在SONET/SDH链路时,使用同步传输(一连串的比特连续传送)。这时 PPP 协议采用零比特填充方法来实现透明传输。
- 同步传输:
- 前同步码:同步发送端和接收端的时钟,规定单位比特所占时间
- 透明传输的实现:零比特填充(硬件实现)(同HDLC)
- 发送端:只要发现有5个连续1,则在后面插入1个0(即便数据含有0x7E,插入0后,接收端就不会将其视为帧定界符,从而正常接收)
- 接收端:只要发现有5个连续1,则删除后面的1个0
- PPP用在异步传输:
- 异步传输:逐个字节地传送,且每个字节的前面添加低电平的起始位 以及 后面添加高电平的停止位
- 透明传输的实现:字符填充 或 字节填充
- 当信息字段中出现字节0x7E,则转变成为2字节序列(0x7D, 0x5E)
- 当信息字段中出现字节0x7D, 则转变成为2字节序列(0x7D, 0x5D)
- 当信息字段中出现ASCII码控制字符(即数值小于0x20的字符),则在该字符前面要插入一个0x7D字节,同时将该字符的编码加以改变。
PPP 协议不使用序号和确认机制,有如下几点原因:
- 在数据链路层出现差错的概率不大时,使用比较简单的PPP协议较为合理。
- 在因特网环境下,PPP的信息字段放入的数据是IP数据报。数据链路层的可靠传输并不能够保证网络层的传输也是可靠的。
- 帧检验序列FCS字段可保证无差错接受。
家庭用户的电脑通过网线连接光猫(调制解调器),再通过电话线连接Internet,建立PPP拨号的过程:
PPP 协议的3个工作步骤:
- 阶段1:LCP协商阶段(链路建立阶段)
- 全称:Link Control Protocol 链路控制协议
- 作用:协商端口参数,如下所示
- MRU:最大接收单元
- 认证协议:采用何种身份验证方式(PAP认证?CHAP认证)
- 魔术字:随机数(请求和确认的魔术字需要一致,指明某一确认报文是针对哪一请求报文的回复)
- 阶段2:身份认证阶段(两种方式)
- 方式1:PAP认证
- 全称:Password Authentication Protocol 密码认证协议
- 特点:密码在网络中以明文形式传输
- 方式2:CHAP认证
- 全称:Challenge Handshake Authentication Protocol 质询握手认证协议
- 特点:加密认证
- 原理:首先,由服务器端给客户端发送挑战challenge(携带随机数),客户端根据challenge 对口令进行加密,算法是md5(password,challenge,ppp_id)。然后,客户端将加密结果MD5发送给服务器端,服务器端从数据库中取出口令password2,同样进行加密处理md5(password2,challenge,ppp_id)。最后,比较加密的结果是否相同。如果相同,则认证通过,向客户端发送认可消息。
- 注:若在LCP协商阶段,双方都不要求身份认证,则不需要经过阶段2(即直接从阶段1跳到阶段3)
- 阶段3:IPCP协商阶段(网络层协商阶段)(两种方式)
- 全称:Network Control Protocol 网络控制协议
- 注:NCP为统称,具体到TCP/IP中的IPCP,N指的是IP
- 作用:协商网络参数
- 方式1:静态IP地址(两端地址不冲突,且在同一个网段内)
- 方式2:动态IP地址(IP地址自动配置)
- 当计算机拨号上网时,营运商会给计算机自动分配一个IP地址
阶段1:
阶段2:
阶段3:
- 总线型拓扑结构:使用同轴电缆组建的局域网(早期) à 广播信道
- 问题引入:若两端不添加匹配电阻,则信号无法反射,即无法通信;若两端添加匹配电阻,则电阻会吸收能量。(无法克服的弊端)
- 解决方案:引入“集线器”(见下)
- 星型拓扑结构:使用集线器组建的局域网(2000年以前) à 广播信道
- 问题引入:若多个设备在共享的广播信道上同时发送数据,则会造成彼此干扰,导致发送失败。
- 解决方案:引入“CSMA/CD”机制通信(见“3.3.4节”)
- 注1:CSMA/CD就是广播信道使用的数据链路层协议,凡是使用CSMA/CD协议的网络就是以太网。
- 注2:使用CSMA/CD协议的以太网不可能进行全双工通信,只能进行半双工通信(双向交替通信)。
- 注3:由于点到点链路不用冲突检测,因此没必要使用CSMA/CD协议。
- 问题引入:在数据发送期间,计算机A没有收到碰撞信号,60比特的数据全部成功发送完毕。但是,在数据传输期间,计算机A的信号和计算机B的信号在链路C处发生了碰撞。此时,当碰撞信号返回到A时,A无法判断该碰撞信号是哪一台计算机导致的,即A无法得知自己发送的帧是否发生了碰撞。因此,为了确保能够检测到发送的帧在总线上是否产生冲突,以太网的帧不能太短(否则就有可能检测不到自己发送的帧产生了冲突)。
- 以太网最短帧:带宽 * 2倍单程传播时延
- 示例:以太网设计最大端到端长度为5km(实际上的以太网覆盖范围远远没有这么大),单程传播时延为大约为25.6μs ,往返传播时延为51.2μs ,10M标准以太网最小帧为:
- 分析:如果以太网发送数据帧的前64字节没有检测出冲突,则后面发送的数据就一定不会发生冲突。换句话说,如果发生碰撞,就一定在发送前64字节之内。由于一旦检测出冲突就立即终止发送,这时发送的数据一定小于64字节,因此凡是长度小于64字节的帧都是由于冲突而异常终止的无效帧,只要收到了这种无效帧,就应当立即将其终止。
- 注:以太网的带宽越大,所需的最短帧就越大
计算机要想知道发送的帧在链路上是否发生碰撞,必须等待2τ (争用期)。以太网使用截断二进制指数退避(truncated binary exponential backoff)算法来解决碰撞问题。
k=Min[重传次数,10]
常用的以太网MAC帧格式有如下2种标准:
- Ethernet V2标准(以太网V2标准):使用最多
- IEEE的802.3标准
Ethernet V2标准的帧比较简单,由五个字段组成:
- 前两个字段:目标MAC地址(6个字节)、源MAC地址(6个字节)
- 第三个字段:类型字段(2个字节)
- 作用:标志上一层使用的是什么协议,以便把收到的MAC帧的数据上交给上一层的这个协议。
- 0x0800:上层使用的是IP数据报
- 0x8137:该帧是由Novell IPX发过来的。
- 第四个字段:数据字段(46~1500字节)
- 最大传输单元:1500字节
- 最小传输单元:46字节
- 最小传输单元 = 64字节(以太网最短帧) - 6字节(目标MAC地址) - 6字节(源MAC地址) - 2字节(类型字段) - 4字节(FCS)
- 填充操作:当数据字段的长度小于46字节时
- 发送端的数据链路层:在数据字段的后面加入一个整数字节的填充字段,以保证以太网的MAC帧长不小于64字节
- 接收端的数据链路层:根据网络层首部得知IP数据报的长度,从而将填充字节去掉
- 最后一个字段:帧校验序列FCS(使用CRC检验)(4个字节)
IEEE802.3标准规定,凡是出现下列情况之一,即视为无效的MAC帧:
- 情况1:帧的长度不是整数个字节
- 情况2:使用CRC对收到的帧进行检验,查出有差错
- 情况3:收到的帧的总长度不在64~1518字节之间 或 数据字段的长度不在46~1500字节之间
- 注:对于无效的MAC帧,简单地丢弃,以太网不负责重传丢弃的帧。
传统以太网最初是使用粗同轴电缆,后来演进到使用比较便宜的细同轴电缆,最后发展为使用更便宜和更灵活的双绞线。
要是两个集线器的距离超过100米,还可以使用光纤将两个集线器连接起来。集线器之间通过光纤连接,可以将相距几千米的集线器连接起来,需要通过光电转换器,实现光信号和电信号的相互转换。
- 问题引入:使用集线器进行以太网的扩展,会导致冲突域变大。如何降低冲突、优化以太网?
- 解决方案:引入“网桥”
使用网桥优化以太网,对于网络中的计算机是没有感觉的,也就是以太网中的计算机是不知道网络中有网桥存在,也不需要网络管理员配置网桥的MAC地址表,因此我们称网桥是透明桥接。
- 网桥MAC地址表的自动构造:网桥接入以太网时,MAC地址表是空的。网桥会在计算机通信过程中,自动构建MAC地址表,这称为“自学习”。
- 自学习:网桥接口收到一个帧,就要检查MAC地址表中与收到的帧源MAC地址有无匹配的项目
- 有匹配MAC地址:更新原有的项目
- 没有匹配MAC地址:在MAC地址表中添加该接口和该帧的源MAC地址对应关系,以及进入接口的时间
- 转发帧:网桥接口收到一个帧,就要检查MAC地址表中与收到的帧目标MAC地址 有无匹配的项目
- 有匹配MAC地址:将该帧转发到对应的端口
- 没有匹配MAC地址:将该帧转发到全部端口(接收端口除外)
- 注:MAC地址表并不是永恒不变的,比如A、B在某一时间内不通信,则会删除A以及B的MAC地址和接口对应关系
随着技术的发展,网桥接口增多,网桥的接口就直接连接计算机了,网桥就发展成现在的交换机。
- 问题引入1:一般情况下,组网拓扑如下图所示,但是存在一定的缺陷(单点故障会导致网络中断)。
- 缺陷1:一旦汇聚层交换机出现故障,不同教室的计算机之间将无法通信,并且所有的计算机都将无法访问Internet上网。(本节重点研究)
- 缺点2:一旦路由器出现故障,则所有的计算机都将无法访问Internet上网。(本节不研究)
- 解决方案1:设计“高可用/健壮性”的网络拓扑结构(添加汇聚层交换机、路由器)à 避免单点故障导致网络中断
- 问题引入2:如何设计网络,既能实现网络的高可用,又不会造成广播风暴?
- 广播风暴:交换机组网是一个广播域,当某台计算机发送广播包(目标MAC地址为全1)时,广播数据会在环中来回转圈(大环、小环、正向、逆向),导致交换机的灯狂闪,计算机正常上网的流量都没有机会转发。
- 交换机的MAC地址表快速翻转(消耗交换机的性能)
解决方案2:生成树协议(Spanning Tree Protocol, STP)
- 目的:防止交换机冗余链路产生的环路,确保以太网中无环路的逻辑拓扑结构,从而避免了广播风暴大量占用交换机的资源。(在提高网络可靠性的同时,又避免环路带来的问题)
- Step1:选举“根网桥/根交换机”、“非根交换机”
- 对象:所有的交换机
- 依据:网桥ID(BID)最小者当选
- 优先级:网络管理员可以自行配置网桥的优先级
- 基本MAC地址:交换机除了每个端口的MAC地址外,还有一个基本MAC地址(即VLAN1的MAC地址)
- Step2:选举“根端口”(Root Port, RP)
- 对象:每一个非根交换机(有且仅有1个)
- 依据:
- BPRU接受端口到根交换机的路径成本最小(路径成本与链路带宽有关,本例中使用“1Gbit/s”和“100Mbit/s”两种链路带宽)→ 可选举出交换机B、交换机C的根端口
- 对端的网桥ID最小 → 可选举出交换机D的根端口
- 对端的端口ID最小 → 可选举出交换机E的根端口
- Step3:选举“指定端口”(Designated Port, DP)、阻塞“备用端口/剩余端口”(Alternative Port, AP)
- 对象:每一个网段(有且仅有1个) → 一条网线就是一个网段
- 依据:
- 根交换机的所有端口都是指定端口
- 根端口的对端端口一定是指定端口
- BPDU转发端口到根交换机的路径成本最小
- 本端的网桥ID最小
练习题