【Linux系统化学习】数据链路层

目录

数据链路层解决的问题

以太网

认识局域网

以太网帧格式

两个问题

认识MAC地址

认识MTU

ARP协议

ARP协议的作用

ARP数据报格式

ARP协议的工作流程


数据链路层解决的问题

对于TCP/IP四层协议来说,数据链路层才是真正从传送数据进行跑腿办事情的;传输层的TCP协议通过各种策略确保了数据传输的可靠性;网路层IP协议通过路由和转发可以将数据报从一个子网传送到另外一个子网,最后传送到目标主机所在的子网;而数据链路层就要实现TCP协议的能力和IP协议跨网络转发;最重要的是实现网络层的跨网络转发,是如何从源主机一步一步通过mac地址跳转到转发路由器,转发路由器通过下一跳跳转到目标主机的子网,最后到达目标主机。

通俗的来说数据链路层解决的就是局域网内的通信问题源主机是如何将数据包一步一步交给本地子网网关,由这个网关进行跨网络的路由转发。

源主机在发送消息时,首先会检查目标主机的IP地址是否与自己处于同一子网。如果是,则使用ARP协议获取MAC地址并进行通信;如果不是,则使用ARP协议获得路由器的mac地址将数据包发送到本地子网的默认网关(路由器的LAN口),由路由器根据路由表进行转发。

以太网

数据链路层要解决局域网通信问题,我们就要对局域网有所了解。

认识局域网

以太网(Ethernet)

  • 以太网是最常用的局域网技术之一。它基于IEEE 802.3标准,使用双绞线作为传输介质。

Wi-Fi

  • Wi-Fi是一种无线局域网技术,通过无线信号进行数据传输和通信。

令牌环网

  • 令牌环网是一种采用环形拓扑结构的局域网技术,其中数据沿着一个逻辑上的环形路径进行传输。 

以太网帧格式

  • 源地址和目的地址是指网卡的硬件地址(也叫MAC地址), 长度是48位,是在网卡出厂时固化的;
  • 帧协议类型字段有三种值,分别对应IP、ARP、RARP;
  • 帧末尾是CRC校验码。

两个问题

如何将报头和有效载荷进行分离?

以太网MAC帧的帧头和帧尾都是固定长度的,因此当底层收到一个MAC帧后,直接提取出MAC帧当中固定长度的帧头和帧尾,此时剩下的就是有效载荷了。

有效载荷如何向上交付? 

以太网MAC帧对应的上层协议不止一种,因此在将MAC帧的报头和有效载荷分离后,还需要确定应该将分离出来的有效载荷交付给上层的哪一个协议。

在MAC帧的帧头当中有2个字节的类型字段,因此在分离出报头和有效载荷后,根据该字段将有效载荷交付给对应的上层协议即可。

认识MAC地址

  • MAC地址用来识别数据链路层中相连的节点;
  • 长度为48位, 及6个字节. 一般用16进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)
  • 在网卡出厂时就确定了, 不能修改. mac地址通常是唯一的(虚拟机中的mac地址不是真实的mac地址, 可能会冲突; 也有些网卡支持用户配置mac地址).

理解MAC地址和IP地址

实际数据在路由过程中会存在两套地址,一套是源IP地址和目的IP地址,还有一套是源MAC地址和目的MAC地址。

  • IP地址描述的是路途总体的起点和终点。
  • MAC地址描述的是路途上的每一个区间的起点和终点。

就像唐僧西天取经的时候,源IP就是长安城,目的IP就是天竺;而MAC地址就是中间路上的每一个站点向女儿国、火焰山等等。 因此数据在路由过程中,源IP地址和目的IP地址可以理解成是不会变化的,而数据每进行一跳后其源MAC地址和目的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携带的数据超过1472(1500 - 20(IP首部) - 8(UDP首部)), 那么就会在网络层分成多个IP数据报.这多个IP数据报有任意一个丢失, 都会引起接收端网络层重组失败. 那么这就意味着, 如果UDP数据报在网络层被分片, 整个数据被丢失的概率就大大增加了.

MTU对TCP的影响

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

MSS和MTU的关系

ARP协议

虽然我们在这里介绍ARP协议, 但是需要强调, ARP不是一个单纯的数据链路层的协议, 而是一个介于数据链路层和网络层之间的协议; 地址解析协议(Address Resolution Protocol,ARP)协议,是根据IP地址获取MAC地址的一个TCP/IP协议。

ARP协议的作用

ARP协议建立了主机 IP地址 和 MAC地址 的映射关系.
在网络通讯时,源主机的应用程序知道目的主机的IP地址和端口号,却不知道目的主机的硬件地址;
数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符,则直接丢弃;因此在通讯前必须获得目的主机的硬件地址;

ARP数据报格式

注意到源MAC地址、目的MAC地址在以太网首部和ARP请求中各出现一次,对于链路层为以太网的情况是多余的,但如果链路层是其它类型的网络则有可能是必要的。

  • 硬件类型指链路层网络类型,1为以太网;
  • 协议类型指要转换的地址类型,0x0800为IP地址;
  • 硬件地址长度对于以太网地址为6字节;
  • 协议地址长度对于和IP地址为4字节;
  • op字段为1表示ARP请求,op字段为2表示ARP应答。

ARP协议的工作流程

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

ARP缓存表

为什么要有缓存表?

  1. 提高效率:缓存表可以存储最近解析的地址映射关系,当需要再次访问相同的目标时,可以直接从缓存表中获取对应的地址,而无需再次发起网络查询。这样可以大大减少网络查询的次数,提高通信效率。

  2. 减少网络负载:如果没有缓存表,每次通信都需要进行地址解析,这将导致大量的网络查询流量,增加网络负载。缓存表可以有效减少这种不必要的网络流量。

  3. 快速响应:缓存表使得地址解析变得迅速,从而减少了通信的延迟,提高了网络的响应速度。

为什么表项要有过期时间而不是一直有效?

  1. 动态网络环境:在网络环境中,设备的IP地址和MAC地址可能会发生变化。如果缓存表中的表项一直有效,那么当目标设备的地址发生变化时,缓存表中的旧地址信息将导致通信失败。通过设置过期时间,可以确保缓存表中的地址信息保持最新。

  2. 防止资源耗尽:如果缓存表无限制地增长且表项永不过期,那么随着时间的推移,缓存表将占用越来越多的内存资源,可能导致系统资源耗尽。过期机制有助于定期清理旧的、不再需要的表项,从而释放内存资源。

  3. 安全性考虑:在网络中,可能存在恶意设备试图通过伪造ARP响应来实施ARP欺骗攻击。过期时间可以限制这种伪造响应的影响时间,因为伪造的表项会在一段时间后自动失效。

  4. 网络变化适应性:网络环境和配置可能会发生变化,例如设备的添加、移除或IP地址的更改。过期时间确保了缓存表能够适应这些变化,并及时更新以反映最新的网络状态。


今天对Linux数据链路层的分享到这就结束了,希望大家读完后有很大的收获,也可以在评论区点评文章中的内容和分享自己的看法;个人主页还有很多精彩的内容。您三连的支持就是我前进的动力,感谢大家的支持!!! 

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-22 08:52:02       52 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-22 08:52:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-22 08:52:02       45 阅读
  4. Python语言-面向对象

    2024-07-22 08:52:02       55 阅读

热门阅读

  1. 【自动化机器学习AutoML】AutoML工具和平台的使用

    2024-07-22 08:52:02       16 阅读
  2. 【数据挖掘基础】数据挖掘技术概述和基本算法

    2024-07-22 08:52:02       16 阅读
  3. 常用传感器误差补偿方法介绍

    2024-07-22 08:52:02       16 阅读
  4. ARM/Linux嵌入式面经(十七):美团校招面经

    2024-07-22 08:52:02       15 阅读
  5. 深度学习简介(框架)

    2024-07-22 08:52:02       15 阅读
  6. ChatGPT的工作记忆容量:一项实证研究

    2024-07-22 08:52:02       14 阅读
  7. AI学习指南机器学习篇-SOM的拓扑结构与参数调优

    2024-07-22 08:52:02       16 阅读
  8. 如何调整图像的窗宽窗位

    2024-07-22 08:52:02       15 阅读
  9. linux字符设备驱动+fops应用测试程序

    2024-07-22 08:52:02       14 阅读
  10. opencv—常用函数学习_“干货“_14

    2024-07-22 08:52:02       16 阅读
  11. 网络安全防线:黑龙江等级保护测评标准详解

    2024-07-22 08:52:02       16 阅读
  12. thinkphp8结合layui2.9 图片上传验证

    2024-07-22 08:52:02       14 阅读
  13. grub之loongarch架构调试

    2024-07-22 08:52:02       12 阅读
  14. 任务3 git基础知识(主要是pr的笔记)

    2024-07-22 08:52:02       18 阅读