目录
了解数据链路层
在前几篇文章中,我们介绍了网络四层结构中的应用层、传输层和网络层,并分别阐述了各层中常见协议的作用及其在实际网络环境中的具体功能。至此,还剩下数据链路层尚未展开说明。
接下来,我们将延续这一脉络,系统讲解数据链路层的主要功能、常用协议,并结合实际网络场景,说明其如何与其它各层协同工作,完成网络通信任务。在此之前,我们先简单的复习前三层。
- 对于应用层,其主要的协议有HTTP、HTTPS等,其该层的主要作用表现:为应用程序提供网络通信服务,实现用户与网络之间的交互。应用层是网络协议栈的顶层,直接面向用户和应用程序,负责实现具体的网络功能与服务,是用户感知网络应用的桥梁。
- 对于传输层,其主要协议包括TCP(传输控制协议)和UDP(用户数据报协议)。其中,TCP 是一种面向连接的、可靠的传输协议,而 UDP 则是无连接的、尽力而为的传输协议。该层的主要作用是实现端到端的进程间通信,具体表现为:当数据通过网络层跨网络到达目标主机后,传输层负责将数据准确交付到该主机上指定的应用进程。它通过端口号来标识不同应用程序,确保数据能够被正确寻址与分发,从而在复杂的网络环境中建立起稳定、有序或高效的数据传输通道。
- 对于网络层,其主要的协议有IP协议。其IP协议主要作用是实现数据包从源主机到达目标主机的逻辑寻址与路由器选择。具体表现为:当源主机向目标主机发送数据时,其网络层将负责将数据准确的跨网络传输到目标主机。它通过IP地址,来标识不同的主机。
数据链路层作为四层结构中的最后一层,其主要职责是确保数据在同一链路段的相邻节点之间进行可靠、准确的传输。它所解决的问题是数据如何在当前这一跳中,从本设备无差错地传到下一个直连设备。
对比理解数据链路层和网络层
简单来说,网络层主要解决的是:数据如何跨网络传输。而数据链路层解决的是:数据如何在当前这一跳中,从本设备无差错地传到下一个直连设备。
打个比方,在西天取经的路上,唐僧在A地点问当地人B地点怎么走、方向如何,这就相当于网络层在规划路线、确定每一跳的目标。当得知具体方向后,唐僧便骑着白龙马上路。然而,从A到B的全程往往分为多个路段------有时是平坦官道,有时是崎岖山路,有时还需渡河过桥。白龙马在不同路段行走时所遵循的具体规则与保障,例如在官道靠右行、在山路抓紧缰绳防坠落、在渡口凭通关文牒上船,就对应着数据链路层的作用。它并不决定"最终要去哪",而是负责在每一段具体的路上,安全、准确地把唐僧送达该段的终点,从而一步步实现从A到B的完整旅程。
认识以太网
- 以太网不是一种具体的网络,而是一种技术标准。既包含了数据链路层的内容,也包含了一些物理层的内容,例如:规定了网络拓扑结构,访问控制方式,传输速率等。
- 例如以太网中的网线必须使用双绞线。传输速率有10M, 100M, 1000M等。
- 以太网是当前应用最广泛的局域网技术。和以太网并列的还有令牌环网,无线LAN等。
虽然在网络中最为广泛的局域网技术除了以外网外还有令牌环网与我i先LAN,当跨网络通信时采用的技术也会略有不同,但这并不影响结果,这在设定上是因为网络层的IP协议屏蔽了底层技术的差异。
- 源主机将数据从上层进行封装,到达数据链路层时,其会为封装上对应的局域网技术的报头。
- 如果数据要进行跨网络传输时,那么此时就需要经过路由器。
- 当数据交付给路由器时,路由器会将数据交付给上层的网络层,进行查找目标IP来查找下一跳地址,在此过程中会将局域网技术所在的报头进行解包。
- 而数据在传输给下一跳之前,还需要将数据进行封装上当前局域网的技术报头。所以实际上局域网技术不同,并无影响。
以太网至于为什么叫以太网,可以看以下以下连接:以太网的名字是怎么来的? - 知乎
https://www.zhihu.com/question/20254884
在这里,补充一点必要的知识。
以太网通信原理
在一个局域网内,就好比大学一个宿舍内连接同一个路由器WiFi时,其所有主机共享一个通信信道,当一台主机向某一台主机时,其实际情况下当前局域网内所有主机都会收到信息。
虽然在此过程中,我们并不会有所任何察觉,但在事实上就是如此,比方说当前局域网内有主机A、B、C、D。主机A向主机D发送数据时,主机B、C其实也收到了,但在数据交付过程中,在某一层发现其数据并不是发送给我的,就会进行丢弃,并不会交付到最顶层,让用户查看到。
因此在设定上,我们主机可以查看到当前局域网内所有的数据,只不过当前主机只关心发给自己主机的信息。所以这也就是为什么,当我们采用网络抓包工具,可以查看当前局域网内所有数据。
碰撞避免算法
当然这样的设定,也带来了一些问题,其以太网中的所有的主机共享一个通信信道,因此在同一时刻只允许有一台主机发送数据,否则各个主机发送的数据就会相互干扰,发生碰撞,导致数据的不完整性。此就类似于系统中的临界资源,此临界资源就像是加锁的,单位时间内只允许一台主机使用。
当然这样的设定,在效率上必然低下。
- 对于此问题,以太网的做法就是先不限制各个主机发送数据的能力,局域网中的每个主机想发数据的时候直接发就行了,但是只要发送出去的数据与其他主机发送的数据产生了碰撞,那就得执行碰撞避免算法。
- 所谓的碰撞避免算法就是,当主机发送出去的数据产生碰撞时,该主机需要等待一段时间后再进行数据重发,在主机等待的时候就能够就能够尽可能让局域网当中的数据消散。
但这样的设计其实还会有一个非常致命的问题,局域网内主机越多,发生碰撞的概率也就越大,那么理论上,必然会存在一个临界值,当局域网内主机超过该数值后,每条数据必然会发生碰撞。那么对于此问题的解决方法是添加交换机,划分碰撞域,减少局域碰撞。
以太网帧格式
以太网的帧格式如下所示:

- 源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的。
- 帧协议类型字段有三种值,分别对应IP协议、ARP协议和RARP协议。
- 帧末尾是CRC校验码。
MAC帧如何将报头与有效载荷进行分离?
其以太网协议的MAC帧的帧头与帧尾都是固定字节长度,当拿到一个MAC帧后,直接按固定长度与位置进行解包即可得到有效载荷。
MAC帧如何决定将有效载荷交付给上层的哪一个协议?
以太网MAC帧对应的上层协议不止一种,因此在将MAC帧的报头和有效载荷分离后,还需要将分离出来的有效载荷交付给对应的上层协议。
在MAC帧中有一个占2字节的字段,其作用就是指明有效载荷交付的上层那个协议。
举个例子
按照上图,类型为0800时,其对应上层为IP协议。因此,帧协议是0800时,紧接着有效载荷就需要发送的IP协议,帧尾部分对应就是CRC校验。
当类型为0806时,其上层就为ARP协议,紧接着有效载荷就需要发送的ARP协议(有效载荷为上图中的28字节的ARP请求/应答 + 18字节的PAD),帧尾部分对应就是CRC校验。
为什么有效载荷都是至少为46字节
在设定上,在上图可以发现无论哪种类型,其有效载荷部分的字节长度大小都至少为46字节以上,即使类型为0806或者0835的情况下,即使上层协议真正需要的数据包不到46字节,也存在PAD18字节填充。这是为什么呢?
根据 IEEE 标准,一个以太网帧(不含前导码和帧起始定界符)的最小长度必须为 46 字节。这是由以下原因决定的:
-
冲突检测需求:早期共享式以太网(CSMA/CD)需要足够长的帧来确保发送方能在帧传输完毕前检测到冲突。
-
时间槽限制:最小帧长与网络最大往返时延相关,确保发送时长 ≥ 2×传播时延。
当然如果类型为0800,上层协议为IP协议时,如果报头20字节(不考虑选项)+ 数据不够46字节,会填充特定的数据。至于怎么填充,这里不考虑。
认识MAC地址
- MAC地址用来识别数据链路层中相连的节点。
- 长度为48位,及6个字节,一般用16进制数字加上冒号的形式来表示,例如:08:00:27:03:fb:19。
- 在网卡出厂时就确定了,不能修改,MAC地址通常是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突;也有些网卡支持用户配置MAC地址)。
对比理解MAC地址和IP地址
对于MAC地址不可变,IP地址可变,在此可以将MAC地址理解为身份证号,而IP地址可以理解为当前所在位置。身份证号不可变且唯一,而地址会随我们移动而发生改变。
在其网络中的作用上,举一个例子,唐僧取经过程中,会经过很多不同的地方,每个地方都有对应的名字,其中唯一不变的是每个地方的地方名,比方说女儿国,其并不会因为唐僧经过而发生名字上的改变。因此在西天取经中。
- IP地址就类似于描述路途总体的起点和终点。
- MAC地址描述的是路途上的每一个区间的起点和终点
因此在西天取经中IP地址并不会改变,一致都是大唐与西天。
MAC地址会随时变化,如果在女儿国,源MAC地址就是女儿国,目的MAC地址就是下一个地点的名字。如果在高老庄,源MAC地址就是高老庄,目的MAC地址就是下一个地点的名字。
认识MTU
MTU相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层,产生的限制。
- 以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位。
- 最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。
- 如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)。
- 不同的数据链路层标准的MTU是不同的。
MTU对IP协议的影响
因为数据链路层规定了最大传输单元MTU,所以如果IP层一次要发送的数据量超过了MTU,此时IP层就需要先对该数据进行分片,然后才能将分片后的数据向下交付。
- IP层会将较大的数据进行分片,并给每个分片数据包进行标记,具体就是通过设置IP报头当中的16位标识、3位标志和13位片偏移来完成的。
- 由同一个数据分片得到的各个分片报文,所对应的IP报头当中的16位标识(id)都是相同的。
- 每一个分片报文的IP报头当中的3位标志字段中,第2位设置为0,表示允许分片,第3位用作结束标记(最后一个分片报文设置为0,其余分片报文设置为1)。
- 当对端IP层收到这些分片报文后,需要先将这些分片报文按顺序进行组装,拼装到一起后再向上交付给传输层。
- 如果分片后的某个报文在网络传输过程中丢包了,那么对端在进行数据组装时就会失败,此时就需要上层传输层进行数据重传。
在此数据的分片与组装是发生在网络层的IP协议中,其分片发生在源主机与路径中的路由器,组装只发生在目标路由器。
对于此,可以看博主另一篇博客,进行了解
IP协议内容补充-CSDN博客
https://blog.csdn.net/2301_81265915/article/details/157738635?spm=1001.2014.3001.5501
MTU对UDP协议的影响
让我们回顾一下UDP协议:
- 一旦UDP携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报。
- 这多个IP数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着,如果UDP数据报在网络层被分片,整个数据被丢失的概率就大大增加了。
MTU对TCP协议的影响
让我们再回顾一下TCP协议:
- TCP发送的数据报不能无限大,还是应该受制于MTU,我们将TCP的单个数据报的最大报文长度,称为MSS(Max Segment Size)。
- TCP通信双方在建立连接的过程中,就会进行MSS协商,最终选取双方支持的MSS值当中的较小值作为最终MSS。
- MSS的值实际就是在TCP首部的40字节的选项字段当中的(kind=2)。
- 最理想的情况下,MSS的值正好就是在数据不会在IP层进行分片的最大长度。
MSS和MTU的关系

查看硬件地址和MTU
使用ifconfig命令就可以查看自己的MAC地址与MTU

ARP协议
地址解析协议(Address Resolution Protocol,ARP)协议,是根据IP地址获取MAC地址的一个TCP/IP协议。
虽然我们在这里介绍ARP协议,但是需要强调,ARP不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议。
ARP协议的作用
在设定上,网络中相连的节点只有知道MAC地址才可安全的进行数据交付。
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址。就比如下图的例子中,主机A向主机B发送数据。

- 由于路由器D和主机B是属于同一个局域网的,因此路由器D能够直接将数据交给主机B,但要给同局域网中的一台主机发送数据,前提是得先知道对方的MAC地址。
- 但路由器D此时只知道主机B的IP地址,因此路由器D必须通过某种方式得到主机B的MAC地址。
也就是说,在同一个局域网中要给对方发消息,就需要知道相对应的MAC地址,而大部分情况下,是只知道IP地址的,并不知道MAC地址,此时就需要ARP协议建立了主机IP地址和MAC地址 的映射关系。
因此回到本篇文章前面提到的以太网中局域网中通信,数据向上层交付到某一层发现不是发送给自己的,便丢弃问题。
其在实际情况下,数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃。其某一层指的便是数据链路层。
因此在通讯前必须获得目的主机的硬件地址。
ARP协议的工作流程

- 源主机发出ARP请求,询问"IP地址是192.168.0.1的主机的硬件地址是多少",并将这个请求广播到本地网段(以太网帧首部的硬件地址填FF:FF:FF:FF:FF:FF表示广播)。
- 目的主机接收到广播的ARP请求,发现其中的IP地址与本机相符,则发送一个ARP应答数据包给源主机,将自己的硬件地址填写在应答包中。
- 每台主机都维护一个ARP缓存表,可以用
arp -a命令查看。缓存表中的表项有过期时间(一般为20分钟),如果20分钟内没有再次使用某个表项,则该表项失效,下次还要发ARP请求来获得目的主机的硬件地址。

ARP数据报的格式

- 注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
- 硬件类型指链路层的网络类型,1为以太网。
- 协议类型指要转换的地址类型,0x0800为IP地址。
- 硬件地址长度对于以太网地址为6字节,因为MAC地址是48位的。
- 协议地址长度对于IP地址为4字节,因为IP地址是32位的。
- op字段为1表示ARP请求,op字段为2表示ARP应答。
其中发送端以太网地址 + 发送端IP地址是应答时看的,目的以太网地址 + 目的IP地址是用于请求端看。
从ARP的数据格式也可以看出,ARP是MAC帧协议的上层协议,ARP数据格式中的前3个字段和最后一个字段对应的就是以太网首部,但由于ARP数据包的长度不足46字节,因此ARP数据包在封装成为MAC帧时还需要补上18字节的填充字段。