【Linux 32】数据链路层协议

🌈 一、以太网技术

⭐ 01. 数据链路层所解决的问题

image-20241110195525832

  • IP 协议能够将数据从一台主机跨网络的传输到另一台主机。数据在进行跨网络传输时,中间需要经过 N 个路由器进行路由转发,才能抵达目标主机。
  • IP 协议能够实现跨网络传输数据的前提是,需要先将数据从一个节点传输到和自己相连的下一个节点。而想要让两个节点相连,这两个节点就必须处在同一局域网中,实现的是局域网中的通信。
  • IP 层实现的是跨网络的通信局域网通信由位于网络层之下的数据链路层实现
    • 两台主机在跨网络通信前,要先保证能在同一个网段 (局域网) 内通信。

⭐ 02. 以太网相关概念

🌙 2.1 局域网技术

  1. 以太网:一种应用的最普遍的局域网技术
  2. 令牌环网:常用于 IBM 系统中,在这种网络中有一种被称为 令牌 的帧,在环路中的节点只有持有令牌才能发送数据。
  3. 无线 LAN / WAN:无线局域网是有线网络的补充和拓展。

网络可以采用不同的局域网技术

  • 由于 IP 层屏蔽了底层网络的差异,因此,底层可以使用任意局域网技术通信。
    • 数据在发送之前都会进行数据封装,链路层也会为数据封装上链路层对应的局域网的报头。
    • 当要进行跨网络传输数据时,需要通过路由器对数据进行路由转发。
    • 当数据被路由器向上交付时,则会将该数据中对应的局域网报头去掉。
    • 当路由器将数据转发给下一跳路由前,会为该数据封装上下一跳网络所对应的局域网报头。
  • 网络中的路由器会不断去掉数据中旧的局域网报头,然后添加上新的局域网报头。因此,即使数据在进行跨网络传输时,每个网络都采用不同的局域网技术也不影响。

🌙 2.2 以太网介绍

  • 以太网不是一种具体的网络,而是一种技术标准;它既包含了数据链路层的内容,也包含了一些物理层的内容。
    • 规定了网络拓扑结构、访问控制方式、传输效率等。
    • 规定了以太网中的网线必须使用双绞线,传输速率有 10M,100M,1000M 等。
  • 以太网是当前应用的最广泛的局域网技术,和以太网并列的还有令牌环网和无线 LAN 等。

🌙 03. 以太网通信原理

  • 以太网中的所有主机共享一个通信信道,当局域网中的一台主机发出数据后,该局域网中的所有主机都能收到该数据。
  • 虽然局域网中的所有主机都能收到数据,但如果主机检测出该数据不是发给自己的就会将其丢弃。

举个例子

image-20241114145034284

  • 当 A 主机想发送数据给 B 主机时,该局域网中的 ABCDE 五台主机都能收到 A 所发送的数据,但只有 B 主机能成功接收该数据。
  • ACDE 四台主机虽然都能收到 A 主机发送的数据,但是该数据中携带的目的地址是 B 主机的 MAC 地址。其他主机能够判断出这个数据不是发送给自己的,从而将其丢弃。

🌙 3.1 碰撞避免算法

  • 以太网中的所有主机共享同一个通信信道,这条信道同一时刻只允许一台主机发送数据。
  • 如果有多台主机同时发送数据,这多个数据就会在这条通信信道中发生碰撞。
  • 而从系统的层面看,这个通信信道属于一种临界资源,这个临界资源同一时刻只能被一台主机使用。
  • 为了解决数据碰撞的问题,以太网引入了碰撞避免算法

如何实现碰撞避免

  • 当多台主机所发送的数据发生数据碰撞时,要执行碰撞避免算法。
  • 当发生了碰撞时,如果继续发送数据,大概率还会发生碰撞。可以让发生碰撞的主机各自等待一段随机时间后再重新发送数据。
  • 碰撞避免说白了就是让要发送数据的主机差开一个时间段,在不同的时间使用通信信道发送数据。

⭐ 04. 以太网 MAC 帧格式

image-20241114153201869

  • 源地址和目的地址是网卡的硬件地址 (MAC 地址),长度都是 6 字节 (48 位),每一个 MAC 地址在网卡出厂就已经固定。
  • 帧协议类型字段有三种值,分别对应:IP 协议、ARP 协议、RARP 协议。
  • 帧的末尾是 CRC 校验码。

🌙 4.1 MAC 帧如何将报头和有效载荷分离

  • 以太网 MAC 帧的帧头和帧尾的长度固定 (帧头 14 字节,帧尾 4 字节)。
  • 当底层获取一个 MAC 帧后,从第一个字节开始向后读取 14 个字节,即可获取到有效载荷的第一个字节。再继续读取到剩下最后 4 个字节的帧尾时就不用继续了。

🌙 4.2 将有效载荷交给上层协议

  • 在 MAC 帧的帧头中,有一个 2 字节的类型字段,该字段所对应的协议类型分别有 IP 、ARP、RARP 三种。
  • 分离出报头和有效载荷后,会根据该字段的值将有效载荷交给对应的上层协议。

⭐ 05. 认识 MAC 地址

  • MAC 地址内嵌在网卡中,每张网卡在出厂时都有一个唯一的 MAC 地址。
  • 局域网中的主机就是通过数据中携带的 MAC 地址来识别数据是谁发的,以及要发送给谁。
  • MAC 帧格式中的目的地址和源地址指的就是 MAC 地址,MAC 地址长度为 48 位 (6 字节),一般用 16 进制的数据 + 冒号的形式表示。

查看 MAC 地址

  • 在命令行中输入 ifconfig 指令,ether (以太) 那一行数字就是 MAC 地址。

image-20241114160908730

⭐ 06. MAC 地址和 IP 地址

  • 数据在路由过程中需要持有两套地址,一套是源 IP 和目的 IP,另一套是源 MAC 和目的 MAC 地址。
    • IP 地址表示数据在整个网络中的起点和终点。
    • MAC 地址表示数据在路上所经过的每一个局域网中的起点和终点。
  • 数据在路由过程中,IP 地址固定 (由于 NAT 技术的存在,IP 也会变),而数据在每进行一次路由转发后,都会替换掉 MAC 地址。

⭐ 07. 为什么有 MAC 帧的最大传输单元 MTU

  • 在局域网中进行通信时,发送的数据越大,所占用通信信道的时间也就越长,发生数据碰撞的概率也就越高。因此,数据链路层就必须控制在局域网中传输的 MAC 报文的最大长度。
  • 在数据链路层中,使用 MTU 来控制 MAC 报文的最大长度。以太网对应的 MTU 的值一般是 1500 字节,不同的网络类型有不同的 MTU。如果一次性要发送的数据超过了 MTU,则需要在 IP 层对数据进行分片。

⭐ 08. MTU 对 IP 协议的影响

  • 由于数据链路层规定的 MTU 这个最大传输单元,如果 IP 层一次性要发送的数据大小超过了 MTU,IP 层就必须对该数据进行分片,然后才能将分完片的数据向下交付。
  • 数据的分片和组装发生在 IP 层,不仅仅是源端主机要对数据进行分片,数据在路由过程中,路由器也可能对这些数据进行分片。
  • 由于不同局域网所采用的局域网技术可能不同,因此,会导致不同网络的 MTU不同,如果传输路径上的某个网络的 MTU 值 < 源端网络的 MTU 值,路由器就会对该 IP 数据报再次进行分片。

⭐ 09. MTU 对 UDP 协议的影响

  • IP 报头最少也会占据 20 字节,而 UDP 的报头是定长的 8 字节。因此,UDP 报文所携带的饿数据最多不能超过 1472 字节。
  • 如果 UDP 报文所携带的数据超过了 1472 字节,也会在 IP 层进行分片。
  • 被分片的小报文在路上有一个丢了都会导致整个 UDP 报文丢失,因此分片会导致 UDP 报文大面积的丢包。

⭐ 10. MTU 对 TCP 协议的影响

  • 虽然分片也会增加 TCP 报文丢包的概率,但由于 TCP 保证可靠性,会重发报文。
  • 虽然 TCP 能够重发报文,但是这也是有代价的。因此,TCP 引入了 MSS 来控制一次性交付给 IP 层的数据量。
  • MSS 的值并不是固定的,它需要经过通信双方协商后才能确定。

如何确定 MSS 值

  • TCP 的一个数据报也不能无限大,还是受制于 MTU。TCP 的单个数据报的最大消息长度,称为 MSS (Max Segment Size)。
  • TCP 在建立连接的过程中,通信双方会协商 MSS 的值。
  • 最理想的情况下,MSS 的值正好是在 IP 不会被分片处理的最大长度 (这个长度仍然是受制于数据链路层的 MTU)。
  • 双方在发送 SYN 连接请求报文的时候会在 TCP 头部写入自己能支持的 MSS 值。
  • 然后双方得知对方的 MSS 值之后,就会选择较小那个的作为最终的 MSS 值。
  • MSS 的值位于 TCP 首部的 40 字节变长选项中 (kind = 2)

⭐ 11. 查看硬件地址和 MTU

  • 在命令行中输入 ifconfig 指令。
  • MTU 后面跟着的就是当前网络的数据链路层的 MTU 的值。

image-20241114172254763

  • 在 ether (以太) 后面跟着的就是硬件地址 (MAC 地址)。

image-20241114172359992

🌈 二、地址解析协议 ARP

  • 地址解析协议 ARP (Address Resolution Protocol) 是一个根据 IP 地址获取 MAC 地址的协议。
  • ARP 是一种介于数据链路层和网络层之间的协议,整体上属于数据链路层,但 ARP 是 MAC 帧的上层协议。

⭐ 01. ARP 协议的功能

image-20241116095926045

  • 当 A 主机发送数据给 B 主机时,这个数据在途中需要经过各种路由转发最终到达路由器 D,最后由路由器 D 将数据转发给 B 主机。
  • 路由器 D 和主机 B 属于同一个网络,想要给同局域网中的其他主机转发数据,就需要直到该主机的 MAC 地址。
  • 但是路由器 D 手里只有 B 主机的 IP 地址,并没有 B 主机的 MAC 地址。
  • 此时就需要通过 ARP 协议从 B 主机的 IP 地址中提取出 B 主机的 MAC 地址。
  • ARP 协议的功能就是根据目标主机的 IP 地址获取目标主机的 MAC 地址

⭐ 02. ARP 协议的数据报格式

  • ARP 协议中,各字段的数据单位为字节。

image-20241116100608064

  • 硬件类型:表示数据链路层的网络类型,为 1 则表示以太网。
  • 协议类型:表示要转换的地址类型,如果该字段的值为 0x0800 则表示要转换的是 IP 地址。
  • 硬件地址长度:如果使用的是以太网地址 (MAC 地址),则该字段的值为 6,表示 MAC 地址的长度为 6 字节。
  • 协议地址长度:如果使用的是 IP 协议,则用 4 字节表示 IP 地址的长度。
  • OP:如果在一个 ARP 报文中,该字段的值为 1,则表示 ARP 请求;如果该字段的值为 2,则表示 ARP 应答。

⭐ 03. ARP 协议的工作流程

image-20241116100922301

  • 以将数据从 A 主机发送给 B 主机为例,数据已经被路由转发到了 D 路由器,现在就等着 D 路由器将数据转发给 B 主机了。
  • D 路由器想将数据转发给 B 主机,必须要先通过 B 主机的 IP 地址知道 B 主机的 MAC 地址。
  • D 路由器需要向 B 主机发送一个ARP 请求,然后等待 B 主机返回一个 ARP 应答,来告知 B 主机的 MAC 地址。

image-20241116110212078

🌙 3.1 发起 ARP 请求的过程

1. 路由器 D 构建 ARP 请求

  1. 将 ARP 报头中的 [OP] 字段置为 1,表示这个一个 ARP 请求报文。
  2. 将 ARP 请求中的 [硬件类型] 字段置为 1,表示当前使用的是以太网通信。
  3. 将 ARP 请求种的 [协议类型] 字段置为 0800,表示路由器需要根据 IP 地址来获取 MAC 地址。
  4. 将 ARP 请求中的 [硬件地址长度] 字段置为 6,表示 MAC 地址的长度为 6 字节。
  5. 将 ARP请求中的 [协议地址长度] 字段置为 4,表示 IP 地址的长度为 4 字节。
  6. 使用 B 主机的 MAC 地址和 IP 地址填充 ARP 请求中的 [目的以太网地址] 和 [目的 IP 地址] 这两个字段。由于当前还不知道 B 主机的 MAC 地址,因此将 [目的以太网地址] 的二进制序列全部置为 1 (FF:FF:FF:FF:FF:FF),表示以广播的方式将该 ARP 请求报文发送到局域网中。

2. 将 ARP 请求封装成 MAC 帧

  • 构建好 ARP 请求报文后,还需要对该报文进行组帧封装成 MAC 帧后,才能将该 ARP 请求报文发送到以太网中。
  1. 使用目标主机 B 和 路由器 D 的 MAC 地址填充MAC 帧格式中的 [目的地址] 和 [源地址]。由于主机 B 的 MAC 地址未知,因此将 MAC 帧中的目的地址的二进制序列全部置为 1,表示在局域网中广播。
  2. 将 MAC 帧格式中的 [帧类型] 字段置为 0806,表示封装的是一个 ARP 报文。
  3. ARP 请求报文的长度为 28 字节,不足 MAC 帧所需要的 46 字节。还需要在 MAC 帧的有效载荷中补充 18 字节的填充字段。
  4. 对 MAC 帧进行 CRC 校验。

3. 将封装好的 MAC 帧广播到局域网中

  1. 将封装好的 MAC 帧发送到局域网后,局域网中的主机都能收到这个 MAC 帧。
  2. 每台主机的 MAC 层在接收到 MAC 帧后,会根据帧类型字段判断出有效载荷是一个 ARP 报文。分离出有效载荷 (ARP 请求报文) 后向上交付给 ARP 层。
  3. 这些主机的 ARP 层识别出该 ARP 报文的 [OP] 的值为 1,知道这是个 ARP 请求报文。
  4. 然后就去提取该 ARP 请求报文中的 [目的 IP 地址] 判断是否指向自己,如果不是则丢弃该 ARP 请求,只有目标主机会处理该 ARP 请求。

🌙 3.2 返回 ARP 应答的过程

1. 主机 B 构建 ARP 应答报文

  1. 将 ARP 报头中的 [OP] 字段置为 2,表示这个一个 ARP 应答报文。
  2. ARP 应答报文中的硬件类型、协议类型、硬件地址长度、协议地址长度与 ARP 请求报文中的值一致。
  3. 使用 B 主机的 [MAC 地址] 和 [IP 地址] 分别填充 ARP 应答报文中的 [发送端以太网地址] 和 [发送端 IP 地址]。
  4. 使用路由器 D 的 [MAC 地址] 和 [IP 地址] 分别填充 ARP 应答中的 [目的以太网地址] 和 [目的 IP 地址]。

2. 将 ARP 应答封装成 MAC 帧

  1. 使用路由器 D 和主机 B 的 MAC 地址分别填充 MAC 帧报头中的 [以太网目的地址] 和 [以太网源地址]。
  2. 将 MAC 帧报头中的 [帧类型] 字段置为 0806,表示封装的是一个 ARP 报文。
  3. ARP 应答报文的长度为 28 字节,不足 MAC 帧所需要的 46 字节。还需要在 MAC 帧的有效载荷中补充 18 字节的填充字段。
  4. 对 MAC 帧进行 CRC 校验。

3. 将封装好的 MAC 帧广播到局域网中

  1. 由于该 MAC 帧中填充了路由器 D 的 MAC 地址,因此局域网中其他收到该 MAC 帧的主机能直接在 MAC 层就识别出数据不是发给自己的,不会往上交给 ARP 层,而是直接丢弃。
  2. 路由器 D 在收到该 MAC 帧后,通过里面的 [以太网目的地址] 识别出是发给自己的。
  3. 路由器 D 发现该 MAC 帧的 [帧类型] 的值为 0806,知道了该 MAC 帧的有效载荷是一个 ARP 报文,直接将这个 ARP 报文提取出来交给 ARP 层。
  4. 路由器 D 的 ARP 层收到这个 ARP 报文后,通过 OP 字段判断出这是个 ARP 应答报文,然后就能提取出 B 主机的 MAC 地址了。

⭐ 04. ARP 缓存表

  • 在使用 ARP 获取到目标主机的 MAC 地址后,会将对应主机的 IP 地址和 MAC 地址的映射关系存储在一张 ARP 缓存表中。
  • 之后就不需要每次都发起 ARP 请求获取 MAC 地址了,只需要根据 IP 地址即可在 ARP 缓存表中查到对应的 MAC 地址。
  • 如果 ARP 缓存表中没有与目标主机 IP 地址所对应的 MAC 地址,才会发起 ARP 请求。

查看 ARP 缓存表

  • 每台主机内都维护了一张 ARP 缓存表,通过 arp -a 指令 (Windows 和 Linux 都是这个) 即可查看本主机中的 ARP 缓存表。

image-20241116143924713

  • ARP 缓存表中的内容有过期是过期时间 (一般是 20 分钟),如果 20 分钟内没有使用则会失效,下次再使用时就需要重新发起 ARP 请求获取对应主机的 MAC 地址。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值