【Linux网络-数据链路层】以太网(以太网帧格式|MAC地址+模拟一次性局域网通信+MTU)+ARP协议
数据链路层
用于两个设备(同一种数据链路)之间进行传递
数据链路层实现某一个区间(一跳内的通信),而IP实现直至最终目标地址的通信(点对点)
跨网络转发的本质,就是要经历不同的子网,即子网间转发
要理解跨网络转发原理,先要保证同一个网段(局域网)相互之间先要实现转发,这就是以太网协议
一、以太网
1.认识以太网
以太网(Ethernet)是一种常见的局域网(LAN)技术,用于实现网络中不同设备间的数据传输。它在数据链路层和物理层上进行操作,通过帧传输数据,并定义了介质访问控制方法、帧格式和多种数据传输速率标准。
-
“以太网”不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容。例如:规定了网络拓扑结构,访问控制方式,传输速率等
-
例如以太网中的网线必须使用双绞线;传输速率有10M、100M,1000M等
-
以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN等
2.以太网帧格式
以太网帧格式是以太网传输数据的基本单位,定义了各部分的具体组成和用途。标准以太网帧格式分为多个字段,用于确保数据的完整性和有效传输
局域网两台主机之间通信必须要封装MAC帧
源地址和目的地址是指网卡的硬件地址(也叫MAC地址),长度是48位,是在网卡出厂时固化的;
帧协议类型字段有三种值,分别对应IP、ARP、RARP
帧末尾是CRC校验码
标准以太网帧示例
红色圈出来的部分就是报头部分,中间则是数据部分,数据部分包含上层的报头+有效载荷(HTTP、TCP、IP的封装)
-
【问题一】:如何解包?
MAC 帧的分离方式就是采用定长报头。直接对前面的 14 个和后边的 4 个进行提取,剩下的就是有效载荷。
-
【问题二】:如何分用?
在 MAC 帧的帧头当中有 2 个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可
3.认识MAC地址
❍ MAC地址用来识别数据链路层中相连的节点
❍ 长度为48位,即6个字节,一般用16进制数字加上冒号的形式来表示(例如:08:00:27:03:fb:19)
❍ 在网卡出厂时就确定了,不能修改,mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址,可能会冲突;也有些网卡支持用户配置mac地址)
对比理解MAC地址和IP地址
-
IP地址描述的是路途总体的起点和终点
-
MAC地址描述的是路途上的每一个区间的起点和终点
4.模拟一次局域网通信
局域网中,假设现在MAC1要向MAC7发送数据
首先MAC1 会封装一个MAC帧,填上目的地址,源地址等信息
同一个局域网下,每台主机的数据链路层都会收到这个MAC帧,然后进行报头与有效载荷的分离,然后查看目的IP地址是MAC7,如果发现不是自己的,就直接把数据帧丢弃,上层根本就不知道收到了这个数据帧;如果发现是自己,就把有效载荷向上交付
当MAC7收到请求后,MAC7向MAC1构建一个应答
发送过程同上
通过这个例子我们发现,每台主机都能够收到MAC帧,在局域网中,网卡有一种混杂模式,它不会丢弃任何的数据帧,全部向上交付,这就是局域网抓包工具原理,所以HTTPS数据加密很有可能必要
数据碰撞
在以太网中,当一个设备准备发送数据时,它首先监听信道状态。如果信道空闲,则开始发送数据;如果信道忙碌,则等待信道空闲后再发送。然而,如果多个设备在监听到空闲状态后同时开始发送数据,就会发生数据碰撞
生活中的“数据碰撞”例子
假设有一条狭窄的走廊,许多人需要通过它。然而,走廊只能允许一个人一次通过。这就类似于网络中的共享信道,所有人都必须使用同一条“通道”。
情境:假设小明和小红同时决定进入走廊,因为走廊很窄,两人无法同时通过,于是他们在走廊中相撞。
碰撞检测:他们相撞后立刻意识到无法继续前进,于是两人后退一步来避免继续“冲突”。
重试机制:接着,小明和小红决定重新尝试通过,但为了避免再次相撞,他们会稍微等待一会儿再尝试。这时,如果双方都退后等待不同的时间,那么可以减少再次相撞的几率。
随机回退:他们不确定对方何时会再尝试通过,所以他们各自等待了一个随机的时间,然后再次尝试通过。这种随机等待时间就类似于网络中使用的随机退避算法。
在这个例子中,狭窄的走廊相当于共享网络信道,而小明和小红相当于网络中的设备。两人相撞的情况就相当于数据碰撞,而后退再等待一段随机时间再尝试通过,则模拟了网络中碰撞后的“重传回退”机制
在网络通信中,为了保证一个节点在发送数据时不会和其他节点发生碰撞,可以采用两种经典的方法:令牌环(Token Ring)和以太网的碰撞检测和碰撞避免算法(CSMA/CD)
在令牌环网络中,每个节点连接在一个环形的网络拓扑中,网络中传递一个特殊的数据包,称为令牌(Token)。只有持有令牌的节点才可以发送数据。该机制的工作原理类似于互斥锁的概念,确保同一时间只有一个节点可以进行发送,从而避免了数据碰撞的发生。
以太网采用载波监听多路访问/碰撞检测(CSMA/CD)协议,允许多个设备共享同一信道,同时会检测和处理可能的碰撞。其机制是随机退避重传,确保多个设备在共享信道中可以顺利发送数据。
如果我们不断向局域网发送垃圾数据并且不执行碰撞检测和碰撞避免,那么就能让局域网所有主机都无法通信
那么就可以把局域网看作为一个临界资源,通过碰撞检测+碰撞避免让任何时刻只有一台主机能够发送消息
【问题一】局域网中的主机越多越好,还是越少越好?
越少越好,就比如学校在操场做活动,所有同学都在操场,由于不停的向局域网发消息,不停的执行碰撞检测与避免,导致所有人的网络延迟都非常高
【问题二】局域网数据帧发送数据的时候,数据帧是越长越好,还是越短越好呢?
在局域网(LAN)中,数据帧的长度既不能过长也不能过短,而是需要平衡帧长度的选择。不同的帧长度会对传输效率、可靠性和网络性能产生影响,因此最优的帧长度取决于网络环境和应用需求。
帧过长的情况
优点:长帧可以提高数据传输效率,因为较少的帧头和帧尾占用比例相对减少。每次传输的有效数据较多,传输带宽利用率更高。
缺点:
容易导致错误:帧长度越长,数据出错的概率越高。如果帧在传输过程中出现错误,则整个帧需要重传,造成带宽的浪费。
影响实时性:长帧在传输时需要更多的时间,可能导致延迟上升,尤其是在需要实时响应的应用中(例如语音、视频等),长帧可能会影响用户体验。
提高碰撞概率:在使用CSMA/CD协议的局域网中,较长的帧更容易在共享信道上发生碰撞。一旦发生碰撞,重传的时间和资源消耗较大。
帧过短的情况
优点:短帧在传输时延较小,能提供更好的实时响应性。即使发生错误或碰撞,重传所需的资源较少,降低了传输负担。
缺点:
传输效率低:短帧中帧头、帧尾等开销相对较高,实际传输的数据比例较小。频繁的短帧传输会导致带宽浪费,降低整体的传输效率。
增加控制负担:大量的短帧会增加网络设备的处理负担,尤其在高负载网络环境中,过多的短帧可能会导致交换机或路由器的资源消耗增加。
以太网标准定义了数据帧的长度范围:
最小帧长:64字节(包括帧头和帧尾),不足64字节的帧会被填充,以便支持CSMA/CD协议下的碰撞检测。
最大帧长:1518字节(不包括VLAN信息),超过最大帧长的帧会被认为是“巨型帧”(Jumbo Frame)。
在实际应用中,1518字节的帧通常是一个较好的折中选择,能在传输效率和错误率之间找到平衡。然而,对于某些特定场景,如大数据传输或局域网内的数据中心,可能会使用“巨型帧”来进一步提升效率,这种帧长一般在9000字节左右。
交换机
如果局域网过大,就会导致碰撞的概率增加,所以就有了交换机
交换机(Switch)是一种用于局域网(LAN)中的网络设备,主要作用是通过数据帧的MAC地址将数据包智能地转发到目标设备。它工作在OSI模型的数据链路层,也可在三层交换机中扩展到网络层,为网络设备提供独立的通信通道。交换机的引入极大地提高了网络的性能、效率和稳定性,是现代网络中的核心设备之一。
现在假设MAC1向MAC5通信,MAC1向MAC7发数据
1️⃣交换机可以对正常数据的选择性转发
MAC1向MAC7发送数据帧,交换机收到帧时会检查目的MAC地址为MAC7,并在MAC地址表中查找到MAC7位于i1
端口。
MAC1向MAC5发送数据帧,交换机收到该帧后,检查发现目的MAC地址为MAC5,而MAC5位于i0
端口(与MAC1同一端口)。因此,交换机识别到这是一个同一端口内的通信,不需要转发到其他端口,这样可以减少不必要的网络流量。
2️⃣交换机可以进行局部性碰撞的识别与隔离
假设在交换机左侧的设备之间(例如MAC1和MAC2)发生碰撞,交换机能够识别到这种局部性的冲突,从而将碰撞影响限制在左侧,不会将碰撞数据传输到交换机的右侧端口。
5.认识MTU
MTU相当于发快递时对包裹尺寸的限制,这个限制是不同的数据链路对应的物理层,产生的限制
MTU(Maximum Transmission Unit,最大传输单元)是网络传输中每个数据包或帧的最大大小限制,以字节为单位。MTU值决定了网络中数据包的最大长度,超过这个长度的数据包必须进行分片(Fragmentation)才能通过网络传输。
-
以太网帧中的数据长度规定最小46字节,最大1500字节,ARP数据包的长度不够46字节,要在后面补填充位
-
最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU
-
如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的MTU了,则需要对数据包进行分片(fragmentation)
-
不同的数据链路层标准的MTU是不同的
MTU对IP协议的影响
由于数据链路层MTU的限制,对于较大的IP数据包要进行分包
-
将较大的IP包分成多个小包,并给每个小包打上标签;
-
每个小包IP协议头的16位标识(id)都是相同的;
-
每个小包的IP 协议头的3位标志字段中,第2位置0,表示允许分片,第3位来表示结束标记(当前是否是最后一个小包,是的话置为1,否则置为0);
-
到达对端时再将这些小包,会按顺序重组,拼装到一起返回给传输层;
-
一旦这些小包中任意一个小包丢失,接收端的重组就会失败.但是IP 层不会负 责重新传输数据;
MTU对UDP协议的影响
一旦 UDP 携带的数据超过 1472(1500 - 20(IP 首部)- 8(UDP 首部)), 那么就会在网络层分成多个 IP 数据报。
这多个 IP 数据报有任意一个丢失都会引起接收端网络层重组失败。那么这就意味着,如果 UDP 数据报在网络层被分片,整个数据被丢失的概率就大大增加了
MTU对与TCP协议的影响
TCP的一个数据报也不能无限大,还是受制于MTU,TCP的单个数据报的最大消息长度,称为MSS(Max Segment Size,最大报文段长度)
TCP在建立连接的过程中,通信双方会进行MSS协商
最理想的情况下,MSS的值正好是在IP不会分片处理的最大长度(这个长度仍然是受制于数据链路层的MTU)
双方在发送SYN的时候会在TCP头部写入自己能支持的MSS值
然后双方得知对方的MSS值后,选择较小的作为最终的MSS
MSS的值就是在TCP首部的40字节变长选项中(kind=2);
MSS和MTU的关系
MTU定义了链路层允许的最大数据帧长度,包含IP和TCP头部。MSS定义了TCP段中数据部分的最大长度,不包括IP和TCP头部。
MSS的大小受MTU的限制:MSS值通常被设置为MTU减去IP和TCP头部的长度,以确保TCP数据包的总大小不会超过链路层的MTU限制,从而避免IP层的分片。
避免分片:如果TCP段的总大小(MSS + TCP头部 + IP头部)超过MTU,则在传输过程中,IP层会将该TCP段进行分片,分片会带来额外的网络开销。因此,合理的MSS设置可以避免分片,提高传输效率。
MSS协商:在TCP连接建立的三次握手阶段,通信双方会交换各自的MSS值,并使用较小的那个值作为该连接的MSS值,以确保双方的通信不会超出任一方的MTU限制
查看硬件地址和MTU
使用ifconfig命令,即可查看ip地址,mac地址,和MTU
二、ARP协议
虽然我们在这里介绍ARP协议,但是需要强调,ARP不是一个单纯的数据链路层的协议,而是一个介于数据链路层和网络层之间的协议
ARP(Address Resolution Protocol,地址解析协议)是一种用于将IP地址转换为MAC地址的协议,工作在OSI模型的数据链路层和网络层之间。ARP协议是局域网中非常重要的一部分,帮助设备之间通过IP地址找到对应的物理地址,从而实现数据包的正确传输。
ARP协议的作用
ARP协议建立了主机IP地址和MAC地址的映射关系
-
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道主机的硬件地址
-
数据包首先是被网卡接收到,再去处理上层协议的。如果接收到的数据包的硬件地址与本机不符,则直接丢弃
-
因此在通讯前必须获得目的主机的硬件地址
ARP协议的工作流程
例如:现在在一个教室上课,老师不认识所有学生,但是老师知道学生有学号;那么老师点名的时候直接说“2号学生起来回答问题”,2号学生起来后说我叫张三;那么老师也就是知道了2号学生是张三,下一次点名的时候直接喊张三就可以了
路由器在发送数据包时,如果目标主机的MAC地址未知,就会通过ARP请求来查询目标IP对应的MAC地址。目标主机收到ARP请求后,会回复自己的MAC地址,供路由器进行数据封装。路由器获取MAC地址后,将数据包封装在MAC帧中,并发送到目标主机。
-
源主机发出 ARP 请求,询问 “IP 地址是 192.168.0.1 的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播)。
-
目的主机接收到广播的 ARP 请求,发现其中的 IP 地址与本机相符,则发送一个 ARP 应答数据包给源主机,将自己的硬件地址填写在应答包中。
-
每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。缓存表中的表项有过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址。
ARP请求过程
在局域网中,当一个主机(或路由器)需要与同一网络中的另一台主机进行通信,但不知道该主机的MAC地址时,会通过ARP协议的请求过程来获取目标主机的MAC地址。
1.发送端构建ARP请求报文:
当发送端(如主机A)需要与目标主机(如主机B)通信时,发送端会检查其ARP缓存表(ARP Cache)中是否已经存在目标主机的IP地址对应的MAC地址。如果ARP缓存表中没有该IP地址对应的MAC地址(即缓存表中没有目标IP的映射关系),发送端将构建一个ARP请求报文
2.ARP请求报文内容
ARP请求报文包含以下关键字段:
-
发送端的IP地址:主机A的IP地址。
-
发送端的MAC地址:主机A的MAC地址。
-
目标IP地址:主机B的IP地址(请求的目的IP地址)。
-
目标MAC地址:此时未知,填充为全零(0:0:0:0:0:0)。
-
op字段:为 1 表示 ARP 请求,为 2 表示 ARP 应答
这些信息封装在一个数据包中,再进行封装mac帧,准备广播到局域网中。
3.广播ARP请求:
-
发送端主机A将ARP请求报文广播发送到整个局域网。ARP请求使用的是广播地址
FF:FF:FF:FF:FF:FF
作为MAC地址,这意味着所有连接在同一局域网中的设备都可以接收到该请求。 -
由于是广播,因此ARP请求会被局域网内的每一个主机(包括目标主机B)接收。
假设MAC3接收到了这个报文,接报后发现目标MAC是全F,就是广播的,当识别到MAC帧中的帧类型字段是0806,便知道这个是一个ARP的请求或者应答的数据包,于是将有效载荷向上交付给ARP层;当ARP收到数据包后,先对比oper,判断是请求,然后提取destIP,发现不是交给自己的,就在ARP层直接丢弃数据包
ARP应答过程
1.目标主机接收并处理ARP请求:
-
局域网内的所有主机接收到ARP请求后,会检查请求报文中的目标IP地址。
-
只有目标IP地址与自己IP地址相匹配的主机(在本例中为主机B)才会响应此请求,其它主机则忽略该请求
2.目标主机生成ARP响应报文:
目标主机B识别到请求报文中的目标IP地址与自己的IP地址匹配,因此会生成一个ARP响应报文。
ARP响应报文的内容包括:
-
目标IP地址:主机A的IP地址。
-
目标MAC地址:主机A的MAC地址。
-
发送端IP地址:主机B的IP地址。
-
发送端MAC地址:主机B的MAC地址。
该响应报文不再是广播,而是单播发送到请求主机A的MAC地址。
在此期间,所有主机都可以收到这个MAC帧,看到MAC帧中的目的地址不再是广播地址,也不是自己,就直接丢弃,不会在传递到ARP层
3.发送端接收ARP响应:
主机A接收到来自主机B的ARP响应报文,从中提取出目标主机B的MAC地址。
主机A将目标IP地址和MAC地址的映射关系记录到自己的ARP缓存表中,以便在接下来的通信中可以直接使用该映射,而不必再次进行ARP请求。
4.数据传输:
现在,主机A已经知道了主机B的MAC地址,可以将数据包封装在以太网帧中,通过数据链路层传输到主机B。
之后,主机A可以直接使用ARP缓存表中的信息来与主机B通信,直到缓存表中的映射关系失效(超时)为止。
ARP数据报格式
注意到源 MAC 地址、目的 MAC 地址在以太网首部和 ARP 请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
前三个字段是 MAC 帧的报头,所以真实的 ARP 请求只有后面的部分:
-
硬件类型指链路层的网络类型,1 为以太网。
-
协议类型指要转换的地址类型,0x0800 为 IP 地址。
-
硬件地址长度对于以太网地址为 6 字节,因为 MAC 地址是 48 位的。
-
协议地址长度对于 IP 地址为 4 字节,因为 IP 地址是 32 位的。
-
op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。