当前位置: 首页 > article >正文

网络原理(5)—— 数据链路层详解

目录

一. 以太网

1.1 认识以太网

1.2 网卡与以太网

1.3 以太网帧格式

二. 认识MAC地址

三. MAC地址 与 IP地址 的区别

4.1 定义

4.2 分配方式

4.3 工作层次

4.4 地址格式

4.5 寻址方式

四. ARP协议 

4.1 引入 

4.2 ARP的概念

4.3 ARP工作原理

五. MTU 与 MSS 

 5.1 MTU 

5.2 MSS 

 5.3 TCP分段与IP分片 

5.4 避免分片 


一. 以太网

1.1 认识以太网

   以太网(Ethernet)不是一种具体的网络,而是一种广泛使用的局域网(LAN)技术,它规定了物理层和数据链路层的通信协议。以太网可以使用多种传输介质,包括同轴电缆、双绞线和光纤,就像是家里的电线系统,只不过它是用来连接电脑和其他设备的。

   路由器通过以太网线连接到调制解调器(俗称“猫”,“光猫”-->“光纤调制解调器”),然后通过这个调制解调器连接到互联网,这样就能上网了。

举个例子:

   如果你家里有很多电器,比如灯泡、电视和冰箱,它们都需要用电来工作。电线就是连接这些电器和电源的一个通道,让电能够从电源传到每个电器。以太网也是这样,它是一种通道,让电脑和其他设备能够互相“说话”和交换信息。 

1.2 网卡与以太网

   网卡(Network Interface Card,简称NIC)是一种硬件设备,用于将计算机连接到计算机网络,使计算机能够通过该网络与其他计算机进行通信。网卡通常插在计算机的主板扩展槽中,或者通过USB接口连接,现在很多计算机的网卡都是直接集成在主板上。

   网卡与以太网的关系,可以这样理解:以太网是一种常见的局域网技术,而网卡就是用来实现电脑与以太网连接的“桥梁”。简单来说,如果你想用电脑上网,就需要通过网卡连接到以太网,这样才能上网。就好比你想打电话给朋友,需要先拿起电话(网卡),然后通过电话线(以太网)连接到对方。

   网卡是实现以太网通信的关键组件之一,提供了计算机与以太网传输介质(如双绞线、光纤等)之间的物理接口使得计算机能够按照以太网的标准进行网络通信。没有网卡,计算机就无法直接连接到以太网网络。

1.3 以太网帧格式

二. 认识MAC地址

   MAC地址,全称媒体访问控制地址(Media Access Control Address),是一个唯一的标识符,用来定义网络设备的位置。每个网络设备(比如网卡、路由器、交换机等)在出厂时都会被分配一个唯一的MAC地址。 在局域网(比如家里的网络)中,设备之间通过MAC地址来直接通信。

   MAC地址通常由六组两位的十六进制数字组成,这些数字通过冒号或者短横线分隔。例如:00:1A:2B:3C:4D:5E 或者 00-1A-2B-3C-4D-5E。

   MAC地址在网卡出厂时就确定了,不能修改,是唯一的(虚拟机中的MAC地址不是真实的MAC地址,可能会冲突;也有些网卡支持用户配置MAC地址) 

三. MAC地址 与 IP地址 的区别

4.1 定义
  • MAC地址:是一个唯一的硬件地址,它被烧录在网络接口卡(NIC)上,用于在局域网(LAN)中标识硬件设备
  • IP地址:是一个逻辑地址,用于在网络中标识设备的网络位置,可以是局域网、广域网或互联网。
4.2 分配方式
  • MAC地址:通常是固定的,由网络接口卡的制造商分配,并在生产过程中烧录到硬件中。
  • IP地址:可以是静态分配的,也可以是动态分配的(通过DHCP服务器)。IP地址可以根据网络配置的变化而改变。
4.3 工作层次
  • MAC地址:工作在数据链路层(OSI模型的第二层),负责同一网络段内,相邻设备之间传输数据帧。(微观)
  • IP地址:工作在网络层(OSI模型的第三层),负责不同的网络之间路由数据包,进行路由规划(宏观)
4.4 地址格式
  • MAC地址:通常6个字节表示,MAC地址当前仍然可以给每个设备,都分配一个唯一的地址值。
  • IP地址:对于IPv4,使用4个字节表示;对于IPv6,使用16个字节表示
4.5 寻址方式
  • MAC地址:用于直接在局域网内寻找设备,通常是通过ARP将IP地址解析为MAC地址。以太网数据帧里面的MAC地址随着转发的过程,源MAC和目标MAC都会时刻发生改变(每经过一个交换机/路由器都会发生变化)MAC地址描述的是路途上的每一个区间的起点和终点
  • IP地址:用于在网络层寻址和路由数据包,进行路由规划,确保数据能够从源地址传输到目的地址。 IP地址描述的是路途总体的起点和终点

四. ARP协议 

4.1 引入 

   ARP协议就像是一个电话簿,帮助电脑在网络中找到其他电脑的"家门号码"。想象一下,你在一家大公司里,想要找到同事张三的家,但是你只知道他的名字(IP地址),不知道他家的具体地址(MAC地址)。这时候,你会在公司的大厅(局域网)里大声喊:“张三,你在哪?告诉我你家地址!”(发送ARP请求)。张三听到后,会告诉你他家的地址(发送ARP回复)。这样,下次你想找张三的时候,就可以直接按地址去找他了,而不需要再大声喊叫。
   简单来说,ARP协议就是电脑之间相互询问和告知彼此物理地址(MAC地址)的一种方式,这样它们就能在网络中正确地发送信息了。

4.2 ARP的概念

   ARP(Address Resolution Protocol)协议工作在OSl模型的第二层,即数据链路层。它的主要功能是将网络层(第三层)使用的IP地址解析为数据链路层(第二层)使用的MAC地址。

   在发送数据包时,网络层的IP协议负责确定数据包的目标IP地址,但是数据链路层的以太网协议需要知道目标的MAC地址才能在局域网内传输数据包。ARP协议就在这个转换过程中起到桥梁作用,它通过查询局域网内的设备来获取目标IP地址对应的MAC地址,从而确保数据包能够被正确地发送到目的地。 

4.3 ARP工作原理

1. 解析请求:当一个设备需要向局域网内的另一个设备发送数据时,它会首先检查自己的ARP缓存(一个内存表,用于存储IP地址与MAC地址的映射关系)
   如果目标IP地址的MAC地址不在缓存中,源设备将发送一个ARP请求,广播到局域网上的所有设备。

(ARP请求包含以下信息:a. 发送设备的IP地址和MAC地址    b. 目标设备的IP地址    c. 一个标志字段,表示这是一个ARP请求)

2. 解析响应:局域网上的所有设备都会收到这个ARP请求,但只有目标IP地址对应的设备会响应,响应设备会发送一个ARP回复,其中包含其MAC地址

3. 更新ARP缓存:源设备收到ARP回复后,会将目标IP地址和对应的MAC地址存储在自己的ARP缓存中,以便将来使用。

4. 数据传输:现在源设备知道了目标设备的MAC地址,它就可以将数据帧发送到局域网上的正确设备。

ARP的正常工作流程

  1. 设备A想要与设备B通信,但只知道设备B的IP地址,不知道MAC地址。
  2. 设备A会在局域网内广播一个ARP请求:“谁是IP地址X的拥有者,请告诉我你的MAC地址。”
  3. 设备B收到这个请求后,会回复一个ARP响应,告诉设备A自己的MAC地址。
  4. 设备A收到设备B的MAC地址后,就可以开始通信了。 

ARP欺骗(攻击行为)

   攻击者发送伪造的ARP响应给局域网中的设备,告诉它们:“我是IP地址Y的拥有者,我的MAC地址是Z。”  这样其他设备就会错误地将原本发送给IP地址Y的数据发送给攻击者的MAC地址。攻击者可以拦截、修改或丢弃这些数据。


ARP协议可以让当前设备获取到周围设备上的IP地址和MAC地址之间的映射关系。

  • IP协议路由转发的过程是拿着 “IP地址” 进行路由查表,得到的是 “网络接口”(抽象的概念);
  • ARP协议就是将“网络接口”转换成更具体的MAC地址,知道是具体的某个设备(IP地址 --> MAC地址)

网络接口

1. 定义

  • 网络接口指的是网络设备的物理或逻辑端口,用于设备与网络之间的连接。例如,计算机上的以太网端口、无线网卡或者虚拟网络接口。

2. 与IP地址的关系

  • 网络接口使用IP地址来发送和接收数据包。当一个设备想要与另一个设备通信时,它会将数据包发送到目标设备的IP地址。
  • 每个网络接口都需要至少一个IP地址来在网络上进行通信。一个网络接口可以配置一个或多个IP地址,这取决于网络配置和需求。
  • 在配置网络接口时,IP地址会被绑定到该接口上,这样当数据包发送到该IP地址时,网络设备就知道应该通过哪个接口来处理这些数据。
  • 网络接口负责将IP地址转换为MAC地址(通过ARP协议),以便在数据链路层上进行实际的帧传输。 

通过ARP协议,就可以得到网络接口与MAC地址的映射关系表: 

五. MTU 与 MSS 

 5.1 MTU 

    MTU(Maximum Transmission Unit),是指网络中一个数据包的最大传输单元,也就是一个数据包能够携带的最大数据量。

MTU的作用:

   MTU的大小决定了网络设备在发送数据时是否需要将数据分割成多个较小的数据包。如果数据包超过了MTU的大小,它就需要被分割,这个过程称为分片(fragmentation)分片会增加网络的开销,降低传输效率,还可能因为分片导致数据包丢失。

以太网 MTU:以太网MTU通常指的是在以太网(局域网技术)中,一个网络帧可以携带的最大数据量,以太网帧的负载就是以太网MTU。对于标准的以太网,这个值通常是1500字节。

IP MTU:IP MTU指的是在IP层,IP数据包的大小就是 IP MTU。这通常比以太网MTU要小,因为它需要为IP头部预留空间,可以说以太网MTU相当于IPMTU的一个容器,但IP MTU和以太网MTU通常会是一样的大小。

5.2 MSS 

   MSS(Maximum Segment Size)是指在一个TCP分段(segment)中,除去TCP头部的数据部分的最大大小。 MSS是在TCP连接建立时,两端协商的一个值,它决定了在TCP层每个数据包可以携带的有效数据量。

MSS的作用:

   MSS是为了确保TCP数据包在加上TCP头部后,整体大小不会超过网络的MTU,从而避免IP层对数据包进行分片通常,MSS的值会设置为MTU - IP头部 - TCP头部。通过适当设置MSS,可以优化网络性能,减少数据包分片的几率,提高网络的传输效率。

举个例子:

  • 假设以太网的MTU是1500字节。
  • IP头部通常是20字节,TCP头部通常是20字节。
  • 那么MSS可以是1500-20(IP头部)-20(TCP头部)=1460字节。 

 5.3 TCP分段与IP分片 

   如果发送了应用层发送了一个超大的数据,TCP就会进行分段(TCP Segmentation),分成多个TCP段发送,在分段的时候会考虑到网络层和数据链路层各自的职责。换句话说,TCP分段就是为了后面的IP不用再分片,因此TCP需要确保MSS的值不会过大。

    所以,在TCP三次握手阶段,客户端会和服务器进行协商,在协商MSS之前,两边都会比较自己的MSS缓冲区大小,以及MTU大小。如果客户端通知的MSS是1460,服务端通知的是1440,则会选择较小值1440,这样可以最大程度地避免数据包在中途被分片。 

   但是,数据包依旧可能会遇到链路上的设备接口低于MTU低于1500的路由,此时可能会进行IP分片(IP Segmentation)

   假如,你在上网的时候,数据包经过了一个只支持MTU为576字节的接口,这个时候数据包会被迫分为三份(具体分数看数据包大小),并且在每个数据包加上IP首部。如果原本只有20字节的IPv4首部,那么对于三层来说就额外多了40字节(20+20)。

  也许你会觉得40字节也不会挤压多少带宽,但如果这三个数据包丢了其中一个呢?此时会进行“重传”,但负责重传的是TCP或者4层以上进行,而不是网络层的IP进行重传。IP协议本来就是不可靠传输,因此其中一个IP分片丢失了,需要重传所有分片,也就是重传那一段TCP数据,传输的效率大幅度降低,而且有时候分片更容易导致丢包

   在IPv4协议的首部,有三个区域在分片时候起到重要作用。

  • 标识:标记分片,方便重组这些分片。
  • 片偏移:在重组时需要根据片偏移进行排序。
  • 标志:在分片的时候,其中的MF标志位会用到,MF是more fragment的缩写。当MF标志位为1时,表示后面还有分片。

   这里的问题是,如果路由设备收到中间的一个分片,可以用MF标志位判断出后面是否还有分片,但不知道后面还有多少分片而路由设备的缓冲区是有限的,分片太多,很可能会因为缓冲区的限制,导致部分分片被丢弃。

5.4 避免分片 

   处于三层的路由设备,职责就是更快更高效的传输数据包,分片会增加路由设备的算力和内存的负担。为了避免分片,很多路由设备会有一种叫MSS Climbing的功能。路由设备在看到TCP的SYN或者SYN/ACK包的时候,会把里面MSS的值和链路MTU进行对比。如果MSS值大于MTU值,很明显就会导致分片。因此,就会降低MSS的值以适应链路MTU。


   但是链路上的MTU如何被确定呢?就可以用到 PMTUD(Path MTU Discovery,路径最大传输单元发现)这项技术了。

   IPv4首部标志位里有个DF标志位,DF就是Don't Fragment的意思。

   如果设置了DF标志位,链路上的设备碰到超过MTU的数据包,不会进行分片处理,而是直接丢掉这个包,并且返回消息,告诉发送方需要进行分片,这样发送方就需要降低MTU,然后再次发送,直到发现MTU的最小值。

   但是,在IPv6就不一样了,IPv6只允许发送源对数据包进行切分,不允许链路上的设备进行分片。

   因此,IPv6不需要另外设置。如果数据包太大,链路上的设备直接丢包,并且返回消息告诉对方太大,这样也是可以发现MTU最小值的。


http://www.kler.cn/a/532973.html

相关文章:

  • 【数据结构】栈与队列
  • CSS Display属性完全指南
  • 渗透笔记2
  • 介绍一下Mybatis的Executor执行器
  • GRN前沿:利用DigNet从scRNA-seq数据中生成基于扩散的基因调控网络
  • 【自学笔记】GitHub的重点知识点-持续更新
  • 使用SpringBoot发送邮件|解决了部署时连接超时的bug|网易163|2025
  • Verilog基础(一):基础元素
  • 用C语言实现一个Shell:Tutorial - Write a Shell in C
  • C语言:深入了解指针2(超详细)
  • LLMs瞬间获得视觉与听觉感知,无需专门训练:Meta的创新——在图像、音频和视频任务上实现最优性能。
  • 基于 Java 开发的 MongoDB 企业级应用全解析
  • ZOMI - AISystem AI Infra 分享
  • 【Rust自学】20.1. 最后的项目:单线程Web服务器
  • 基于python热门歌曲采集分析系统
  • 【力扣】53.最大子数组和
  • open-webui启动报错:OSError: [WinError 1314] 客户端没有所需的特权。
  • AI Block Blast Solver:提升游戏体验的智能助手
  • Innodb为何能干掉MyISAM
  • 编程AI深度实战:大模型哪个好? Mistral vs Qwen vs Deepseek vs Llama
  • Leetcode - 周赛434
  • 《深度洞察ICA:人工智能信号处理降维的独特利器》
  • DeepSeek-R1:通过强化学习提升大型语言模型推理能力的探索
  • 猫眼前端开发面试题及参考答案
  • Redis真的是单线程的吗?
  • Spring Bean 的生命周期介绍