目录
前言
一、基本内容
1.数据链路
2.三个基本问题
1.封装成帧
2.透明传输
3.差错检测
3.适配器
4.MAC地址
二、老数据链路层:
三、现代数据链路层:
1.网桥
网桥的内部结构
工作原理
2.交换机
1.多接口网桥-以太网交换机
2.交换机的两种转发方式
3.帧结构
补充:
1.集线器,中继器,交换机,网桥,交换集线器的区别:
2.四种网络拓扑图类型:
数据链路层是介于物理层和网络层中间的一层(根据TCP/IP体系结构划分),主要功能是将数据封装成帧、传输以及控制。
就比如这样:
比如封装:
emmmm,开玩笑,是这样:TCP/IP体系结构
数据链路:传输数据除了需要物理线路之外,还需要一些相应的通信协议来控制数据的传输。所以说,物理线路+实现协议的硬软件=数据链路。
不过我个人觉得叫做三个问题的解决办法似乎更容易理解=-=
封装成帧其实就是在一段数据的前后分别加上首部和尾部。我们知道(我知道你们知道):所有因特网上传送的数据都是以分组(数据报)为单元进行传输的,帧就是数据链路层上的数据报。有了首部和尾部,我们就能识别出帧的开始和结束,也就更方便对数据进行控制(比如下文的透明传输和差错检测)。
在帧的首部或尾部一般会包含定界符,来区分不同的帧。透明传输主要关注的是,如何判断定位符、分辨这些定位符和帧的数据中和定位符相同的部分,以此对帧进行正确的处理。举一个简单的例子,如图:
图中的SOH和EOT等控制字符用于传输层,常用在Xmodem、Ymodem、Zmodem等文件传输协议中。同样,帧内部也有定界符,后文将帧结构时会讲到(感兴趣可以点击链接看看,反正我是还没看=-=)。
另外,当在数据传输过程中出现错误时,定界符的作用更加明显。比如发送端在没发送完一个帧的时候出现了故障,接收端在接收数据时发现不是一个完整的帧(没有EOT),所以舍弃。.
还有一个问题,如果帧的数据部分中有EOT(或SOH)呢?为了解决这种问题,我们可以在这个EOT/SOH的前面填充一些字节,如果数据部分中有ESC也一样,在ESC前面加一个ESC,对字符进行转义,如图(ESC就相当于我们常用的转义字符 '\'):
当进行帧检测时,就会发生以下情景(目前普遍由交换机负责对帧的控制):
因为现实中的通信并不是理想的,不可能没有错误。为了保证传输信息的可靠性,就需要采用各种差错检测方式。目前在数据链路层使用最广泛的是循环冗余校验CRC方法(简称CRC循环校验)。具体过程如下:
1.信息发送方和接收方事先选定一个CRC版本,即使用同一个多项式P(X)作为除数;
2.发送方通过'模2运算'计算出一个冗余码(FCS),添加到帧的数据部分之后,组成一个传输帧,发送出去;
3.接收方将收到的数据同样进行‘模2运算’,检查余数是否为0,不是则舍弃。
1.A(发送方)和B(接收方)使用CRC-3版本(假定存在这个版本,方便计算和理解),生成的多项式P(x)=x^3+x^2+1,对应的除数P=1101(最高位对应x^3,最低位对应x^0),长度n为4个bit;
2.A要发送的数据M=101001,长度k为6个bit(不考虑帧的内部结构),首先用M乘以2^n,得到一个数:2^n*M(相当于在M后面加上n-1个0),然后用这个数模2除以除数P,得到余数,即冗余码FCS,将FCS加在源数据M之后形成传输帧(T)发送出去(T=M+FCS);
3.B接收到T之后,用T模2除以P,看得出的余数是否为0,然后决定是否舍弃。
话说了这么多,看图
在发送方:
在接收方,对T作同样的运算,可以发现余数是000,说明传输过程中没有出现差错(至少是CRC方法认为没有差错) 。
另外,关于多项式P的生成、常用版本以及不同版本的适用情况,可以参考:CRC循环校验-百度百科或者Cyclic Redundancy Check-Wikipedia
PS:1.FCS≠CRC,CRC是校验方法,FCS是冗余码,在校验时可以选择CRC,也可以选择其他的校验方法。
2.发送端FCS的生成,接收端的CRC校验都是用硬件完成的,处理很迅速,不会延误数据的传输(为啥硬件快我也不清楚,反正就是快)。
3.数据链路层上的CRC循环校验只能检错,不能纠错,即只能无差错接受。另外,在通信质量差的情况下(比如某高校的某教学楼下1000m处有金矿),数据链路层会使用帧的确认和重传机制,保证传输可靠。如果通信质量好,就不需要这些机制,即数据链路层不需要向上提供可靠传输服务。
网卡,即网络接口卡(Network Interface Card,简称NIC)。因为现在PC不在单独使用网卡了,所以叫适配器更准确。适配器上有处理器和存储器(包括RAM和ROM),适配器中需要装有对数据进行缓存的存储芯片(后面讲交换机转发方式时会提到缓存)。
需要注意的是,MAC地址存在适配器的ROM中,而IP地址存在计算机的存储器中。
MAC地址用于识别数据链路中的不同节点,MAC地址长度为48bit,一般都会被烧入NIC的ROM中。因此,MAC地址不会重复(除非某人用微机板上自己设置)。
MAC地址的48个bit分为四个部分,如图:
老的和现代的是我个人根据所使用技术和设备的不同来划分的,只是为了方便理解,并没有严谨的定义。
老数据链路层,老的意思就是现在几乎不用了。在以太网发展初期,以同轴电缆为主干线,在边缘部分使用集线器和双绞线的局域网得到了广泛的应用,但是存在着很多的问题,比如传输速率慢,容易发生冲突,不容易拓展等。
老数据链路层主要应用在共享介质型以太网中,即设备在同一条信道上进行信息传输,所以经常发生信息冲突,即使之后规定了CSMA,CSMA/CD等协议,引入了集线器对网络进行了拓扑,但是并不能从本质上解决问题(即仍然是介质共享型)。
关于CSMA/CD,在这里不再赘述,可以看一看:以太网发展简史,这里主要讲“使用集线器在物理层上进行网络的拓宽”
集线器,顾名思义就是把线绑起来。
如图,不同的PC端通过一个集线器聚集在一起, 然后通过主干集线器来进行传输。
表面上看,使用集线器的局域网是一个星型网,但由于集线器内部是通过电子器件来模拟实际电缆工作的,所以本质上使用集线器拓宽的以太网仍然是一个总线网 ,仍然需要使用CSMA/CD协议。简单来说就是,集线器只是搞了一个更大的冲突域。(之后研发了交换集线器,顾名思义就是把非共享性介质网络的技术用在介质共享型网络中,所以交换集线器也可以叫做交换机的前身,但是并不流行这种叫法,所以本文略过)
这显然不是我们想要的。
所以接下来我们讲现代的数据链路层。
在说之前先来个图感受下:
从图中可以看出,(站点)PC直接连接在二层交换机上,由交换机负责转发数据帧,发送端和接收端不共享通信介质。每台计算机与交换机端口之间形成一对一的连接,可以实现全双工通信,不会发生冲突,也就更不需要CSMA/CD协议就能实现更高效的通信。(当然现在好多计算机仍然保留着CSMA/CD机制,保证向下兼容。闲着无聊可以试一试切换成半双工模式)
之前我们说过,虽然集线器在物理层上拓展了以太网,但是并没有太大的成效。所以就做了在数据链路层上拓展以太网的尝试,研发出了网桥以及交换机等设备,避免了数据的冲突。
网桥分为两种:透明网桥和源路由网桥,但是由于源路由网桥并不容易安装和配置。所以下文中的网桥指的都是透明网桥。
如图:图中的网桥有两个接口,分别连接左右两个网段。不同网段之间的通信不会相互干扰,所以网桥实现了冲突域的隔离,起到了过滤通信,增大吞吐量的作用,也提高了可靠性。
网桥能够识别数据链路层中的数据帧,并将这些数据帧临时保存,再重新生成一个信号作为全新的帧转发给另一个网段。由于能够存储(缓存)这些数据帧,网桥能够连接不同传输速率的数据链路,同时接收大量的数据,而且不限制连接的网段数。
网桥通过转发表来转发帧,比如A向C发送数据,数据先发送到接口1,网桥查看转发表,发现C在接口2连接的网段中,所以把数据传到接口2并转发给站点C。
当然,网桥刚开始使用的时候转发表是空的,不过他可以自学习来建立转发表。如下图:
但对于现在的交换机来说,设备启动时会发出免费的ARP广播,这样就能够很快建立起转发表。
实际上,在网桥的转发表中除了地址和接口外,还有帧进入网桥的时间。因为以太网的拓扑结构经常变化,站点也可能会更换适配器(比如别人用你的网线上网),而登记帧到达网桥的时间就能够只保留网络拓扑的最新状态信息。因此,如果某个站点没发过数据,转发表中就不会有这个站点;如果一个站点A很久没有发送过数据了,那么A在转发表中的记录就会被删除。
早期的网桥仍然使用CSMA/CD协议来避免冲突,这样会增加时延。但是当网桥逐渐演化为交换机之后,就不再使用CSMA/CD协议了(仍然保留),因为从介质上来说,被广泛使用的双绞线包含4个绕对,能够同时实现两个方向的收发;在交换技术上,微分段技术可以将任意两个站点划分到一个虚拟网络中,不会再和其他站点产生冲突。
网桥的接口数很少,一般只有2~4个,而以太网交换机一般有几十个接口,因此,交换机也可以叫作多接口网桥,每一个端口都能提供类似网桥的功能,如图:
对于一个10Mb/s的共享式以太网,如果有n个用户,则每个用户分得的平均带宽为10/n;如果使用交换机,虽然每个接口到站点的带宽是10Mb/s,但是因为用户在通信时是独占带宽,所以一个拥有n个接口的交换机的总容量就有10nMb/s,这是交换机的最大优点。
交换机有两种转发方式:存储转发和直通转发
存储转发方式检查数据帧末尾的FCS之后再转发,当数据量庞大时,不能同时处理所有的数据帧,所以先将待处理的帧缓存下来,等其他的帧处理完之后再处理。因此存储转发方式可以过滤掉错误帧,但是会增加时延。
交换机把待处理的帧缓存到缓存池中,缓存池的本质是一个队列,即FIFO(先进先出)。当然,为了优先处理某些重要的数据帧,一般都使用优先级队列。因此以太网帧中通常包含能表示优先级的数据(下文帧结构中会提到)。
直通转发不需要将整个帧全部接收完再转发, 只要知道目标地址就可以转发。因此这种方法的延时短,但是相比之下更容易传送错误的帧。
目前使用最多的是以太网V2的帧格式,如图:
从图中可以看出:
在发送帧之前需要发送一个长度为8字节的前导码(前7个字节是10交替,最后一个字节时10101011),其中前同步码的作用是快速同步接收方的时钟(即提醒接收方,让其做好接收帧的准备,避免丢失信号);帧开始界定符表示一个帧的开始。
目的地址和源地址是帧发送方和接收方的MAC地址,长度都为6个字节,如00:1A:FF:21:11:23
“类型”表示上一层(网络层)使用的是什么协议,以便网络层处理帧,比如0x0800指IPv4,0x0806指ARP,0x86DD指IPv6等,更多参见EtherType-Wikipedia
数据部分长度为46~1500字节。最小长度为46字节是CSMA/CD算法的限制,帧长度小于64时(6+6+2+46+4),在传输过程中易发生冲突。当然,如果要传输的数据小于46字节,则由上层协议进行字节填充。数据长度的上限是任意的,但是如果有些帧的长度超过了接收方缓冲区的大小,就会发生缓冲溢出;另外,为了避免一台主机长时间占用信道,所以规定帧最长为1518个字节(6+6+2+1500+4)。虽然现在几乎不使用在共享介质的链路层上工作的CSMA/CD协议了,但是因为现在的设备为了向下兼容而保留CSMA/CD,所以帧的长度仍然沿用之前的64~1518字节。
值得注意的是,帧格式中并没有帧结束符。这是因为在两个帧的传输之间都会留存一定的时间间隙,以便对数据进行处理。在发送完一个帧之后,发送方NIC的接口上的电压就不会再发生变化(物理层上比特流对应的曼彻斯特编码中不再发生跳变),接收方也就很容易找到帧的结束位置。
最后的FCS即上文讲到的冗余码,一般使用CRC循环校验的方法来检错。更多可以参考:CRC循环校验
另附VLAN中的帧格式:
因为本文偏向于理论性的知识,所以在此不阐述其他普遍的应用,如无线通信,公共网络等等。
中继器(Repeater):工作在物理层上,整理还原信号;
集线器(Hub):工作在物理层上,相当于多接口的中继器;
网桥(Bridge):工作在数据链路层上,主要功能是在不同网段之间转发数据;
交换集线器:工作在数据链路层上,是一种把非共享介质型网络的技术用在共享介质型网络上的设备,属于早期的网桥;
交换机:工作在数据链路上,是现在数据链路层上最常见的设备,也可以叫做多接口网桥,一般有二层交换机和三层交换机两种;
现在除了交换机经常使用,其他的都几乎不再使用了。
撰写本文的初衷是为了总结复习及分享所学的知识,由于个人能力和时间有限,如果文中有误,敬请评论指正。虽然文章这么长,但是如果有一点能够帮助到你,我就很开心了。
参考资料:《图解TCP/IP》;
《计算机网络》-谢希仁;
以及文中好多的链接。