【Linux网络与网络编程】11.数据链路层mac帧协议ARP协议

前面在介绍网络层时我们提出来过一个问题:主机是怎么把数据交给路由器的?那里我们说这是由数据链路层来做的。

网络上的报文在物理结构上是以mac帧的形式流动的,但在逻辑上是以IP流动的,IP的流动是需要mac帧支持的。

数据链路层解决的是相邻节点间的通信问题。

1. 以太网

1.1 认识以太网

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

1.2 以太网的帧格式

报头各部分的功能:

源地址和目的地址:指网卡的硬件地址(mac 地址)

类型:该字段有三种值,分别对应 IP、ARP、RARP

CRC:校验码

关于mac地址

mac 地址用来识别数据链路层中相连的节点,它的长度为 48 位( 6 个字节),一般用 16 进制数字加上冒号的形式来表示(例如: 08:00:27:03:fb:19)。它在网卡出厂时就确定了,不能修改。

mac 地址通常是唯一的(虚拟机中的 mac 地址不是真实的 mac 地址,可能会冲突;也有些网卡支持用户配置 mac 地址)。

2. MTU

2.1 认识MTU

MTU 相当于发快递时对包裹尺寸的限制。这个限制是不同的数据链路对应的物理层产生的限制。以太网帧中的数据长度规定最小 46 字节,最大 1500 字节,若 ARP 数据包的长度不够 46 字节就要在后面补填充位。最大值 1500 称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。如果一个数据包从以太网路由到拨号链路上,数据包长度大于拨号链路的 MTU 则需要对数据包进行分片。

我们可以通过ifconfig 命令查看 ip 地址、mac 地址和 MTU。

2.2 MTU对IP协议的影响

由于数据链路层 MTU 的限制,这使得对于较大的 IP 数据包要进行分包。

2.3 MTU对UDP协议的影响

一旦 UDP 携带的数据超过 1472(1500 - 20(IP 首部) - 8(UDP 首部)) 那么就会在网络层分成多个 IP 数据报。这多个 IP 数据报有任意一个丢失,都会引起接收端网络层重组失败。那么这就意味着:如果 UDP 数据报在网络层被分片,整个数据被丢失的概率就大大增加了。

2.4 MTU对TCP协议的影响

TCP 的一个数据报也不能无限大,还是受制于 MTU。TCP 的单个数据报的最大消息长度为 1460(1500 - 20(IP首部) - 20(TCP首部)),称为 MSS(Max Segment Size)。 TCP 在建立连接的过程中,通信双方会进行 MSS 协商。最理想的情况下就是MSS 的值正好是在 IP 不会被分片处理的最大长度(这个长度仍然是受制于数据链路层的 MTU)。

双方在发送 SYN 的时候会在 TCP 头部写入自己能支持的 MSS 值,然后双方得知对方的 MSS 值之后,选择较小的作为最终 MSS。MSS 的值就是在 TCP 首部的 40 字节变长选项中(kind = 2)。

MSS和MTU的关系:

3. 局域网通信原理和交换机

3.1 局域网通信原理示意图

局域网中,任何时刻都只允许一台机器向网络中发送数据,如果有多台同时发送的话,会发生数据干扰,我们称之为数据碰撞。所有发送数据的主机要进行碰撞检测和碰撞避免

如果碰撞了,涉及的主机该怎么办呢?

两台主机都会休眠一下,然后将数据重发(数据链路层也有重发机制)。

在没有交换机的情况下,一个局域网就是一个碰撞域

从系统的角度来看,局域网就是一个临界资源,碰撞检测和碰撞避免就是保护临界资源,使得任何时刻都只有一台主机发送消息的策略和机制。

所以在一个局域网(碰撞域)中主机自然是越少越好,如果主机过多就要引入交换机了。

3.2 交换机

交换机的核心问题就是通过对局域网中的mac帧进行分析,从而划分碰撞域。

4. APR协议

曾经在介绍网络层时说到过,数据转发的时候用到的是IP地址,但是在局域网通信时我们使用的可是mac地址啊,所以这也就注定需要在局域网中提供一种将IP地址转化为mac地址的能力——ARP协议。

4.1 基本原理

源主机发出 ARP 请求,询问 “IP 地址是 192.168.0.1 的主机的硬件地址是多少”,并将这个请求广播到本地网段(以太网帧首部的硬件地址填 FF:FF:FF:FF:FF:FF 表示广播)。目的主机接收到广播的 ARP 请求后若发现其中的 IP 地址与本机相符,则将自己的硬件地址填写在应答包中,并发送 ARP 应答数据包给源主机。

总结来说就是:先广播,后单发。

每台主机都维护一个 ARP 缓存表,可以用 arp -a 命令查看。缓存表中的表项有过期时间(一般为 20 分钟),如果 20 分钟内没有再次使用某个表项则该表项失效,下次还要发 ARP 请求来获得目的主机的硬件地址。

C:\Users\caryo>arp -a接口: 172.18.154.182 --- 0xeInternet 地址         物理地址              类型169.254.169.254       cc-d8-1f-28-db-2f     动态172.18.145.119        ac-19-8e-6c-c5-8c     动态172.18.148.251        ac-50-de-88-fa-45     动态172.18.150.140        64-d6-9a-9a-37-1f     动态172.18.152.44         c4-d0-e3-64-de-35     动态

4.2 ARP协议报头

可以看出ARP协议是 mac 帧协议的上层协议,但是也属于数据链路层。

报头各部分的功能:

• 硬件类型:指链路层网络类型,1 为以太网

协议类型:指要转换的地址类型,0x0800 为 IP 地址

硬件地址长度:对于以太网地址为 6 字节

协议地址长度:对于和 IP 地址为 4 字节

op 字段:为 1 表示 ARP 请求,为 2 表示 ARP 应答

4.3 ARP的具体过程

如果路由器知道IP对应的MAC地址,那就可以直接发送,如果不知道,就要使用ARP协议获取目的MAC。

主机会通过广播发送 ARP 请求,这个包中包含了想要知道的 MAC 地址的主机 IP 地址。目的MAC地址为全F(FF:FF:FF:FF:FF:FF)。局域网内的所有主机都会收到这个ARP请求,网卡识别目的MAC地址为全F,广播数据,需要向上交付,再根据帧类型识别是ARP请求/响应。所以向上交付给ARP协议。ARP协议 先看op字段,如果为ARP请求,再看目的IP地址,除目的主机外,其他主机发现不是给自己的,就在ARP层丢弃报文。如果 ARP 请求包中的目标 IP 地址与自己的 IP 地址一致,那么这个设备就将自己的 MAC 地址塞入 ARP 响应包返回给主机。

 

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

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

相关文章

多模态思维链AI医疗编程:从计算可持续性到开放域推理的系统性解决方案

多模态思维链AI医疗编程:从计算可持续性到开放域推理的系统性解决方案 医疗AI领域的多模态思维链技术正在重塑临床决策支持、医学影像分析和医疗流程优化的范式。本指南从计算可持续性、错误传播控制、伦理安全防护和通用性扩展四大维度,系统解析医疗大模型落地落地的关键要…

代理模式深度解析

目录 一 静态代理 1.1 优点 1.2 缺点 1.3 适用场景 二 JDK动态代理 1 JDK动态代理的工作原理 1.1 创建代理类 1.2 加载代理类 1.3 实现方法调用 2. Proxy.newProxyInstance() 的核心工作流程 方法签名 工作步骤 3. 代理类的生成与加载 3.1 代理类生成的关键方法 …

Spring Cache与Redis集成原理

一、核心架构图解 #mermaid-svg-aiWGQLhmWx7kOfLz {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-icon{fill:#552222;}#mermaid-svg-aiWGQLhmWx7kOfLz .error-text{fill:#552222;stroke:#5…

编程技能:调试02,设置断点与删除断点

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:编程技能:调试01,调试介绍 回到目录 下…

flink写doris时的优化

1.概念 doris并不擅长高频、小量数据的导入; 因为doris每一次数据导入都会在be节点上生成数据文件;如果高频导入小量数据,就会在存储层产生大量的小文件(必然会影响到后续的查询效率,也会对系统产生更多的compaction…

ElementNotInteractableException原因及解决办法

在自动化测试中,ElementNotInteractableException是一个常见的异常,它通常发生在尝试与网页上的某个元素进行交互(例如点击、输入等操作)时,但由于该元素当前不可交互。这可能由多种原因引起,以下是一些常见的原因及其解决方法: 元素未完全加载 如果尝试与页面上的元素交…

如何从 GitHub 镜像仓库到极狐GitLab?

最近 GitHub 封禁中国用户的事情闹得沸沸扬扬,虽然官方发布的报道说中国用户被限制登录是因为配置错误导致,已经撤回了更新,中国用户已经可以正常使用。但是这就像横在国内开发者和企业头上的“达摩克利斯之剑”。为了避免 GitHub 不可用而带来的影响,国内开发者和企业可以…

服务器安装nacos

1.下载依赖 docker pull nacos/nacos-server:v2.4.3安装 docker run -d --name nacos-server -p 8848:8848 -e MODEstandalone nacos/nacos-server:v2.4.3把nacos中的data 文件和conf 文件copy到自己服务的文件夹 docker cp nacos-server:/home/nacos/data /home/admin1/…

Matter协议暗战:苹果、谷歌、亚马逊的智能家居霸权争夺

原文地址:Matter协议暗战:苹果、谷歌、亚马逊的智能家居霸权争夺 一、Matter 协议:巨头联手打造的 “智能家居联合国” 1.1 从 CHIP 到 Matter:标准统一的十年长跑 智能家居发展多年,却始终被 “孤岛效应” 困扰。各…

软件设计师2009-2022历年真题与答案解析(附pdf下载)

软考在即,现在给大家分享一下软件设计师2009-2022真题与答案解析 pdf全套,文末提供大家免费下载,大家都知道在软考备考过程中,拥有一套全面且实用的考试资料对于考生来说至关重要。目录如下: 历年真题及详解2004-2019 …

基于EasyX库开发的球球大作战游戏

目录 球球大作战 一、开发环境 二、流程图预览 三、代码逻辑 1、初始化时间 2、设置开始界面大小 3、设置开始界面 4、让玩家选择速度 5、设置玩家小球、人机小球、食物的属性 6、一次性把图绘制到界面里 7、进入死循环 8、移动玩家小球 9、移动人机 10、食物刷新…

aslist和list的区别

‌Arrays.asList和List的主要区别在于它们的固定长度和不可变性、与原始数组的关系、性能以及使用场景。 一、固定长度和不可变性 ‌Arrays.asList‌:通过Arrays.asList方法创建的List是一个固定长度的List,其长度与原始数组相同。这意味着你不能通过添…

大模型预标注和自动化标注在OCR标注场景的应用

OCR,即光学字符识别,简单来说就是利用光学设备去捕获图像并识别文字,最终将图片中的文字转换为可编辑和可搜索的文本。在数字化时代,OCR(光学字符识别)技术作为处理图像中文字信息的关键手段,其…

stm32工程,拷贝到另一台电脑编译,错误提示头文件找不到cannot open source input file “core_cm4.h”

提示 cannot open source input file “core_cm4.h” ,找不到 [ core_cm4.h ] 这个头文件 . 于是我在原电脑工程文件里找也没有找到这个头文件 接下来查看原电脑keil的头文件引入配置,发现只引入了工程文件下的头文件, 那么core_cm4.h到底哪里来的? (到现在我也不清楚怎…

STM32 模块化开发指南 · 第 2 篇 如何编写高复用的外设驱动模块(以 UART 为例)

本文是《STM32 模块化开发实战指南》的第 2 篇,聚焦于“串口驱动模块的设计与封装”。我们将从一个最基础的裸机 UART 初始化开始,逐步实现:中断支持、环形缓冲收发、模块接口抽象与测试策略,构建一个可移植、可扩展、可复用的 UART 驱动模块。 一、模块化 UART 的设计目标…

【NLP 59、大模型应用 —— 字节对编码 bpe 算法】

目录 一、词表的构造问题 二、bpe(byte pair encoding) 压缩算法 算法步骤 示例: 步骤 1:初始化符号表和频率统计 步骤 2:统计相邻符号对的频率 步骤 3:合并最高频的符号对 步骤 4:重复合并直至终止条件 三、bpe在NLP中…

TMS320F28P550SJ9学习笔记15:Lin通信SCI模式结构体寄存器

今日初步认识与配置使用Lin通信SCI模式,用结构体寄存器的方式编程 文章提供完整工程下载、测试效果图 我的单片机平台是这个: LIN通信引脚: LIN通信PIE中断: 这个 PIE Vector Table 表在手册111页: 这是提到LINa的PI…

linux-设置每次ssh登录服务器的时候提醒多久需要修改密码

在 Linux 系统中,你可以通过设置 motd(Message of the Day)或 sshd 配置来在用户通过 SSH 登录时提醒他们密码即将过期。以下是具体步骤: 方法 1: 使用 motd 文件 motd 文件在用户登录时显示,你可以通过脚本动态生成内容,提醒用户密码过期时间。 编辑 /etc/motd 文件:…

matlab求和∑函数方程编程?

matlab求和∑函数方程编程? 一 题目:求下列函数方程式的和 二:代码如下: >> sum_result 0; % 初始化求和变量 for x 1:10 % 设…

electron桌面端开发-打开指定软件和文件

electron桌面端开发 现在越来越多的软件开发已经趋向于简单化,桌面端开发已经不在依赖之前的java、c等主流技术,目前基于node的开发越来越广泛。功能点也越来越多元化。 文章目录 electron桌面端开发前言一、打开文件的方式?二、exec使用步骤…