Linux--数据链路层--ARP协议--0319-21

2023-10-27

目录

1. 认识以太网

1.1 以太网帧格式

1.2 基于以太网帧简单模拟局域网通信

问题一:如果有多台主机都在发送数据呢?

问题二:发送方知不知道自己的数据被影响了呢?

1.3 MTU

1.3.1 MTU对IP协议的影响

1.3.2 MTU对UDP协议的影响

1.3.3 MTU对于TCP协议的影响

1.3.4 查看硬件地址和MTU

2. 抛出问题

在网络转发过程中,MAC报头会发生变化吗?

 数据要想发送给目标主机需要MAC地址,MAC地址如何得知?

 3.ARP协议

3.1 ARP协议的工作流程

3.1.1 具象工作流程

3.1.2 认识ARP协议

3.1.3 模拟一次真实的工作流程

3.2 查看IP地址和MAC地址关系映射的缓存表

 3.3 简单理解什么是ARP欺骗


1. 认识以太网

以太网不是一种具体的网络,而是一种技术标准。

拿介质举个例子,声音的传播需要介质,这些介质可以是气体、液体、固体。那以太网就是一种在链路层传输的介质!

1.1 以太网帧格式

 先回答两个问题:

以太网如何解包和分装?

解包:以太网的报头是定长的,6+6+2。而且CRC(校验和)也是固定长度。解包时只需要将这两个长度减去,得到的就是数据。(注:这里的数据可是整个IP报文)

如何交付?
两个字节的类型字段,决定了交付给谁的问题。


目的地址:目的主机的MAC地址。

源地址:发送方主机的MAC地址

类型:如果为0800,则代表有效载荷放的是IP报文,进而向上交付时就交付给了IP层。

如果为0806 或者 0805 会交给ARP层。这个我们后面一些再讲。

MAC地址: MAC地址是标识主机唯一性的方案。

1.2 基于以太网帧简单模拟局域网通信

假设主机1,要向主机4发送消息,那他的报文就应该如图所示进行填写。这条消息相当于是广播出去的,即每个主机都会得到这个报文,但是经过报文的解包对比发现目的地址并不是自己,于是就会将报文丢弃。

就像在课堂上老师指明一个同学回答问题。

问题一:如果有多台主机都在发送数据呢?

数据间会发生碰撞问题,从而导致数据无法使用。

在更底层,这些数据源于光电信号,如果同时有多个主机在发送数据,那全部的数据势必会收到干扰。结果就是这些报文数据都不能正常使用。

问题二:发送方知不知道自己的数据被影响了呢?

知道。自己发出的消息,自己也会接收到。

就像可以自己听见自己说话一样。

如果发现了自己的数据不对(CRC验证不通过了),那么发送方就会根据“避免碰撞”的算法,休息随机时间,然后重新发送。


1.3 MTU

首先回答两个问题,

局域网中主机越多越好呢还是越少越好?

越少越好,可以减少数据碰撞。但是事实情况不能要求连接局域网的主机变少,所以就有了交换机

交换机的作用就相当于是把局域网在划分成两块区域。如果通信的双方在划分的区域的同一侧,那么交换机就不会再将这个报文发送到区域的另一侧。从而减少数据碰撞。

局域网数据发送时,数据越长越好还是越短越好?

越短越好,越短发的越快。数据碰撞的可能性就小。


MTU 相当于发快递时对包裹尺寸的限制,这个限制是不同的数据链路层对应的物理层产生的限制。

以太网帧中数据长度规定最小46字节,最大1500字节。ARP数据包的长度不够46字节,要在后面补填充位。

最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不同的MTU。不同的数据链路层标准的MTU是不同的。

1.3.1 MTU对IP协议的影响

超过1500字节会发生分片,具体已经在上篇博文中详细提及了。

Linux--IP协议--0316-19_Gosolo!的博客-CSDN博客

1.3.2 MTU对UDP协议的影响

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

1.3.3 MTU对于TCP协议的影响

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

MSS的值就是在TCP首部的40字节变长选项中(kind=2);

1.3.4 查看硬件地址和MTU

bash: ifconfig

2. 抛出问题

在网络转发过程中,MAC报头会发生变化吗?

答案是,会变。这里涉及到路由器的一个功能。

 数据要想发送给目标主机需要MAC地址,MAC地址如何得知?

 ARP协议!

 3.ARP协议

首先,但发送端想要发送数据时,它会知道接收端的IP,也就得知了目标网络+目标主机。但在数据链路层,我们的报头文件中有目的MAC地址这一字段,如何通过目的IP得知目的MAC地址呢?

ARP协议建立了主机IP地址和MAC地址的映射关系。ARP协议是一个局域网协议。

ARP协议和以太网帧协议的关系

二者同在数据链路层。但属于上下层关系,也就是说以太网帧协议的上层协议,要么是所以也就解释了以太网帧报头的类型字段!

3.1 ARP协议的工作流程

3.1.1 具象工作流程

假设在局域网中有多台主机,A、B、C、D。其中主机A要给主机D发送消息。

A会在局域网中以“广播”的形式,发送一个报文“IP地址是IP_D的主机,请告诉我你的MAC地址”。局域网中的所有主机都会拿着这条报文跟自己做对比,发现叫的不是自己,于是丢弃报文不管。

当主机D接收到这份报文后,确认叫的就是自己,于是会将自己的MAC地址填入报文,然后定向的发给主机A,因为此时主机D已经通过A发送的报文得知了A的MAC地址。

结论:

任何主机可能之前向目标主机发起过ARP请求,注定了未来会收到对应的ARP应答。

任何一台主机,也可能被别人发起ARP请求。

在局域网中,任何一台受到ARP的时候,可能是一个应答,也可能是一个请求。

3.1.2 认识ARP协议

 相关字段:

硬件类型

指链路层网络类型

1为以太网。

协议类型

指要转换的地址类型

0x0800为IP地址。

硬件地址长度

对于以太网为6,

表示6字节。

协议地址长度

对IP地址为4,

表示4字节。

发送端以太网地址

发送端IP地址

目的IP地址

都是已知的,

直接填写即可

目的以太网地址

一般全部设为1,表示广播。

有目的主机的MAC地址,

就直接填写MAC地址。

op字段

op为1表示ARP请求

op为2表示ARP应答

3.1.3 模拟一次真实的工作流程

主机A广播一条报文,报文内容如下图

 以太网帧层,相当于是ARP层将报文向下交给他后,该层对他再次进行封装报头!


B、C主机也收到该报文,那他们需不要对报文进行进行解包向上交付给ARP层协议呢?

需要。因为以太网帧报头中的目的MAC地址是全1,为广播。每个主机都要接收这个报文。递交给ARP层后,先区分是ARP请求还是ARP应答,如果是请求,接着查看目的IP地址。如果IP地址不匹配。会在ARP层将该报文丢弃!


D主机接收报文,回应一个ARP应答。


主机B、C同样接收到这个ARP应答报文,需不要解包向上交付给ARP层协议呢?

不用,目标以太网地址为MAC_A,BC主机接收到这个报文,在以太网帧协议这一层就会将报文丢弃掉。

经过这样的过程,主机A就拿到了目的主机的MAC地址。从而可以将历史上收到的报文向下交付,封装完整以太网帧。

问题:

ARP看起来至少进行一个请求和一个应答,是不是每一次发送数据都要这么干呢?

ARP请求成功之后,请求方会暂时的将IP:MAC的映射关系保存进入缓存表。并有其他的方案确定时间更新该缓冲表。

是不是只会在目的最终的子网中进行ARP,其他地方会不会也发生ARP呢?

会,在路由器一层一层的往外部的局域网发送时,下级的路由器就不知道上机路由器的MAC地址,所以也需要进行ARP。ARP的过程会在网络路径中随时发生。

3.2 查看IP地址和MAC地址关系映射的缓存表

 linux下

 windos下

 

 3.3 简单理解什么是ARP欺骗

由于缓存表是存新不存旧的,如果主机A和路由器B已经建立好了映射关系。此时在该局域网中,有一台C主机,疯狂的向路由器B发送构建ARP报文“我是主机A,MAC_C,IP_A”,那么此时就会更新缓存表。主机C继续向主机A疯狂的发送ARP应答,“我是路由器B,MAC_C,IP_B”。

这样主机A和路由器B之间的通信,在双方都不知情的情况下,被C截获了。称为ARP欺骗。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux--数据链路层--ARP协议--0319-21 的相关文章

  • 设置 Vim 背景颜色

    当我尝试更改背景颜色时 vimrc或者直接在 Vim 中使用以下命令 set background dark 这根本不影响我的背景 也没有light选项 不过 当我运行 gvim 时 看起来还不错 有没有办法在不更改 Konsole 设置的
  • tar.gz 和 tgz 是同一个东西吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我创建了 tgz 文件tar czvf filecommand then 我最终得到了一个 tgz 文件 我想知道它和tar gz 之间的
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • ARM 的内核 Oops 页面错误错误代码

    Oops 之后的错误代码给出了有关 ARM EX 中的恐慌的信息 Oops 17 1 PREEMPT SMP在这种情况下 17 给出了信息 在 x86 中它代表 bit 0 0 no page found 1 protection faul
  • 使用 terminfo 的终端颜色?

    我正在编写一个 C 类 允许在终端中使用颜色 我希望它适用于每个终端 在支持真彩色 24 位 的终端上打印 在支持它的终端上具有 256 色 6x6x6 其他都是基本的 16 种颜色 我曾经使用 termcap 编写过一次 C 函数 并且我
  • 路由是否会影响具有绑定源地址的套接字?

    假设我有两个网络接口 eth0有地址10 0 0 1 eth1有地址192 168 0 1 Using route or ip route add我已将其设置为路由 所有地址至eth0 1 2 3 4只为了eth1 所以数据包到1 2 3
  • Laravel 内存问题?

    各位 我在 DO 服务器上遇到这样的问题 我已经尝试了一切 整个网站在使用 Homestead 的 Linux 服务器上 100 正常工作 但上传后 它只能工作一次 在重新加载或刷新页面后会多次下降 我尝试增加 apache 服务器的内存
  • 动态加载库和共享全局符号

    由于我在动态加载的库中观察到全局变量的一些奇怪行为 因此我编写了以下测试 首先我们需要一个静态链接库 头文件test hpp ifndef BASE HPP define BASE HPP include
  • OS X 对 /usr/local/lib 的权限被拒绝

    我正在寻找有关权限问题的任何建议 直觉 线索 答案 自从我切换到新的 Macbook Pro 以来 这个问题一直困扰着我 这就是困境 某些程序在安装期间复制 usr local lib 下的库 并且在运行这些程序时出现崩溃 我认为这与此文件
  • 我如何知道用户在使用 ncurses (Linux) 的控制台中按下了 ESC 键?

    I have a problem in detecting whether I just got a plain ESC key just code 27 or whether it was another special key such
  • 对于客户端服务器程序,并行接收多个客户端连接请求的最佳方法是什么?

    该程序是在 Linux 上用 C 语言开发的客户端服务器套接字应用程序 每个客户端都连接到一个远程服务器并将其自身记录为在线 在任何给定时间点很可能有多个客户端在线 所有客户端都尝试连接到服务器以将自己记录为在线 忙碌 空闲等 那么服务器如
  • BlueZ D-Bus C,应用 BLE

    我正在尝试编写一个应用程序来搜索附近的蓝牙设备并与它们通信 我的应用程序将用 C 语言编写 并打算在 Linux 下工作 是否有通过 C 中的 D Bus 使用 BlueZ 的教程或示例 此应用程序的目的是从 BLE 中的文件发送数据 你能
  • 在 shell 脚本中将脚本目录更改为用户的 homedir

    在我的 bash 脚本中 我需要将当前目录更改为用户的主目录 如果我想更改为用户的foo主目录 从命令行我可以执行以下操作 cd foo 效果很好 但是当我从script它告诉我 bar sh line 4 cd foo No such f
  • 终止 ssh 会话会终止正在运行的进程

    我正在使用 ssh 连接到我的 ubuntu 服务器 我使用命令启动编码程序 然而 似乎当我的 ssh 会话关闭时 因为我在进入睡眠状态的笔记本电脑上启动它 有没有办法避免这种情况 当然 阻止我的笔记本电脑休眠并不是永久的解决方案 运行你的
  • 如何将字符串推送到标准输入?在启动时通过 stdin 提供输入,然后以交互方式读取 stdin 输入 [重复]

    这个问题在这里已经有答案了 有没有办法在调用程序时将字符串 推送 到程序的标准输入流 这样我们就可以达到这样的效果 echo something my program 但不是在之后读取 EOF something my program将从原
  • 查找当前打开的文件句柄数(不是 lsof )

    在 NIX系统上 有没有办法找出当前正在运行的进程中有多少个打开的文件句柄 我正在从正在运行的进程中寻找在 C 中使用的 API 或公式 在某些系统上 见下文 您可以在 proc pid fd 中对它们进行计数 如果不属于其中之一 请参阅下
  • 并发 I/O - 缓冲区损坏、块设备驱动程序

    我开发块分层设备驱动程序 所以 我拦截WRITE请求并加密数据 并解密数据end bio 例行程序 在处理和READ要求 所以在单流中一切正常 但是 如果尝试同时从两个或更多进程执行 I O 我会遇到缓冲区内容损坏的情况 我没有任何本地存储
  • gnutls_handshake() 失败:握手失败 GIT

    一切都工作正常 但突然我收到错误 致命 无法访问 https 电子邮件受保护 cdn cgi l email protection name repo name git gnutls handshake 失败 握手失败 我在我的计算机和 E
  • 使用 xargs 时如何获取退出代码(并行)

    我制作了一个用于启动并行 rsync 进程的脚本 bin bash LIST 1 DEST DIR 2 RSYNC OPTS 3 echo rsyncing From SRC DIR To DEST DIR RSYNC OPTS RSYNC

随机推荐

  • SpringBoot面试题(持续整理中……)

    Spring Boot 是微服务中最好的 Java 框架 为了更好的理解与使用SpringBoot 同时 为了记录平时的点点滴滴 便于日后的面试 1 什么是SpringBoot 用来简化Spring应用的初始搭建以及开发过程 使用特定的方式
  • 位运算的使用

    1 如何使用位运算获取一个数的某一位 直接右移n位 再与1清除高位即可 Returns the Nth bit of X Assumes 0 lt N lt 31 unsigned get bit unsigned x unsigned n
  • 利用LVS实现Web服务器的负载均衡

    LVS介绍 LVS Linux Virtual Server 负载调度器 是全球最流行的四层负载均衡开源软件 由章文嵩博士 当前阿里云产品技术负责人 在1998年5月创立 可以实现Linux平台下的负载均衡 LVS集群类型中的术语 VS V
  • vue-cli入门(三)——人员管理实例

    前言 在开始开发实例前 应首先了解一下vue cli的项目结构 接着我们一起来实现一个小demo 人员管理 功能简单 通过这个实例让大家熟悉使用vue cli开发项目的一些操作 加深对vue cli项目结构的印象 http www jian
  • Linux 下杀毒软件 clamav 0.104.2 离线安装及测试(CentOS7)

    文章目录 Linux 下杀毒软件 clamav 0 104 2 离线安装及测试 CentOS7 1 下载安装 2 配置 3 运行 4 服务器配置 4 1 设置 daemon 守护进程 推荐 4 2 定时任务 5 ClamAV 常用命令 Li
  • SQL Lesson 8: 关于特殊关键字 NULLs

    SQL Lesson 8 关于特殊关键字 NULLs 在查询条件中处理 NULL 使用 在查询条件中处理 NULL SELECT column another column FROM mytable WHERE column IS IS N
  • 深度学习-LeCun、Bengio和Hinton的联合综述

    发表于 2015 06 01 07 10 8257次阅读 来源 Nature 17 条评论 作者 Yann LeCun Yoshua Bengio Geoffrey Hinton 深度学习 自然语言处理 计算机视觉 语音识别 geoffre
  • 跨平台原理:

    跨平台原理 Java中存在Java虚拟机 可以将JAVA程序翻译成对应平台可以执行的程序进行运行 Java程序可以一处编译 到处运行 即java编译时将 java文件转换为无关平台的字节码 class文件 而虚拟机将 class文件翻译给不
  • 分布式发布订阅消息系统—Apache Kafka

    1 什么是Kafka Kafka是一种高吞吐量的分布式发布订阅消息系统 它可以处理消费者规模的网站中的所有动作流数据 这种动作 网页浏览 搜索和其他用户的行动 是在现代网络上的许多社会功能的一个关键因素 这些数据通常是由于吞吐量的要求而通过
  • 基于ant design vue实现的多层菜单组件封装

    菜单组件 不同于树组件的是 树组件可以选很多个 而菜单组件只可以选择一个 这里放上我的源代码 current 是默认选择的节点 是一个数组current 5 3 1 默认选择的节点 openKeys是默认展开的节点 也是一个数组openKe
  • ajax无法发送json串,Ajax检索Json字符串,但无法将成功数据循环为对象

    我的项目是用d3 js绘制grahp 我发现了一些php代码 这绝对是我想要的 但我正在与C 和主场迎战所以我把它转换成asp net 首先 我想编写一些硬编码数据样本并使用d3 js绘制图像 以及该PHP项目的JavaScript代码 现
  • React Hook 之 useMemo及 React.memo

    一 useMemo const memoizedValue useMemo gt computeExpensiveValue a b a b 返回一个 memoized 值 把 创建 函数和依赖项数组作为参数传入 useMemo 它仅会在某
  • 2021泰迪杯数据分析技能赛B题-肥料登记数据分析

    调用模块 import numpy as np import pandas as pd import matplotlib pyplot as plt import seaborn as sns plt rcParams font fami
  • iic通信原理_血氧饱和度传感器MAX30102模块的原理及编程

    一 简介 MAX30102是一个集成的脉搏血氧仪和心率监测仪生物传感器的模块 芯片 它集成了一个660nm红光LED 880nm红外光LED 光电检测器 光器件 以及带环境光抑制的低噪声电子电路 可通过软件关断模块 待机电流为零 实现电源始
  • OpenCV Mat类型及convertTo转换

    类型 在 Android OpenCv中给我们返回的 type 直接是 CV 8UC4 但是 在 C 中返回的是 16 等这些整型 所以 我找了个对照表 表头的 C1 C2 C3 C4 指的是通道 Channel 数 比如灰度图像只有 1
  • 获取当前访问的部分虚拟路径(Request.Url.GetLeftPart)

    Request Url GetLeftPart的应用 发送按钮
  • 2023牛寒2--Tokitsukaze and K-Sequence

    Tokitsukaze 有一个长度为 n 的序列 a 她想把这个序列划分成 k 个非空子序列 定义序列的值为这个序列中只出现一次的数字的个数 对于 k 1 n Tokitsukaze 想知道把序列 a 划分成 k 个非空子序列后 所有子序列
  • GCD->OC

    VHAsyncRun h VHAsyncRun h VHUpload Created by vhall on 2019 11 7 Copyright 2019 vhall All rights reserved typedef void V
  • 20230601

    20230703 mockito when 不生效 掘金 Java 单元测试 3 mock进阶 静态 final 私有方法mock 掘金 Mockito与PowerMock的使用基础教程 掘金 System out println Syst
  • Linux--数据链路层--ARP协议--0319-21

    目录 1 认识以太网 1 1 以太网帧格式 1 2 基于以太网帧简单模拟局域网通信 问题一 如果有多台主机都在发送数据呢 问题二 发送方知不知道自己的数据被影响了呢 1 3 MTU 1 3 1 MTU对IP协议的影响 1 3 2 MTU对U