【网络编程】之数据链路层

news2025/3/24 12:42:11

【网络编程】之数据链路层

  • 数据链路层
    • 基本介绍
    • 基本功能
    • 常见协议
  • 以太网
    • 什么是以太网
    • 以太网协议帧格式
    • 数据链路层的以太网帧报文如何封装/解封装以及分用
    • 以太网通信原理
      • 传统的以太网与集线器
      • 现代以太网与交换机
      • 碰撞域的概念
    • Mac地址
      • 基本概念
      • 为什么要使用Mac地址而不是使用IP地址进行局域网间的通信
  • MTU
    • 认识MTU
    • 为什么存在MTU限制
    • MTU对上层一些协议的影响
  • ARP协议
    • 基本概念
    • 功能和工作范围、以及封装形式
    • 典型工作流程示例

数据链路层

基本介绍

数据链路层是TCP/IP五层协议和OSI七层协议中的倒数第二层,它主要负责在同一局域网之间的节点间进行可靠的数据帧的传输。

注意:在网络中我们将主机可以称之为节点。

基本功能

  1. 帧同步:确保发送方和接收方对帧边界的识别一致,防止数据丢失或错误。
  2. 差错检测与纠正:通过校验和等机制检测并可能纠正传输过程中的错误,保证数据完整性。
  3. 流量控制:调节数据发送速率以避免拥塞和数据丢失,确保接收方能够处理所有接收到的数据。
  4. 介质访问控制(MAC, Media Access Control):确定哪个设备在网络上有权限发送数据,特别是在共享介质如以太网中尤为重要。
  5. 逻辑链路控制(LLC, Logical Link Control):提供一种方法来标识上层协议,并管理不同协议之间的复用与分用。

常见协议

  • 以太网(Ethernet):最常用的局域网技术之一,支持高速度的数据传输。
  • 点对点协议(PPP, Point-to-Point Protocol):用于在点对点连接上传输多协议数据包的标准方法。
  • 高级数据链路控制(HDLC, High-Level Data Link Control):面向位的数据链路层协议,主要用于同步通信。
  • 帧中继(Frame Relay):高效的广域网协议,适用于企业站点间的连接。
  • 异步传输模式(ATM, Asynchronous Transfer Mode):虽然跨越了数据链路层和物理层,但以其在数据链路层的功能而知名。
  • IEEE 802.11系列:无线局域网协议,为Wi-Fi技术提供了基础。
  • ARP协议/RAP协议:在IPv4网络中将网络层(第三层)使用的IP地址转换为数据链路层使用的MAC地址。

我们重点介绍以太网协议。

以太网

什么是以太网

以太网是局域网技术的一种,常见的局域网技术还有令牌环网技术、WIFI技术(无线局域网)。以太网是最流行的局域网技术,使用物理电缆(如双绞线或光纤)连接网络设备。它支持从10Mbps100Gbps及以上的传输速率。

以太网协议帧格式

不同的局域网需要使用不同的协议,比如以太网使用以太网协议,它是数据链路层的一种:

image-20250216155836728

  • 目的地址:局域网中通信使用MAC地址,所以以太网协议又可以叫做MAC帧协议,这个6字节的字段对应通信主机的MAC帧地址。
  • 源地址:当前主机的MAC地址。
  • 类型:在以太网II帧格式中,该字段被解释为“类型”,用来标识封装在帧内的上层协议。常见的类型值包括但不限于以下几种:
    • 0x0800:表示网络层协议是IPv4。
    • 0x86DD:表示网络层协议是IPv6。
    • 0x0806:表示这是ARP(Address Resolution Protocol)报文。
    • 0x8035:RARP(Reverse Address Resolution Protocol)报文。
    • 0x8100:VLAN标签(IEEE 802.1Q),实际上这是一个扩展,它后面跟着一个额外的4字节VLAN标签,然后再跟类型字段。
    • 0x88CC:LLDP(Link Layer Discovery Protocol),用于设备发现。

对于上一层协议是是IPv4:

image-20250216161242810

如果数据部分是ARP报文:

image-20250216161926377

  • PAD:是填充字节,数据部分最少要有46字节,这些填充字节通常没有实际意义,仅用于物理层的要求,保证帧能够正确地被接收设备识别和处理。

如果数据部分是RARP报文:

image-20250216162205272

数据链路层的以太网帧报文如何封装/解封装以及分用

解封装:因为帧报文是固定报头,所以很轻松就可以将报头和有效载荷进行分离。封装将上层的有效载荷添加上报头和CRC校验码即可,CRC校验码有特定的算法,感兴趣的自行了解,是错误检测中的常见的算法。

分用:分用的过程就是如何提交给上层的问题,根据2字节的类型字段来分用,如果是字段的值是0x0800那就是IPv4报文,交给上层的IPv4协议。

以太网通信原理

传统的以太网与集线器

集线器(Hub):是一种物理设备,工作在物理层,它可以用来将局域网中要通信的计算机组织在一起,它工作在物理层,只能机械的广播报文到所有它连接的端口,它并不理解或更改传输的数据帧。

image-20250216195249374

由集线器组织起来的局域网:

image-20250216195804609

由于传统的集线器没有学习mac地址的功能,它不知道目的mac地址对应哪个端口,所以它只能将mac帧报文转发给所有端口,所以每一次发送数据,每个端口都要传输数据,就导致了都被占用,所以有主机在局域网中发送数据时就不能有其它主机发送数据,否则会导致冲突。

上述组网图也可以表示为:

image-20250216200300728

现代以太网与交换机

上面那种组网的方式有明显的缺陷,就是每一次局域网中的数据传输都要占用整个通信线路,冲突的概率很大,下面我们来简单学习一下交换机这种网络设备。

交换机(Switch):和集线器长的很像,也可以组网,但不同于集线器的是,交换机中可以维护一个表保存某个端口对应的设备的mac地址,也就是它可以学习mac地址,交换机工作在数据链路层。通过报文的目标mac地址,它的交换表中如何存储了该mac地址对应的端口信息,可以直接将其转发给该端口,而不需要将其发送给所有端口。

image-20250216202321055

所以交换机工作在数据链路层(第二层)的主要原因是其可以识别和处理数据帧中的信息,如MAC地址。它根据MAC地址来决定将数据转发到哪个端口,如果交换表中没有保存该mac地址对应的端口,它就会将其发送给剩下的端口。

并且每一次发送数据帧时,如果源主机的mac地址如果交换机的表中没有保存其相关信息或者mac地址发生变化(该端口接入交换机的设备更换了)的话,它也会更新交换表中的信息。

现代交换机网络示例

image-20250216202646490

  • 此时主机A->主机C,主机B->主机D发送数据就是并行的,如果mac表中保存了相关的信息的话,不会导致冲突,因为交换机可以识别帧头部信息做到根据mac地址定向端口转发数据帧报文
  • 每个端口支持全双工通信(也有些半双工模式),数据可以同时进行收发,而集线器只支持半双工通信。全双工模式下,每个端口都有独立的冲突域(只要该端口不同时发数据就行),整个网络的碰撞域其实不复存在,完全禁用冲突检测(CSMA/CD的消亡)。

为了保证向后兼容,协议层保留兼容性支持(半双工),但新部署网络必须强制配置全双工,因为半双工的网络性能实在是太慢了。

碰撞域的概念

碰撞域(collision domain)是以太网通信的核心概念,它定义了网络中可能发生数据冲突的物理范围。

共享同一物理信道的设备,在域中相同时刻,只能有一组设备发送数据成功,如果有多组设备同时发送数据,则会导致这些设备数据都发送失败。

传统的集线器所组的局域网,碰撞域几乎覆盖了整个通信信道,但由于交换机的出现,特别是全双工通信的支持,将大的独立的碰撞域分割为多个小的独立碰撞域,数据冲突几乎不存在。

特性传统网络现代网络
典型设备集线器(Hub)交换机(Switch)
冲突处理机制CSMA/CD(载波监听多路访问/冲突检测)无冲突
带宽共享方式竞争型(竞争发送数据的机会)专用型(根据mac地址定向转发数据帧)
最大理论设备数<= 30(100M网络)无限制

Mac地址

基本概念

Mac(Media Access Control Address)地址是网络设备的物理地址,又称媒体访问控制地址,用于在局域网内进行设备间的通信,每一个网络接口都有一个全球唯一的MAC地址,这使得数据帧可以从一个设备准确的发送给局域网中的另外一个设备。Mac地址在设备生产的时候就已经固定了,不可改变

Windows中可以通过指令getmac获得本主机所有网络接口对应的mac地址:

image-20250216164220512

如果想获得与mac地址相关的其它网络接口配置信息,可以使用指令ipconfig /all

image-20250216164417508

为什么要使用Mac地址而不是使用IP地址进行局域网间的通信

这我相信是很多人的疑惑点之一,明明IPv4IPv6中的IP地址就已经可以标识网络中的唯一主机,为什么还要多次一举搞一个mac地址出来呢,理由如下:

  1. 网络分层的必然要求

    • 数据链路层与网络层的分工

      • mac地址:数据链路层的标识,用于同一物理网络的直接通信,如交换机的转发。

      • ip地址:网络层的标识,用于跨网络的路由寻址(如路由器决策路径需要靠IP地址)。

        image-20250216170636497

    • 硬件与逻辑的解耦

      • MAC地址固化在网卡硬件中,如E2-0A-F6-97-75-73,与物理设备绑定。
      • 但是IP地址可动态分配(DHCP算法), 仅仅作为逻辑标识,用于网络拓扑。
  2. 局域网通信的关键场景

    • 当设备刚刚接入某个局域网中,肯定是还没有IP地址的,那DHCP服务器想给它分配IP地址,只能通过先通过mac地址来与其通信,大致可以分为以下几个步骤:

      • DHCP服务器发现阶段:

        image-20250216172551649

        • DHCP服务器收到这个广播帧,会给客户端(也就是新设备)返回一个offer报文,不用担心是否会有其它设备发送报文给新设备,DHCP协议offer报文是有特定格式的,其它设备响应的错误报文会直接被丢弃,如果有多个DHCP服务器响应,新设备只会选择一个最优的(考虑网络等情况)。这个offer报文中有ip地址、子网掩码、网关地址等信息。

          image-20250216175924449

        • Request阶段:当DHCP服务器给新设备返回一个ip地址后,它并不会马上开始使用这个ip地址,而是先给所有DHCP服务器发送一个报文,告诉它们启用了哪个ip地址,防止局域网中有多DHCP服务器导致ip地址冲突问题。发送广播帧即可。

          image-20250216175935908

        • 响应阶段:最后新设备选择的DHCP服务器将会给它返回一个ACK报文,表示地址分配是有效的。其它设备在收到Request报文后,会回收租出去的ip地址,如果没有收到Request报文,ip地址也会自动过期回收:

          image-20250216180713490

    • 交换机工作原理:交换机通过存储不同设备的mac地址,决定应该将数据帧转发给哪个端口,而非使用ip地址。

  3. ip地址的局限性

    • ip地址可能因为DHCP租约过期,手动配置错误等经常发生变化,所以不适合稳定的通信。
    • ip地址属于网络层,需要网络层协议的支持,而某些底层工业设备可能仅支持mac通信。

所以mac地址和ip地址是各有各的优点和功能,两者都不可或缺。

MTU

认识MTU

MTU(Maximum Transmission Unit),即最大传输单元,是数据链路层对有效载荷也就是数据帧的数据部分的最大长度的限制。每个类型的网络对都有特定的MTU限制:

image-20250217115956976

为什么存在MTU限制

  1. 数据太大,重传的成本高。
  2. 接收设备(路由器、主机、交换机等)需要为接收到的数据帧分配缓冲区,如果帧过大导致缓冲区溢出,就会导致数据丢失。
  3. 数据链路层会对数据帧做数据校验(CRC算法),较小的帧长计算量也较小。

MTU对上层一些协议的影响

  1. TCP协议(传输层)

    • TCP的一个报文不能无限大,因为TCP是传输层,也受限于数据链路层的MTU,双方在三次握手时会告知对方自己的MSS(Max Segment Size)。

    • 在理想的情况下MSS = MTU-IPheadersize-TCPheadersize。这是刚好网络层不会IP分片的TCP数据长度,如果没有其它额外选项的话。所以MSS和MTU有很大的关系。

      image-20250217121059313

  2. IP协议(网络层):

    • 由于数据链路层MTU的限制,对于较大的IP报文,网络层会将其进行IP分片(分成几个小的IP报文)。

    • IP分片的触发条件:IP包的数据长度 > MTU -20Byte(IP头的长度)。

    • 假设IP包的数据长度为3000Byte,它就会被分成下面形式的IP包(假设没有选项):

      image-20250217121930123

  3. UDP协议(传输层):如果UDP协议的数据部分超过:

    MTU(1500)-8Byte(UDPheader)-20Byte(IPheader)=1472字节
    
    • 那么在网络层,IP报文就会分片,这些多个IP数据报如果有一个丢失,都会导致接收主机网络层重组失败,则UDP报文的丢包率就大大提高。

ARP协议

基本概念

ARP协议的主要功能是通过主机的ip地址获得它的mac地址,因为局域网中通信要使用mac地址。

关于ARP协议工作在TCP/IP协议哪一层,一直备受争议,因为它处理的是ip地址,所以有人认为它工作在网络层,但是ARP并不使用ip协议,而是直接封装在数据帧中,所以我们可以认为它是数据链路层和网络层之间的一个协议,但更偏向于数据链路层。

在《计算机网络:自顶向下方法》中,ARP通常被放在链路层讨论,因为它不涉及路由,只在本地网络工作,帮助将IP地址解析为MAC地址,而MAC地址是链路层的地址。

功能和工作范围、以及封装形式

ARP协议的功能刚刚以及介绍,将IP地址解析为mac地址

它直接封装在数据帧中,封装形式如下:

image-20250217112054568

PAD是填充字节,达到最小帧长64字节的要求,最小帧长是早期网络技术限制和冲突检测机制的共同结果,现在随着全双工模式的普及,最小帧长已经失去意义,但是半双工模式仍然保留最小帧长的要求。

工作范围ARP仅在本局域网中生效,不跨越路由器,跨越路由器需要依赖其它协议(如代理ARP)。

典型工作流程示例

image-20250217113130761

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2300205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

EasyExcel 复杂填充

EasyExcel ​Excel表格中用{}或者{.} 来表示包裹要填充的变量&#xff0c;如果单元格文本中本来就有{、}左右大括号&#xff0c;需要在括号前面使用斜杠转义\{ 、\}。 ​代码中被填充数据的实体对象的成员变量名或被填充map集合的key需要和Excel中被{}包裹的变量名称一致。 …

通过VSCode直接连接使用 GPT的编程助手

GPT的编程助手在VSC上可以直接使用 选择相应的版本都可以正常使用。每个月可以使用40条&#xff0c;超过限制要付费。 如下图对应的4o和claude3.5等模型都可以使用。VSC直接连接即可。 配置步骤如下&#xff1a; 安装VSCODE 直接&#xff0c;官网下载就行 https://code.vis…

【算法与数据结构】并查集详解+题目

目录 一&#xff0c;什么是并查集 二&#xff0c;并查集的结构 三&#xff0c;并查集的代码实现 1&#xff0c;并查集的大致结构和初始化 2&#xff0c;find操作 3&#xff0c;Union操作 4&#xff0c;优化 小结&#xff1a; 四&#xff0c;并查集的应用场景 省份…

Java 集合数据处理技巧:使用 Stream API 实现多种操作

​ 在 Java 开发中&#xff0c;对集合数据进行处理是非常常见的需求&#xff0c;例如去重、排序、分组、求和等。Java 8 引入的 Stream API 为我们提供了一种简洁、高效的方式来处理集合数据。本文将详细介绍如何使用 Stream API 实现多种集合数据处理操作&#xff0c;并给出相…

OSI 参考模型和 TCP/IP 参考模型

数据通信是很复杂的&#xff0c;很难在一个协议中完成所有功能。因此在制定协议时经常采用的思路是将复杂的数据通信功能由若干协议分别完成&#xff0c;然后将这些协议按照一定的方式组织起来。最典型的是采用分层的方式来组织协议&#xff0c;每一层都有一套清晰明确的功能和…

SD NAND 的 SDIO在STM32上的应用详解(上篇)

目录 上篇&#xff1a; 一.SDIO简介 二.SD卡简介/内部结构 1.SD卡/SD NAND引脚 2.SD卡寄存器 3.FLASH存储器 三.SDIO总线拓扑 中篇&#xff1a; 四.SDIO功能框图(重点) 1.SDIO适配器 2.控制单元 3.命令通道(重点) 4.数…

基于图像处理的裂缝检测与特征提取

一、引言 裂缝检测是基础设施监测中至关重要的一项任务,尤其是在土木工程和建筑工程领域。随着自动化技术的发展,传统的人工巡检方法逐渐被基于图像分析的自动化检测系统所取代。通过计算机视觉和图像处理技术,能够高效、精确地提取裂缝的几何特征,如长度、宽度、方向、面…

执行pnpm run dev报错:node:events:491 throw er; // Unhandled ‘error‘ event的解决方案

vite搭建的vue项目&#xff0c;使用pnpm包管理工具&#xff0c;执行pnpm run dev&#xff0c;报如下错误&#xff1a; 报错原因&#xff1a; pnpm依赖安装不完整&#xff0c;缺少esbuild.exe文件&#xff0c;导致无法执行启动命令。 解决方案&#xff1a; 根据错误提示中提到…

「软件设计模式」建造者模式(Builder)

深入解析建造者模式&#xff1a;用C打造灵活对象构建流水线 引言&#xff1a;当对象构建遇上排列组合 在开发复杂业务系统时&#xff0c;你是否经常面对这样的类&#xff1a;它有20个成员变量&#xff0c;其中5个是必填项&#xff0c;15个是可选项。当用户需要创建豪华套餐A&…

uniapp 安卓10+ 选择并上传文件

plus.io.chooseFile({title: 选择文件,filetypes: [mp3], // 允许的文件类型multiple: false, // 是否允许多选}, (res) > {console.log(虚拟路径666&#xff1a;, res);var arr[{name: files,uri: res.files[0],}]let obj {"tableName": "mingmen_daily_mi…

【第1章:深度学习概览——1.6 深度学习框架简介与选择建议】

嘿,各位老铁们,今天咱们来一场深度学习框架的深度探索之旅。在这个充满无限可能的深度学习时代,深度学习框架就像是连接理论与实践的桥梁,帮助我们从算法设计走向实际应用。随着技术的飞速发展,深度学习框架的选择变得越来越多样化,每一种框架都有其独特的优势和适用场景…

网页制作02-html,css,javascript初认识のhtml的文字与段落标记

用一首李白的将进酒,对文字与段落标记进行一个简单的介绍演示&#xff1a; 目录 一、标题字 1、标题字标记h 2、标题字对其属性align 二、文本基本标记 1、字体属性face 2、字号属性size 3、颜色属性 Color 三、文本格式化标记 1、粗体标记 b &#xff0c;strong 2、…

一.数据治理理论架构

1、数据治理核心思想&#xff1a; 数据治理理论架构图描绘了一个由顶层设计、管控机制、核心领域和管理系统四个主要部分组成的数据治理框架。它旨在通过系统化的方法&#xff0c;解决数据治理机制缺失引发的业务和技术问题&#xff0c;并最终提升企业的数据管理水平。 数据治…

PHP基础部分

但凡是和输入、写入相关的一定要预防别人植入恶意代码! HTML部分 语句格式 <br> <hr> 分割符 <p>插入一行 按住shift 输入! 然后按回车可快速输入html代码(VsCode需要先安装live server插件) html:<h1>标题 数字越大越往后</h1> <p…

人工智能 - 主动视觉可能就是你所需要的:在双臂机器人操作中探索主动视觉

AV-ALOHA 系统使用用于 AV 的 VR 耳机实现直观的数据收集&#xff0c;并且 用于作的 VR 控制器或引线臂。这有助于捕捉全身和头部 远程作我们的真实和模拟系统的运动&#xff0c;记录来自 6 个的视频 不同的摄像头&#xff0c;并为我们的 AV 仿制学习策略提供训练数据。 加州大…

DeepSeek 助力 Vue 开发:打造丝滑的日期选择器(Date Picker),未使用第三方插件

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

Kafka偏移量管理全攻略:从基础概念到高级操作实战

#作者&#xff1a;猎人 文章目录 前言&#xff1a;概念剖析kafka的两种位移消费位移消息的位移位移的提交自动提交手动提交 1、使用--to-earliest重置消费组消费指定topic进度2、使用--to-offset重置消费offset3、使用--to-datetime策略指定时间重置offset4、使用--to-current…

一周学会Flask3 Python Web开发-Debug模式开启

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 默认情况&#xff0c;项目开发是普通模式&#xff0c;也就是你修改了代码&#xff0c;必须重启项目&#xff0c;新代码才生效&…

java练习(28)

ps&#xff1a;练习来自力扣 给定一个二叉树&#xff0c;判断它是否是平衡二叉树 // 定义二叉树节点类 class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode left, TreeNode right) {this.va…

Web安全|渗透测试|网络安全

基础入门(P1-P5) p1概念名词 1.1域名 什么是域名&#xff1f; 域名&#xff1a;是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地理位置&#xff09;。 什么是二级域名多级域名&am…