“补充了一些前期学习认知的不足,通过模拟发送不同字段的ARP请求或者响应,总结归纳后,修改前面发布的文章ARP协议,后续会删除前面发布的文章。”

01

ARP协议

ARP,Address Resolution Protocol,地址解析协议,解析IP地址得到MAC地址,基于数据链路层之上的协议,可以看成和网络层同一层级,通常称为2.5层协议,ARP是网络层与数据链路层的重要枢纽,它解决了网络层(软件)到数据链路层(硬件)的映射。

ARP请求报文

数据通信的基础是在以网卡为硬件的数据链路层发送和接收的,如果想实现两台主机通信,必须知道目标主机的硬件地址,即MAC地址。主机A想要发送数据给主机B,我们知道发送网络报文是一个封装的过程,数据需要在应用层、传输层、网络层、数据链路层封装,网络层的目的IP是主机B的IP地址192.168.0.200,这个是已知的,数据链路层的目的MAC是主机B的MAC地址,这个主机A不知道,它首先会去自己的ARP缓存表内查找(切记是根据IP找MAC)。如果之前A和B通信过,A存入过B的IP-MAC的映射关系,如果这条目录还未老化删除,此时应该可以查找到,那么把B的MAC地址填充到链路层头部完成封装,发出去即可。可是如果之前A和B并未通信过,A没有存入过B的IP-MAC,或者虽然存入过,但此时已经过了这条条目的老化时间,已经从ARP缓存表内删除了,那么A就无法从ARP缓存表内根据主机B的IP地址查到B的MAC地址,也就无法完成封装报文。怎么办?此时A会启动ARP协议层程序,让其自动发一条ARP请求报文,以广播的形式发给网段内的其他所有主机。其他主机收到此条ARP请求报文后,会判断是否发给自己,如果不是,则不回复,如果是,则回复一条ARP响应报文给主机A,A收到即知道B的MAC地址。具体过程:主机A首先在自己的ARP缓存表内查找是否有IP=192.168.0.200这个表项,如果有,把这个表项里MAC地址填入报文以太网帧头部的目标MAC地址内,然后通过网卡发出去。如果没有,则系统的ARP协议层程序会先发一个ARP广播请求报文出去,请求目标MAC地址(为什么这个ARP请求报文是广播报文?因为不知道对方的MAC地址,又想让对方主机收到这个ARP请求报文,那么就发一个广播报文,让交换机把ARP请求报文发给这个局域网内除了发送方以外所有的主机,那么肯定可以到达目标主机)那么ARP广播请求报文如何构造,各个字段的定义是什么?

destination MAC=FF:FF:FF:FF:FF:FF

目标MAC地址字段,FF:FF:FF:FF:FF:FF表明这是一个广播MAC地址,可以让交换机以广播的形式发出去

source MAC=02:00:00:00:00:1A

源MAC地址字段,它是源主机的MAC地址

OP=1

表明它是一条ARP请求报文

target IP=192.168.0.200

目标主机的IP地址,它是为了到达主机后,目标主机ARP协议层程序判断是否发给自己的依据,它是必须要有的,因为目标MAC地址是广播地址,意味着所有主机在数据链路层都能接收,只有通过和它比较,让不是目标主机的其他主机不回复,让目标主机回复

sender IP=192.168.0.100

sender MAC=02:00:00:00:00:1A

源主机的IP地址和MAC地址,这是让目标主机存入自己IP-MAC映射所使用的字段,也可以利用它们伪造ARP报文

target MAC=00:00:00:00:00:00

目标主机的MAC地址,ARP请求报文就是为了请求目标主机MAC地址,所以它是全0的

  1. 通过上面的ARP广播请求报文各字段的定义,得知ARP请求报文在送达交换机时,交换机根据目标MAC地址是广播地址,在除了发送方端口外的其他所有端口,都复制一份ARP请求报文,发出去给所有主机

  2. 接收到ARP请求报文的主机首先在数据链路层比较destination MAC,由于是广播MAC地址,可以接收,然后比较target IP

  3. 目标主机比较target IP发现一致后,首先会把ARP请求报文的sender IP和sender MAC存入自己的ARP缓存表(windows系统是这样,其他系统有可能先存入)

  4. 然后目标主机的ARP协议程序会给源主机自动回一个ARP响应报文

ARP响应报文

发送条件:被动响应或者主动发送

被动响应:

  1. 目标主机ARP协议层子程序收到ARP请求后,首先把ARP请求报文的sendeMAC和senderIP存入自己的ARP缓存表内,然后以单播的形式给源主机回ARP响应报文(为什么是单播?因为已经知道源主机的MAC地址了)。

  2. ARP响应报文的各字段

    destination MAC=02:00:00:00:00:1A

    目标MAC地址字段,02:00:00:00:00:1A是主机A的MAC地址,说明这是以单播的形式发送出去的

    source MAC=02:00:00:00:00:1B

    源MAC地址字段,它是源主机的MAC地址

    OP=2

    表明它是一条ARP响应报文

    target IP=192.168.0.100

    目标主机的IP地址,主机A收到ARP响应后并不会比较它

    sender IP=192.168.0.200

    sender MAC=02:00:00:00:00:1B

    源主机的IP地址和MAC地址,目标主机收到后,把它们存入自己的ARP缓存表

    target MAC=02:00:00:00:00:1A

    目标主机的MAC地址

  3. 当源主机收到ARP响应报文后,会把senderIP和senderMAC存入自己的ARP缓存表中作为动态条目,不管targetIP是否是自己

总结

  1. ARP协议是针对IPv4的寻址协议,IPv6有自己的寻址协议

  2. ARP请求报文和ARP响应报文都是不能跨网段的

  3. ARP请求报文以广播形式发送,ARP响应报文以单播形式发送

  4. ARP请求报文和响应报文的接收方都会把senderIP和senderMAC存入自己的缓存表内,也就是说,请求报文和响应报文都可以让自己主机的ip和mac被对方记录,不同的是,请求报文还会让对方自动给我回一个ARP响应报文,而响应报文只会让对方存入自己的ip和mac,而不会有回复(不是完全准确,免费ARP响应是会有回复的,后续会讲到)

  5. 只有ARP请求报文和ARP响应报文具有缓存ip和mac的功能,其他协议的message虽然也带有源mac和ip,但是并不能让目标主机把源ip和mac存入ARP缓存表内(当然ARP请求和响应报文存入ip和mac还需要判断其他条件,后续会讲到)

arp 已知mac找ip_ARP协议修订版相关推荐

  1. arp 已知mac找ip_知道IP查MAC地址,知道MAC地址查IP

    (即在局域网内 , 知道 IP 查 MAC 地址,知道 MAC 地址查 IP ) 你可以使用 arp 程序( WINDOWS 自带) eg: arp -a 192.168.0.1 如果使用程序查的话, ...

  2. arp 已知mac找ip_怎么通过mac地址查ip 通过mac地址查ip方法【图文】

    随着网络的普及率越来越高,科技越来发达,使用电脑的过程中遇到的问题越来越多.其中一个问题就是知道mac地址,却不知道IP地址.为什么呢?在网络的世界里IP地址是虚拟的;mac地址是网卡地址,只有一种, ...

  3. 在windows中用java执行DOS命令arp -a获取已知MAC对应的ip地址

    在公司内网中,有一台主机(windows server2016)因为测试需要,在里面安装了九台centos7虚拟机,主机只在第一次安装系统时候链接显示器,之后就没有链接显示器,需要使用远程链接,但是因 ...

  4. 华为/思科已知一个ip查对应mac和交换机接口

    思路:已知一个路由器上的ip(192.168.1.x)则使用ip使用扫描工具查ip对应的mac地址,顺便看看网关mac地址,若是交换机上的ip地址跳过上面路由器的步骤,然后进行查找(可以是ip 查找也 ...

  5. H3C交换机运维之-通过已知终端MAC地址查询接入交换机接口

    注意: 此步骤只适用于终端和接入交换机互通不知道是哪个口的情况(请先确保终端与接入交换机线路正常) 需要满足条件 1.知道管理vlan(这里模拟为vlan900) 2.知道新入网终端MAC地址后4位( ...

  6. 已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者。

    已知2个整形数据a,b.不使用if,?:以及其他任何条件判断的语法,找出a跟b中数据的大者. 答案: int max(int a,int b) { return (a+b+abs(a-b))/2; } ...

  7. CV:基于face库利用cv2调用摄像头(或视频)根据人脸图片实现找人(先指定要识别已知人脸的文件夹转为numpy_array+输入新图片遍历已有numpy_array)

    CV:基于face库利用cv2调用摄像头(或视频)根据人脸图片实现找人(先指定要识别已知人脸的文件夹转为numpy_array+输入新图片遍历已有numpy_array) 目录 输出结果 设计思路 核 ...

  8. C语言试题五十一之已知学生的记录是由学号和学习成绩构成,n名学生的数据已存入s结构体数组中。请编写函数fun,该函数的功能是:找出成绩最高的学生记录,通过形参返回主函数(规定只有一个最高分)。

    1. 题目 请编写一个函数void function(Student a[], int n, Student *s),其功能时:已知学生的记录是由学号和学习成绩构成,n名学生的数据已存入s结构体数组中 ...

  9. 现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数...

    现在有一个整数数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数. 方法1:Hash链表 方法2:使用两个变量A和B,其中A存储某个数组中的数,B用来计数.开始时将B初始化为0 ...

最新文章

  1. [Android Traffic] 调整定时更新的频率(C2DM与退避算法)
  2. java注销对话框_【java小程序实战】小程序注销功能实现
  3. 无监督学习与监督学习的区别
  4. 深入浅出 Java CMS 学习笔记
  5. percona-toolkit--pt-table-checksum
  6. 3 FI配置-企业结构-分配-给公司分配公司代码
  7. (31)System Verilog验证计划及策略
  8. Activate Windows server 2003 in VMware
  9. Python标准库参考-sched
  10. 几个 Python“小伎俩” | 内附代码
  11. Intelliok IDEA的Monokai主题
  12. double、float、long占几个字节?
  13. 基于AVR单片机及无线收发模块的脉搏监测系统设计
  14. 重磅 | 2022年第三季度Web3.0行业安全报告
  15. 数码视讯Q1、Q5机顶盒线刷固件
  16. Linux 两个服务器之间测试传输速度,测试两台服务器之间的网络带宽
  17. 翼灵物联工作室第一次考试总结
  18. 解决The valid characters are defined in RFC 7230 and RFC 3986
  19. 数据挖掘基本流程 CRISP-DM --项目实战总结 可操作性强
  20. vim安装配置coc.vim实现语言的自动补全

热门文章

  1. Leetcode 746.使用最小花费爬楼梯
  2. k8s部署nacos
  3. 读 zepto 源码之工具函数
  4. 日本程序开发式自定义的malloc/free函数(一)-外部式样书(外部仕様書)
  5. AC日记——向量点积计算 openjudge 1.6 09
  6. 2016年工作中遇到的问题11-20
  7. 转载:Windows Phone 7 资源汇总(超全)
  8. 前端、后端、运维都能用的动态 json 数据管理神器,节省你大量的开发、设计数据库、运维的时间...
  9. 6.8 2.23-2.26
  10. 深入详解Java线程池——ThreadPoolExecutor