

一:🔥 数据链路层
🦋 知识连接
🔗 传输层协议提供一种策略保证通信的稳定性 ;网络层协议提供一种能力保证可以进行通信 。数据链路层是用于两个设备(同一种数据链路节点)之间进行传递。
🆕 网络通信中,主机 A 向 主机 B 发送数据时,并不是直接将报文发送到目标主机,而是会经过很多台路由器的转发!要在一台一台路由器之间不断的跳转。跨网络转发的本质是进行多次的子网转发! 所以路由器就要先保证在同一个网段中相互之间可以进行转发。
🛜 局域网中以太网是常用技术。“以太网” 不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容, 也包含了一些物理层的内容。例如: 规定了网络拓扑结构,访问控制方式,传输速率。以太网是当前应用最广泛的局域网技术,和以太网并列的还有令牌环网,无线LAN 等。
⬇️ 在以太网中发送数据是以以太网帧的格式进行发送的 ⬇️
🦋 以太网帧格式
🎶 以太网的帧格式如下所示:
- 源地址 和 目的地址 是指网卡的 硬件地址 (也叫 MAC 地址), 长度是 48 位, 是在网卡出厂时固化的;
- 6 字节目标地址:MAC 地址 是6字节,所以 目标地址是 6 字节。
- 6 字节源地址 :MAC 地址 是6字节,所以 源地址是 6 字节。
- 2 字节帧协议类型 字段有三种值, 分别对应
IP
、ARP
、RARP
; - 帧末尾是 4字节 CRC 校验码。
对于这个以太网协议我们依然需要解决两个问题:
- 如何解包?
以太网帧采用的是定长报头,进行解包就直接去除定长的报头与报尾结构即可
- 如何分用?
这里我们模拟一下局域网通信的过程:
- 在局域网中有若干主机 ABCD…,主机 A 此时向 G 发送信息。主机A 就先把 MAC 帧先填好目的地址与源地址:
- 主机A 将这个 MAC 帧放到网络中,其他主机的的数据链路层会先获取到 MAC 帧,因为报头是定长,可以快速取到报头,判断是否是发送给自己的报文, 如果发现不是自己的报文, 那么在数据链路层这个报文就被丢弃了。许多的 MAC 帧之间会发生碰撞,越长的数据越容易产生碰撞,所以数据链路层才有 MTU 限制 一次发送的大小!
- 同样的也有最小数据帧限制 MSS,对于不够的数据,会填充垃圾数据,那么会影响报文长度,这也就是为什么IP协议要带总长度字段!
- 随着主机数的增加,每台主机处理的 MAC 帧就会越来越多,出现大面积的碰撞。通信成功的概率就越来越小(这也是人数密集的地方网络差的原因)。
- 这里会涉及到交换机:交换机会把不同的主机划分成不同的区域!交换机对于所有主机的数据都可以收到,其转发的数据对象就是数据帧,所以也是工作在数据链路层!
- 交换机会对数据帧进行分析,将数据帧发放到对应的区域,这样可以很好的优化碰撞发生的概率!有效管理数据帧的扩散范围。
🦋 认识 MTU
MTU
相当于发快递时对包裹尺寸的限制. 这个限制是不同的数据链路对应的物理层, 产生的限制.- 以太网帧中的数据长度规定最小 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 协议:
- 一旦 UDP 携带的数据超过 1472 (1500 - 20(IP 首部) - 8(UDP 首部)), 那么就会在网络层分成多个 IP 数据报.
- 这多个 IP 数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果 UDP 数据报在网络层被分片, 整个数据被丢失的概率就大大增加了.
🦋 MTU 对于 TCP 协议的影响
🐳 让我们再回顾一下 TCP 协议:
- TCP 的一个数据报也不能无限大, 还是受制于 MTU. TCP 的单个数据报的最大消息长度, 称为 MSS(Max Segment Size);
- TCP 在建立连接的过程中, 通信双方会进行 MSS 协商.
- 最理想的情况下, MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU).
- 双方在发送 SYN 的时候会在 TCP 头部写入自己能支持的 MSS 值.
- 然后双方得知对方的 MSS 值之后, 选择较小的作为最终 MSS.
- MSS 的值就是在 TCP 首部的 40 字节变长选项中(kind=2)
- 所以 TCP 中的滑动窗口内的内容是一段一段发的!!!
二:🔥 局域网数据传输细节解析
🦋 细节一:互斥访问局域网资源
💥 为了避免局域网中数据碰撞的问题,要保证任何时刻只有一台主机在使用局域网资源。
原因:
当两台以上的主机同时发送数据时,数据包会在传输介质(如以太网电缆)上相互干扰,导致数据碰撞。碰撞的结果是数据包损坏,接收方无法正确解析数据,从而导致传输失败。
解决方案:
🎁 为了防止数据碰撞:
- 主机在发送数据之前,会先监听传输介质,检查是否有其他主机正在发送数据。
- 如果传输介质空闲,主机可以开始发送数据。
- 在发送数据的过程中,主机还会持续监听传输介质。如果检测到冲突(即有其他主机同时发送数据),则立即停止发送,并发出一个“冲突信号”,通知其他主机发生了冲突。
通过这种方式,确保了在同一时刻,只有一个主机能够成功发送数据,从而避免了数据碰撞。
🦋 细节二:碰撞检测与碰撞避免
如果发生了碰撞,涉及碰撞的主机会采取以下措施:
- 停止发送:一旦检测到碰撞,主机立即停止发送数据,以避免进一步的数据损坏。
- 随机延迟后重发:主机进入“退避”状态,等待一个随机的时间间隔后再尝试重新发送数据。这个随机延迟时间是根据二进制指数退避算法计算的,目的是减少再次碰撞的可能性。
- 让出网络资源:在退避期间,主机不会占用网络资源,从而为其他主机提供发送数据的机会。
重要性:
🧀 这种机制不仅避免了数据碰撞,还通过随机延迟和重试机制,提高了网络资源的利用率,确保了网络的高效运行。
🦋 细节三:局域网的临界资源特性
🔗 局域网可以被视为一个 临界资源
,因为在同一时刻,只能有一台主机向局域网发送数据。这与操作系统中的 互斥(Mutex)
概念非常相似。互斥机制确保了在多线程或多进程环境中,只有一个线程或进程能够访问共享资源,从而避免了资源竞争和数据损坏。
🦋 细节四:碰撞域中的主机数量
在一个碰撞域中,主机的数量对网络性能有显著影响。
主机数量越少越好:
- 减少碰撞概率:主机数量越少,同时发送数据的概率就越低,从而减少了碰撞的可能性。
- 提高传输效率:较少的主机意味着更少的冲突检测和退避操作,数据传输效率更高。
- 降低延迟:较少的主机竞争网络资源,减少了数据传输的延迟。
结论:
🐣 在一个碰撞域中,主机数量越少越好。为了提高网络性能,可以通过划分多个碰撞域(如使用交换机)来减少每个域中的主机数量。
🦋 细节五:数据帧长度的选择
在单台主机中,发送数据帧时,数据帧的长度对网络性能也有重要影响。
数据帧长度越长越好?
- 优点:较长的数据帧可以减少单位数据的传输开销(如帧头和帧尾的开销),提高传输效率。
- 缺点:如果数据帧过长,一旦发生碰撞,整个数据帧都会丢失,需要重新发送,这会增加传输延迟和网络负载。
数据帧长度越短越好?
- 优点:较短的数据帧在发生碰撞时,丢失的数据量较少,重新发送的开销较小。
- 缺点:如果数据帧过短,单位数据的传输开销会增加,降低了传输效率。
最优选择:MTU(最大传输单元)
为了平衡传输效率和可靠性,网络协议定义了 最大传输单元(MTU) 的概念。MTU 是指在不进行分片的情况下,网络层协议能够传输的最大数据帧长度。
- 以太网的MTU:在以太网中,MTU 通常为1500字节。这个长度是在传输效率和可靠性之间经过优化的平衡点。
- 其他网络技术:不同的网络技术可能有不同的 MTU 值 ,例如,一些高速网络技术(如Jumbo Frames)支持更大的 MTU 值,以提高传输效率。
结论:
数据帧长度并不是越长越好,也不是越短越好。选择合适的MTU值可以在传输效率和可靠性之间取得最佳平衡。
🦋 查看硬件地址和 MTU
使用 ifconfig 命令, 即可查看 ip 地址, mac 地址, 和 MTU;
三:🔥 ARP协议:IP地址和MAC地址的“翻译官”
🦋 为啥需要ARP?
☝️ 大家都知道,咱们在局域网里通信,真正用到的其实是 MAC地址,而不是 IP地址。就好比你寄快递,虽然你写的是收件人的名字(IP地址),但快递员真正用到的是收件人的地址(MAC地址)。因为快递员(网络设备)是按照地址来送快递的,而不是名字。
🦋 IP地址和MAC地址的关系
IP地址是网络层的地址,它负责在互联网上找到目标设备,就像快递单上的收件人名字。而MAC地址是数据链路层的地址,它负责在局域网里找到目标设备,就像快递单上的详细地址。
问题来了:我们发消息的时候,只知道对方的IP地址,但实际发送数据的时候,必须得用到MAC地址。这就需要一个“翻译官”,把IP地址翻译成MAC地址。这个“翻译官”就是ARP协议。
🦋 ARP协议是啥?
ARP 全名叫“地址解析协议”(Address Resolution Protocol)。它的任务就是把IP地址翻译成MAC地址。ARP协议很特别,它不是单纯的数据链路层协议,也不是纯粹的网络层协议,而是介于两者之间的一个协议。它就像一个“中间人”,帮IP地址和MAC地址“牵线搭桥”。
🦋 ARP的工作过程
假设主机A想给主机C发消息,过程是这样的:
(1)查询MAC地址
主机A会先在自己的ARP缓存里查一查,看看有没有主机C的MAC地址。ARP缓存就像是一个“小本本”,记录了之前查询过的IP地址和对应的MAC地址。如果找到了,直接用这个MAC地址发消息就行。
(2)发送ARP请求
如果主机A没找到主机C的MAC地址,它就会广播一个ARP请求。这个请求就像是在局域网里喊一嗓子:“嘿,谁的IP地址是主机C的IP地址?告诉我你的MAC地址!”这个请求会发给局域网里的所有设备。
(3)主机C响应
主机C收到这个请求后,会回复一个ARP响应:“嘿,我就是主机C,我的MAC地址是……”这个响应是直接发给主机A的。
(4)更新ARP缓存
主机A收到主机C的响应后,就会把主机C的IP地址和MAC地址记录到自己的ARP缓存里,下次再发消息就不用再广播请求了。
🦋 为啥ARP很重要?
ARP 协议在局域网里非常重要,因为它解决了IP地址和MAC地址之间的转换问题。没有ARP,主机A就找不到主机C的MAC地址,也就没法在局域网里发消息了。ARP就像是局域网里的“导航仪”,帮数据找到正确的路径。
🦋 ARP 协议的工作流程
- 源主机发出 ARP 请求,询问“IP 地址是 192.168.0.1 的主机的硬件地址是多少”, 并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播);
- 目的主机接收到广播的 ARP 请求,发现其中的 IP 地址与本机相符,则发送一个 ARP 应答数据包给源主机,将自己的硬件地址填写在应答包中;
- 每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。 缓存表中的表项有过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项,则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址
$ arp -a
想一想,为什么要有缓存表? 为什么表项要有过期时间而不是一直有效?
再想一想, 结合我们刚才讲的工作流程, ARP 的数据报应该是一个什么样的格式?
🦋 ARP缓存的作用
ARP缓存就像是一个“备忘录”,记录了之前查询过的IP地址和MAC地址。这样做的好处是,下次再发消息的时候,就不需要再广播请求了,直接用缓存里的MAC地址就行。这不仅提高了效率,还减少了网络上的广播流量。
🦋 ARP 数据报的格式
- 注意到源 MAC 地址、 目的 MAC 地址在以太网首部和 ARP 请求中各出现一次, 对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。
- 硬件类型指链路层网络类型,1 为以太网;
- 协议类型指要转换的地址类型,0x0800 为 IP 地址;
- 硬件地址长度对于以太网地址为 6 字节;
- 协议地址长度对于和 IP 地址为 4 字节;
- op 字段为 1 表示 ARP 请求,op 字段为 2 表示 ARP 应答。
🦋 ARP的局限性
ARP协议虽然很方便,但也有一些局限性。比如,它只能在局域网内工作,不能跨网络使用。另外,ARP请求是广播的,可能会被恶意设备监听,导致安全问题。所以,ARP协议虽然强大,但也要注意保护好自己的网络环境。
四:🔥 ARP 欺骗原理
🦋 步骤一 攻击者伪造ARP响应
假设你和你的朋友在一个局域网里聊天,你的电脑(A)想给朋友的电脑R)发消息。正常情况下,你的电脑会广播一个ARP请求:“谁的IP是主机R?告诉我你的 MAC 地址。”然后主机R会回复它的MAC地址。
但是,如果这时候有一个“坏蛋”(攻击者M)想捣乱,它会伪造一个ARP响应,假装自己是主机 R,把自己的 MAC 地址发给你。你的电脑收到这个伪造的响应后,就会把攻击者的 MAC 地址当作主机 R 的 MAC 地址,记到自己的 ARP 缓存里。
🦋 步骤二 攻击者截获数据
当你开始给主机R 发消息的时候,你的电脑会把数据包发到攻击者的 MAC地址上,因为你的ARP缓存里记录的是攻击者的MAC地址。这样一来,攻击者就可以截获你的数据包,看到你发给主机R的内容。
🦋 步骤三 攻击者转发数据(可选)
攻击者拿到你的数据包后,可以选择直接丢弃,也可以把数据包转发给主机R。如果它选择转发,主机R会收到你的消息,但完全不知道中间被攻击者截获了。这样,攻击者就完成了一个中间人攻击,既可以窃听你们的对话,还可以篡改数据。
五:🔥 共勉
😋 以上就是我对 数据链路层
的理解, 觉得这篇博客对你有帮助的,可以点赞收藏关注支持一波~ 😉