网络层次划分-数据链路层

网络层次划分-数据链路层
目录什么是数据链路数据链路层主要作用数据链路层的信道类型数据链路层协议的共性封装成帧透明传输差错检测链路层的载体——适配器局域网局域网分类局域网-以太网重新理解数据链路层MAC-CSMA/CD协议碰撞检测碰撞处理-截断二进制指数退避强化碰撞LLC-以太网中的MAC帧使用集线器的星形以太网在数据链路层扩展以太网虚拟局域网数据链路层主要作用网络层是进行网络与网络之间的通信即将数据报路由到目标网络。而到达目标网络后数据报需要根据局域网的类型不同把数据报转发给目标主机这个工作是交由每个网络自己的链路层协议去做的。在数据链路层保障可靠传输是可行的现在是传输层尤其是在一些质量差频繁出错的链路上数据链路层能更快处理错误但是随着链路质量的提高错误发生的不再那么频繁在数据链路层实现可靠性就显得太浪费了因为你需要在每段链路转发都执行保证可靠性的逻辑。因此可以把大部分可靠性的保证交给传输层提高效率。而数据链路层只负责处理简单的比特差错就算出处理比特差错也是直接丢弃报文最终还是得由传输层重传来保证可靠性。综上所述当前的数据链路层只是辅助传输层更快的发现比特差错不保证可靠性。数据链路层的信道类型尽管信道貌似是物理层的概念但是物理层只是关注信道的流通性等物理性质而在数据链路层关心的则是如何使用信道不同的使用方式可以抽象为不同的逻辑信道。点对点信道使用一对一的通信方式其它主机不会被通信双方造成影响。即通信双方逻辑上独占一条信道。广播信道使用一对多的通信方式一个主机发送消息其他主机都可以收到在这种情况下所有主机逻辑上共享信道。之所以说是逻辑上是因为逻辑和物理是不一样的我可以把多个信道的数据互相传递那么即使它是多个主机之间物理上使用的是不同信道我们也说他们在逻辑上共享一条信道而即使只有一根信道我们通过复用技术使不同主机的消息被隔离这也叫做逻辑上独占一条信道。数据链路层协议的共性封装成帧给上层下来的数据封装一层控制信息才可以在数据链路层控制数据的传输。这样的封装可能是给IP数据报的添加一个首部和尾部也可能是仅仅给它添加一个首部这取决于数据链路层的具体协议总之只要能控制数据传输就好。帧定界就是封装成帧的重要作用之一也就是回答“完整吗”这个问题。例如帧的首部和尾部可以各是一个特殊字符分别叫做帧开始符和帧结束符当然实际上还有别的东西这里只是举例子代表这个帧的区域边界接收方通过比对特殊字符来判断帧接收结束了以及帧开始接收了。帧的数据部分/(帧的首部尾部)越小数据传输效率就越低因此应该尽可能让帧的数据部分长一点但长也是有限度的这个限度就是MTU减少出错重传的开销减少帧太长导致的延迟适配物理介质比如路由器缓存等。除了帧定界知道这些还有什么用呢假如发送端在发送一个帧时突然终止发送并且又开始发送新的帧那么在接收端就可以发现上一个帧的结束符还没收到下一个帧的开始符就来了说明上一帧不完整那么我就把他丢弃。透明传输透明传输就是虽然数据链路层对数据做了协议控制但是收发双方看不到数据链路层对他的任何干扰像是没有一层一样他们只能看到数据。上述我提到过帧的首部是帧开始字符尾部是帧结束字符就可以规定出某帧的范围但我们使用的是特殊字符作为帧开始(结束)字符那么假如数据的内容就有特殊字符呢这样的话帧定界作用就会消失帧会被胡乱截断导致的结果就是帧包裹的数据也四分五裂了。当然上面的问题也有解决方法。那就是在把IP数据报封装成帧之前对它做一些小小的改动使它不会影响帧定界等接收方接收之后再还原IP数据报即可。具体来说在IP数据报中的帧开始(结束)符前面都添加转移字符假如本身IP数据报中有转义字符那就在它之前也添加转义字符这种方法叫做字节填充或者字符填充。这样一来就成透明传输了。差错检测首先必须区分比特差错和传输差错比特差错指的就是在数据传输过程中可能发生的0变成1,1变成0的错误传输错误的bit占传输bit总数的比率称为误码率(BER)目前广泛使用的比特差错检验方式是循环冗余检验CRC。而传输差错指的是传输过程中帧丢失帧重复帧失序帧到达的顺序乱了的错误(这可以由上层来解决)。而链路层的差错检测一般来说解决的是比特差错。但追根究底无论是比特差错还是传输差错可靠性还是由上层保证数据链路层只是更快的发现错误触发上层的可靠性保证机制。链路层的载体——适配器适配器是计算机与外界局域网连接的桥梁也称为网卡其上装有处理器和存储器RAM和ROM。计算机的硬件地址MAC地址就储存在网卡的ROM中这个地址具有唯一性。网卡的一些功能如下适配器和局域网之间的通信是通过电缆或者双绞线以串行方式传输的而适配器和计算机之间的通信是通过主板上的IO总线以并行方式传输的所以适配器的一个重要功能就是进行并行传输和串行传输的转换。适配器还有存储功能来协调网络数据率和计算机数据率的不一致。过滤功能过滤掉不是发给自己的帧。帧大致包括三种单播帧发给某人广播帧发给所有人多播帧发给一些人。对于单播帧网卡只需要对比自己的MAC和帧的目的MAC即可过滤对于广播帧网卡可以规定一个特殊的MAC只要目的MAC是这个就一概接受对于多播帧可以在操作系统启动的时候初始化网卡使网卡能识别某些MAC地址。适配器有自己的处理器在收发各种帧时不需要使用计算机的CPU他自己就能对帧的差错进行判断和处理发送接收以及交付帧。当网卡处于特殊的工作方式中时混杂方式他可以接收到所有发过来的帧这其实属于“窃听”但是对于网络的维护和管理统计一些信息还是有用的。局域网在这局域网中所有用户是互通的一台计算机发送数据局域网内的所有用户都能收到消息然后各用户判断帧内的目的MAC地址与自己网卡储存的硬件地址是否一致是就接收不是就丢弃。局域网分类按照网络拓扑可以分为星型网环形网总线网等局域网-以太网以太网采用简单灵活的无连接的工作方式即不用建立连接检查链路的连通性等就直接发送数据这和PPP协议繁琐的连接建立过程有明显的区别这是它不可靠交付的一个原因。以太网中不对帧进行编号也不要求对方进行回复它只管收发帧唯一保证的就是会丢弃出现比特差错的帧。这是它不可靠交付的另一个原因。对于解决多用户共享信道导致的用户信息之间的干扰问题以太网使用CSMA/CD协议载波监听多点接入/碰撞检测。以太网规定了最小帧的间隔是9.6微秒这样做是为了让收到数据帧的站点来得及清理缓存做好接受下一次帧的准备。重新理解数据链路层了解了局域网我们可以发现两台主机之间同时发送信息是会冲突的因此数据链路层不仅有控制数据的协议还可能有协调各台主机发送的协议。在OSI七层模型中数据链路层被划分为两个子层逻辑链路控制子层LLCLogical Link Control 负责建立和维护网络连接以及差错控制。介质访问控制子层MACMedium Access Control 负责控制物理介质如同轴电缆、双绞线的访问方式。MAC-CSMA/CD协议碰撞检测简单讲这个协议做的事情就是让网卡不断进行碰撞检测当两个站点同时发出信息时总线上的信号电压变化幅度会变大而网卡一但检测到这个幅度超出了一定的门限值就认为在发送消息的过程中发生了碰撞并停止继续发送消息等待一段时间。具体来说在发送消息之前发送方网卡首先在发送之前检测信道是否空闲即信道是否有电压变化如果信道空闲他就会发送消息不空闲他就会等待一会直到信道空闲再发送消息。在理想状况下CSMA/CD协议只做这一步似乎就够了。然而信号的传输速率是有上限的当一个站点发送数据的时候我们不可能立即检测到电压变化有可能在信号没传播到其他站点的时候其他站点检测到信道空闲因此就也发送了信号这样两种信号就会在信道中间发生碰撞那么如果这样的话发送方就不得不做另外的事情来避免这一情况的发生因此就算发送出数据后发送方网卡也会一直检测其周围电压变化幅度检测碰撞一但遇到碰撞传播到发送方发送方就会检测到碰撞并立即停止发送数据而已经发送的错误的数据会被接收方检测到并丢弃如图B检测到了传播过去的碰撞。说到碰撞的传播这就不得不提到碰撞最长需要多长时间才能传播过来假设两个站点A,B在一个局域网内A首先发送数据。我们知道站点在发送数据之前会检测信道是否空闲只要检测出不空闲就不会发送数据因此如果A传送数据的过程中发生了碰撞那么碰撞最迟会发生在A发送的第一个bit到达B之前因为如果第一个bit到达BB就不会发送数据也就没有碰撞这一说了。所以如果有碰撞则最迟发生在T传播时延后。而碰撞传播过来最长也需要T因此假设2T后我们还没有检测到碰撞那说明这次发送数据没有碰撞发生当然一个局域网中站点的距离是不同的T的取值也不同我们肯定是以最大的为准。这个2T叫做争用期也叫做碰撞窗口本质上是局域网中距离最远的两端的端到端的往返时间。一直到现在可能你以为这个碰撞检测策略已经结束了但实际上虽然我可以控制发送方的网卡让它最少也得检测碰撞2T时间以至于不漏掉传播中间碰撞的情况但是假设碰撞还没有传播到发送方发送方已经把数据发送完了那网卡怎么能检测到碰撞的产生呢上面的情况翻译为没等到2T时间A就已经发送完数据了从而检测不出碰撞。解决方法出乎意料的明了那就是保证发送方发送数据的大小一定是:带宽(bit/s)*2T也就是限制帧的最小长度如果帧太小就填充字节进去因此帧长度不仅有最大值也有最小值。那么假设接收方收到了不够带宽(bit/s)*2T大小的帧就可以直接丢弃了这也是接收方判错的一种方式。至此碰撞检测策略才结束了。注在以太网中标准争用期是51.2微秒这是根据以太网的最长长度和速率等相关信息计算出来的。落实到具体的信道上也可以用比特数来表示争用时间51.2微秒可以在该信道发送的bit数是512比特那么该以太网的争用期就可以用512比特代替。、碰撞处理-截断二进制指数退避发生碰撞的几个站如果同时检测到信道空闲就会再次重新发送这样就会再次碰撞因此碰撞后不是立即重新发送数据也不是信道一空闲后就发送据而是每个站点随机选择一个时间去等待退避时间一过就尝试发送这依赖于网卡暂存上一次发出的帧。这样一来幸运地选到最小退避时间的站点就率先发送数据。为了尽可能减少重传时再次发生冲突的概率截断二进制退避算法做出如下规定基本退避时间为一个争用期。碰撞后发送方从【0,1,...,(2^K-1)】之中随机选一个数记作r退避时间就是r倍的争用期。而k的取值为Min【重传次数10】。可以发现碰撞后尝试重传的次数越多发送方越可能等待更长时间这叫做动态退避。当重传次数达16次仍不成功时就丢弃该帧向上禀告。强化碰撞碰撞发生后为了让局域网所有的主机都知道碰撞产生了检测到碰撞的发送方需要发送一段认为干扰信号用以强化碰撞效果增强碰撞传播距离等。LLC-以太网中的MAC帧类型字段表示上一层使用的是什么协议以便把帧的数据部分交给目标主机上一层的这个协议来处理这意味着以太网协议支持多种上层协议即一个主机可以同时存在几种同一层的协议即两个主机可以使用不同的协议通信但是主机双方的协议类型必须一致。数据链路层会根据MAC帧中的类型字段来交付数据给上层非常灵活FCS字段CRC帧检验序列检验范围是整个MAC层的帧不包括物理层添加的8字节字段。填充字段以太网保证传输的帧不小于最小值的方法就是在IP数据报的后面添加填充字段图中没有显示而不是在整个MAC帧后面。因为如果放在整个MAC帧后面我们明显需要在MAC帧中添加一些字段来保证我们能区分哪些是填充的无用字段并剥离它。然而如果我们将填充字段放到IP数据报里面我们就可以利用IP数据报中的数据报长度字段在上层网络层剥离填充字段而不用在MAC帧中新增字段。前同步码在发送MAC帧前会给MAC在包一层字段来实现物理层的一些目的。前同步码是用于在传输真正的帧之前给接收方一些时间去把时钟同步起来利用曼彻斯特的自同步能力我们的宗旨是在传第一个bit之前就同步好时钟一个bit都不有偏差。帧开始界定符告诉接收方真正的帧从哪儿开始。注上面并没有提到帧开始界定符前同步码中有但是另有用途和帧结束界定符接收方如何判定接收的帧的开始和结尾依靠两点曼彻斯特编码传输每个比特的时候都会有跳变接收方可以通过判断电压变化来感知一个帧的结束和开始有跳变帧就开始了没跳变帧就结束了。对比不归零制编码假设接收方感知到连续的低电平那么这个低电平到底代表连续的0还是根本没有数据传输是不清楚的帧不是连续发送的每发送一个帧都要停几秒即以太网中的最小帧间隔时间这让接收方能区分帧与帧。使用集线器的星形以太网集线器是一种具有少量容错能力比如断掉和一个不断发废物消息的主机的联系以保证整个网络的稳定和少量网络管理能力比如端口状态流量统计碰撞统计错误帧统计等的转发器。说他是转发器也就意味着他只是无脑转发帧对碰撞的阻止等功能一概没有。总之它目的在于让网络不在那么复杂每两个主机都要接一根线它链接的网络逻辑上仍然是然是是总线型以太网因此这种以太网依然是同一时刻只允许一个站点发送数据的网络。在数据链路层扩展以太网交换机不像集线器他是工作在数据链路层的机器因为它有对帧的处理功能不再是无脑转发。交换机主要的功能如下相通信的主机独占传输媒体无碰撞地传输数据全双工通信从广播到点对点转发即自学习功能广播一次就能记住映射关系下次就是点对点转发注交换机消除碰撞的前提是所有主机都有单独的信道与交换机相连而如果是像下图这种情况交换机只能缓解碰撞它的工作原理是这样的在交换机上有左右两个接口实际上就是交换机只有两个端口这两个端口分别被左右两侧的主机共享了每次有数据报经过的时候他会分析数据报的源mac地址从而得知这个mac地址的主机在交换机的左右侧。一段时间后交换机就知道了每台主机在交换机的左侧还是右侧他就可以选择性转发数据报如果确定数据报的目的MAC在右边他就不会把数据报转发到左边。除此之外一但一侧发生碰撞交换机也能得知他就会阻止碰撞扩散两侧互不影响。虚拟局域网简单来讲局域网就是实现一种划分机制通常需要协议和交换机配合完成将一个局域网再划分为多个小的逻辑上的局域网。说它是逻辑上的局域网就是说实际上他们还是一个局域网只是逻辑上我们给他们不同的身份。具体实现就是再MAC帧中再插入一个字段VLAN标签它相当于每台主机的令牌令牌一样的就是一个局域网内的而交换机呢他只会给与发送方身份一样的的主机端口广播或者点对点转发帧这样就在逻辑上隔绝开了两组主机。虚拟局域网不只是可以由一个局域网得到主机划分得到即一个虚拟局域网的主机可以是不同属于局域网的主机。