您的位置:首页 > 理论基础 > 计算机网络

TCP/IP详解学习笔记——数据链路层(1)

2015-07-02 20:55 555 查看
一 概述
在整个TCP/IP协议簇中,数据链路层的作用是发送和接收IP层数据,它也用来发送其他协议的数据,这些协议往往是IP层的辅助协议,比如ARP协议等。数据链路层有很多不同的种类,最常见的是以太网(Ethernet)和Wi-Fi。我以为,数据链路层就是局域网,网内的节点之间的通信是不需要经过更高层的协议的,比如IP层等。但是由于该层种类比较多比较杂,所以涉及到的协议也是比较多的。

二 以太网和IEEE 802 LAN/MAN标准
先让我们对以太网有个感性的认识。通常认为,以太网就是一些能上网的设备连接在一条公用电缆上,彼此之间能互相通信,这就是一个以太网。



那么某个设备什么时候该发送数据,什么时候接收数据呢,这个过程又怎么控制呢,这就需要在每个接口上都有一套特定的算法去处理,也就是协议。
一个比较流行的协议是CSMA/CD(Carrier sense multiple access with collision detection),即带冲突检测的载波监听多路访问技术。它的工作原理是:发送数据前,先监听信道是否空闲,若空闲,则立即发送数据。如果信道忙碌,则等待一段时间直到信道空闲之后再发送数据。如果有两个或两个以上的节点同时发送数据,则判定为冲突,这时立即停止发送数据,等待一段随机时间之后再重新尝试。在同一时间,必定只有一个机器在信道上传送数据。该协议原理比较简单,技术上容易实现,并且不需要集中控制,所以得到广泛的应用,但是当网络负载增大时,发送时间增长,发送效率急剧下降。像CSMA/CD这样控制设备接入信道的协议,叫做MAC(media
access control)协议,MAC协议有很多种,比如CSMA/CD这种是基于竞争的,还有的是基于实现协调好的,比如事先规划好每个设备占用信道的时间。
早期的以太网传播速度大概是10Mb/s,那时像CSMA/CD这种基于竞争的协议是比较流行的,后来随着速度的提升,逐渐到了100Mb/s,1000Mb/s甚至10Gb/s,基于竞争的和共享信道的以太网慢慢变少,取而代之的是星形拓扑结构。



如图所示,各设备通过线缆与交换机接口连接,组成一个星形拓扑结构。设备直接与交换机进行通信,发送数据或者接受数据(全双工/半双工).
除此之外,现在非常流行的一种接入网络的结束就是WiFi(Wireless Fidelity),虽然它和有线网络不太一样,但是帧格式和大概的接口都是从有线网络(802.3标准)借鉴过来的。在详细讨论之前,我们先看一下数据链路层一些标准的总体框架。
1.IEEE 802 LAN/MAN标准





可以简单的将这些协议分成三个部分。第一个部分是802.2和802.1,定义了LLC(Logical Link Control)和MAC(Medium Access Control),其中,LLC用于设备间单个连接的错误控制和流量控制,而MAC用于解决多个设备接入介质时产生竞争,如何分配信道的使用权的问题,我们前面介绍过的CSMA/CD就是MAC的一种,LLC将在后面有详细的介绍。第二部分是802.3,标准以太网协议。第三部是802.11,主要跟Wi-Fi有关。最后的暂时忽略吧。

2.以太网帧格式
在数据链路层传输的数据单元,我们成为帧(frame),于此相对应的,IP层数据单元成为包(packet),传输层为分节(segment)。所有的以太网(802.3)帧都是基于同一种格式。如下图所示。



需要说明的是,由于历史原因,以太网帧格式是有变化的,这里讨论的是IEEE802.3标准制定的帧格式,由于笔者也是初学者,并不明白如今用的比较多的是不是这个标准的帧格式,相关的问题,请参照
http://support.huawei.com/ecommunity/bbs/10154435.html

继续看帧格式,开始的7字节,称之为前导码(preamble),用于同步,接下来的一个字节是开始帧标志(SFD),SFD值固定,为0xAB。接下来的12字节分别是目的地址(DST)和源地址(SRC),也就是我们常说的MAC地址、物理地址或者硬件地址等。当然,这里的目的地址可以指一个特定的单一设备的mac地址,也可以是多个地址,这个时候,就是广播或者多播了。
紧接在原地址字段后面的是长度或者类型字段,该字段一些常见的值有0x800代表IPv4,0x86DD代表IPv6,0x0806代表ARP协议,如果是0x8100则可以表示虚拟局域网(virtual LAN)。基本的以太网帧长度是1518字节,但最近的标准扩展到了2000字节。接着是数据或者说有效载荷部分,一般是上一网络层的协议数据单元(PDU),比如IP层的packet.通常有效载荷是1500字节,如果不足1500时,则在后面添加0字节来保证需要的长度。
在有效载荷后面的四个字节称为帧校验序列(FCS),目的是让接收帧的网卡或者接口判断发送过来的帧是否出现了错误。其过程如下:发送方组装一个帧数据时,将所有字节(典型的是从目的地址到有效载荷部分)执行一个CRC计算,并将这个计算结果放入FCS字段,作为帧的一部分传输给目的端口。当目的端口接受到这帧数据时,它会用同样的方法做CRC计算,并将结果与FCS字段对比,如果相同则说明数据正确,否则数据发生错误,可能需要丢弃。
另外,需要说明一下的是帧的大小。以太网帧大小是有限制的,有最大值和最小值。最小值是64字节,其中必须包括48字节的有效载荷,不足的当然就需要补0了。最大值通常是1518字节,包括4字节的FCS和14字节的协议头。这样有什么好处呢,如果发生错误,比如检测到FCS校验错误,那么只需要丢弃这1518字节的数据,损失比较小。不好的地方在于,如果需要发送的数据很大,那么就需要发送很多帧的数据,每一帧数据都包含了FCS和协议头,这就使得传输效率比较低,这其中就存在一个取舍平衡的问题。

以上就是802.3标准以太网帧格式的大致内容,有些看上去很奇怪,勉强能懂,但是有点模模糊糊,可能马上就忘了。彻底弄懂的方法是把一个正在传输的以太网帧数据抓一个拆开看看,这里推荐工具wireshark。具体使用方法就不细说了,可以google一下。

3.虚拟局域网(virtual LAN)
我们之前提到过,现在连接局域网越来越多的使用交换机,构成星形拓扑结构。这样做的好处是任何一个设备能够直接与网内的其他设备进行通信,同样,进行广播或者多播的时候也是很方便的。但是缺点是,任何设备都能很方便的进行广播和多播,这样会带来安全隐患,比如广播风暴等。为了解决这个问题(当然,也不仅仅是这个原因),就出现了虚拟局域网。
虚拟局域网是一组逻辑上的设备和用户,这些设备和用户并不受物理位置的限制。不同的虚拟局域网之间不能像在一个局域网中那样进行通信,哪怕他们实际上处于同一个局域网。所以如果将一个大的局域网划分多个虚拟局域网,就可以大大减少广播风暴的可能性。此外,不处于同一局域网的设备,也能添加到同一虚拟局域网内,因此,我们说虚拟局域网是一个逻辑上的概念,逻辑上的同一局域网。
有很多种划分虚拟局域网的方法。(1)按端口划分VLAN。比如将一个交换机的1、2、3、4划分为虚拟局域网A,将5、6、7、8划分为虚拟局域网B。这种方法是最常见的,也是非常简单明了的,缺点是局限在同一个交换机上。(2)按照mac地址划分VLAN。根据主机的mac地址划分。这种划分方法的好处是当用户物理位置移动时,比如从一个端口换到另一个端口,甚至从一个交换机换到另一个交换机时,不需要重新配置,缺点是,初始化配置时,效率比较低,想想看如果有几百个设备需要配置,工作量是很大的。另外,比如笔记本可能有时候会更换网卡,这就需要重新配置了。(3)按照IP地址划分VLAN等等,不再细说。
基本的VLAN是由802.1q标准制定的,在以太网帧的基础上增加了VLAN头,用VLAN ID把用户分为更小的工作组,每一个工作组(相同的VLAN ID)就是一个虚拟局域网,不同工作组之间的用户访问是收到限制的。

4 链路聚合(Link Aggregation)
链路聚合是指将多个物理端口捆绑在一起,成为一个逻辑端口。比如一个系统只有两个低速端口,可以使用链路聚合技术讲两个端口捆绑,让系统得到一个“高速端口”,这个高速端口的速度大于两个低速端口的最大速度,但小于两个端口速度之和。实际上,这个高速端口只是逻辑上的,实际中是由着两个成员端口分担负荷,用起来好像是一个端口一样。当然,什么时候使用哪个端口进行传输,以及怎样知道哪些端口可以用于链路聚合,这是需要一些协议去控制的。

三 全双工(Full Duplex)、省电功能(Power Save)、自动协商(Autonegotiation)和流量控制(Flow Control)
以太网刚出现的时候,只能通过共享的线缆进行半双工模式的数据传输。数据在同一时间只能单向传输。随着以太网的发展,出现了交换机,不再使用共享的线缆,设备在同一时间能够互相交换数据,而不是单向传输数据。特别是有了全双工的传输方式后,不用担心冲突检测的问题了(CSMA/CD)。
然而这样有个问题,新的设备全双工、速率高,老的设备可能只支持半双工、速率可能比较低,我们必须将需要通信的端口配置成合适的工作模式才能正常通信。这样比较麻烦,幸运的是很多接口具备自动协商机制,它能告知对方自己的网速、双工状态等信息,并且接收对方的信息,从而自动协商出一个最佳的工作状态。这就是自动协商机制(Autonegotiation)。

1.双工不匹配(Duplex Mismatch)
当通信的双方使用不同的双工模式,或者当其中一方具备自动协商功能但另一方不具备该功能时,就会发生一些不太好的现象,我们叫做双工不匹配(Duplex Mismatch)。它不会导致通信失败,但是会使得通信的性能下降。举个例子。当有大量数据需要互相传输时,半双工模式的接口在发送数据时检测到有数据传过来(CSMA/CD),此时会停止传输并丢弃收到的数据,这样会导致丢失的数据需要上一层(比如IP层或者传输层)重新传输,这就导致了性能的下降。然而这种现象不容易被发现,因为当传输载荷比较低时,半双工接口检测到冲突的可能性比较小(载荷低时,发送数据的概率小,发送数据的同时接收数据的概率更小)。

2.局域网自动唤醒、省电功能、Magic Packets
在linux和windows系统中,都有自动唤醒功能,自动唤醒的意思就是将电脑从低电模式(睡眠模式)切换到满电模式(full-power)。这可以通过设置来得到,比如可以设置如果系统收到某些特定的数据,就能触发自动唤醒功能。常用的有以下几种:物理层活跃(p),以单播方式发往该设备的帧(u),广播帧(b),多播帧(m),ARP帧(a),还有magic packet帧(g)等,可以通过设置,使得当设备收到特定类型的帧数据时,可以自动唤醒。
需要说明的是,这个magic packet通常是由udp封装,有着特定的帧格式,里面还包含着目的设备的mac地址,或许还有密码。如果一个设备设置了magic packet唤醒,其网卡会接收magic packet数据,并判断其中的mac地址和密码是否与自身吻合,如果吻合,则自动唤醒。 我想,magic packet的意思在于,只有特定的帧才能唤醒,而不是任意的u、b、m或者a(或许无意间)将其唤醒。

3.数据链路层流量控制
当多个设备向同一个目的设备发送数据,或者当发送数据的速度大于数据传输的速度时,交换机需要将这些数据先存起来,然后再发给目的设备,如果存储的时间太长,数据将会丢失。
因此,需要进行流量控制。流量控制的原理很简单,当发送上述现象时(数据丢失),交换机会发送暂停(PAUSE)信号给发送方,让其停止发送或者降低发送速度,从而缓解网络的拥塞程度。其中,PAUSE信号是包含在上面介绍的以太网帧格式中的。
但是数据链路层的流量控制并没有得到广泛的应用,因为它有个非常明显的缺点。当一个交换机超载时,它会给所有向它发送数据的设备发送PAUSE信号,但是,造成交换机超载的可能只是其中的某一个设备而已,这就造成了错误的给其他设备发送PAUSE信号。

四 网桥和交换机
网桥,或者交换机,是一种将多个数据链路层网络(以太网)或者多个设备连接成一个网络的设备。比如两个交换机将两个局域网连接成一个大的局域网。



每个交换机都有自己的物理地址,比如图中的A和B。并且,在网络连接以后,通过一段时间的学习,每个交换机都会知道每个端口通往哪些物理地址。交换机把这些信息存储成一张表(filtering databases)。上图中的两个交换机存储的表类似于这个样子:



当一个交换机第一次启动时,这张表是空的,此时它除了知道自己的mac地址,不知道任何其他的地址以及每个端口通向哪些设备。这时如果交换机接收到一个目的地址不是自身mac地址的帧,它会复制该帧数据,并把他们分别通过各个端口发送出去,当然,接收到数据的端口不发。因为这时交换机不知道目的端口在哪儿,要从哪个端口发出去,所以只好把所有的端口都发送一份。如果交换机不能通过学习获取到这张表,那么每一个数据帧,都将以这样的方式进行传输,显然,这样是效率很低的。由此可见,通过学习获得各端口对应的mac地址是交换机一个很重要的功能。现在的电脑系统几乎都可以通过配置使其成为一个交换机。

1.生成树协议(Spanning Tree Protocol STP)



考虑上面的情况,当ABCD四个交换机首次启动时,Station S发送一帧数据,会发生什么?交换机B会从7、8、9号端口分别发送一份该数据,A从1端口收到该数据,从2和3号端口发送出去,C和D类似的操作,这样会生成大量的冗余数据,造成网络拥堵。为了避免这种情况,人们发明了生成树(STP)协议。
STP协议的基本思想十分简单。大家知道,自然界中生长的树是不会出现环路的,如果网络也能够像一颗树一样生长就不会出现环路。于是STP的目的就是通过构造一个自然数的方法达到裁剪冗余环路的目的,同时实现链路备份和路径最优化。用于构造这棵树的算法称为生成树算法(Spannin Tree Algorithm)。
要实现这些功能,交换机之间必须要进行一些信息交流,这些信息交流单元就称为配置消息BPDU(Bridge Protocol Data Unit)。它是和以太网帧相类似的数据,目的mac地址是多播地址,所有支持STP协议的交换机都会接收并且处理收到的BPDU报文。
生成树协议的工作过程大致如下:首先进行根桥的选举。选举的依据是交换机优先级和其MAC地址组合成的桥ID(Bridge ID),其值最小的交换机或者网桥成为根桥。从根桥出发经过的端口成为交换机的根端口,其他端口阻塞。这样就生成了一棵树。
然而,当拓扑发生变化之后,新的配置消息要经过一定的时延才能传播到整个网络,这个时延称为(Forward delay)。往往需要经过较长的一段时间才能收敛,因此在STP协议的基础上,有了很多改进的STP协议。这里不再详述。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: