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 的相关文章

  • 在内核代码中查找函数的最佳方法[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我开始浏览内核代码 遇到的一件事是如何跟踪函数调用 结构定义等 有没有一种好的方法可以快速跳转到函数定义并退出 我尝试过 Source N
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • FileOutputStream.close() 中的设备 ioctl 不合适

    我有一些代码可以使用以下命令将一些首选项保存到文件中FileOutputStream 这是我已经写了一千遍的标准代码 FileOutputStream out new FileOutputStream file try BufferedOu
  • 适用于 Linux 的轻量级 IDE [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • 如何在 Ubuntu 中创建公共 HTML 文件夹?

    简单的问题 但由于某种原因我无法在谷歌上找到确切的答案 我在 Slicehost 上安装了全新的 Ubuntu 并且想在我的主目录中为包含一堆静态 HTML 文件的简单网站创建一个公共目录 我该怎么做呢 只是打字的问题吗mkdir publ
  • 如何获取 (Linux) 机器的 IP 地址?

    这个问题和之前问的几乎一样如何获取本地计算机的IP地址 https stackoverflow com questions 122208 get the ip address of local computer 问题 但是我需要找到一个的I
  • 并行运行 shell 脚本

    我有一个 shell 脚本 打乱大型文本文件 600 万行和 6 列 根据第一列对文件进行排序 输出 1000 个文件 所以伪代码看起来像这样 file1 sh bin bash for i in seq 1 1000 do Generat
  • 在 Mono 上运行 .Net MVC5 应用程序

    我正在 Windows 上的 Visual Studio 2013 中开发 Net 4 5 1 MVC5 应用程序 现在我想知道 是否可以在Linux Ubuntu 12 04 上运行这个应用程序 可以使用OWIN吗 Owin 可以自托管运
  • 与 pthread 的进程间互斥

    我想使用一个互斥体 它将用于同步对两个不同进程共享的内存中驻留的某些变量的访问 我怎样才能做到这一点 执行该操作的代码示例将非常感激 以下示例演示了 Pthread 进程间互斥体的创建 使用和销毁 将示例推广到多个进程作为读者的练习 inc
  • 配置tomat的server.xml文件并自动生成mod_jk.conf

    我在用apache 2 2 15 and tomcat6 6 0 24 on CentOS 6 4并希望使用 tomcat 服务器的功能 通过添加以下内容自动生成 mod jk conf 文件
  • 在生产服务器上使用 Subversion 使文件生效的最佳方法是什么?

    目前我已经设置了 subversion 这样当我在 Eclipse PDT 中进行更改时 我可以提交更改 它们将保存在 home administrator 中项目文件 该文件具有 subversion 推荐的 branches tags
  • 绕过 dev/urandom|random 进行测试

    我想编写一个功能测试用例 用已知的随机数值来测试程序 我已经在单元测试期间用模拟对其进行了测试 但我也希望用于功能测试 当然不是全部 最简单的方法是什么 dev urandom仅覆盖一个进程 有没有办法做类似的事情chroot对于单个文件并
  • 如何让 Node.js 作为后台进程运行并且永不死掉?

    我通过 putty SSH 连接到 linux 服务器 我尝试将其作为后台进程运行 如下所示 node server js 然而 2 5 小时后 终端变得不活动 进程终止 即使终端断开连接 我是否也可以使进程保持活动状态 Edit 1 事实
  • 从 Linux 内核模块中调用用户空间函数

    我正在编写一个简单的 Linux 字符设备驱动程序 以通过 I O 端口将数据输出到硬件 我有一个执行浮点运算的函数来计算硬件的正确输出 不幸的是 这意味着我需要将此函数保留在用户空间中 因为 Linux 内核不能很好地处理浮点运算 这是设
  • x86-64 AMD 上 CALL 指令的操作数生成

    以下是示例程序 objdump 的输出 080483b4
  • ansible unarchive 模块如何查找 tar 二进制文件?

    我正在尝试执行一个 ansible 剧本 该剧本的任务是利用unarchive模块 因为我是在 OSX 上执行此操作 所以我需要使用它gnu tar 而不是bsd tar通常与 OSX 一起提供 因为BSD tar 不受官方支持 https

随机推荐

  • 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