有了IP和MAC 为什么还需要ARP协议
来源:互联网 发布:天刀捏脸数据 帅哥 编辑:程序博客网 时间:2024/05/29 09:11
如何才能知道自己PC的IP地址?一个很简单的方法是使用ipconfig/all命令,如下图:
如果你的PC中安装有多个网卡,那么相对于每块网卡Ethernet adapter项所显示的内容都会有所不同,相信大多数PC上显示的都是“本地连接”,这是中文版WIDNOWS XP系统中以太网卡的默认命名。此处Physical Address项目所显示的就是“本地连接”的MAC地址。
在以太网中,如果主机A需要向主机B发送数据,在发送前必须先解决一个问题——我怎么才能知道主机B“位置”呢?可能有人会说我知道主机B的IP地址啊……,但实际上,在以太网环境中数据的传输所依懒的是MAC地址而非IP地址,而将已知IP地址转换为MAC地址的工作是由ARP协议来完成的。
ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。在以太网中,一个主机和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。
在每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的,我们可以使用arp –a命令查看当前缓存表,如下图:
我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例。当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到了,也就知道了目标MAC地址,直接把目标MAC地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播,目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.1.1的MAC地址是什么?”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应:“192.168.1.1的MAC地址是00-aa-00-62-c6-09”。这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。
下面我们通过一个实例来简单说明一下ARP协议是如何工作的:如下图,小编首先使用arp –d命令将ARP缓存表清空,第二步Ping一个IP地址192.168.99.252,第三步使用arp –a命令查看ARP缓存表,这时表中出现了一条 192.168.99.252 00-19-21-0a-95-9d dynamic 记录,该条记录的类型为Dynamic,意思是说,这条记录是动态产生的。ARP记录也会出现静态的记录条目,相应的类型为static。正如前面所说的,ARP缓存表具有老化机制,几分钟后小编再次使用arp –a命令查看缓存表,刚才的那条记录已经不存在了。
下图是小编使用wireshark(一个抓包工具)抓到的刚才ARP数据包的信息,由于在本机ARP缓存表中没有IP地址192.168.99.252相对应的MAC地址记录,所以在通讯之前系统会向网络中首先发送一个广播包——所有字符都为”f”的MAC地址,用来询问192.168.99.252的MAC地址是什么?局域网中所有的PC都将收到这个广播包,但只有IP地址为192.168.99.252的PC才会对此请求作出回应——告之192.168.99.204我的MAC地址是00:19:21:0a:95:9d,其它PC则将数据包直接丢弃,在发送方知到了目的主机的MAC地址后便可以进行通讯了。
ARP Request 数据包
- 有了IP和MAC 为什么还需要ARP协议?
- 有了IP和MAC 为什么还需要ARP协议
- 为什么有了IP地址还需要MAC地址?
- C++有了malloc和free,为什么还需要new/delete
- 有了事务为什么还需要乐观锁和悲观锁
- 有了事务为什么还需要乐观锁和悲观锁
- 有了互斥量,为什么还需要条件变量?
- 有了互斥量,为什么还需要条件变量?
- C++中有了malloc/free,为什么还需要new/delete?
- C++中有了malloc/free,为什么还需要new/delete?
- C++中有了malloc/free,为什么还需要new/delete
- 为什么有了wait函数族还需要SIGCHLD信号
- 为什么有了可靠地TCP还需要不可靠的UDP
- IL2CPP是什么?有了Mono为什么还需要IL2CPP?
- 有了@asyncio.coroutine装饰器,为什么还需要async关键字?
- 为什么同时需要IP地址和MAC地址
- Internet为什么需要IP地址和MAC地址?
- 计算机网络-----为什么同时需要IP地址和MAC地址
- 安全性测试(二)--系统服务器安全检查
- 使用 jQuery 复制文字到剪贴板的技巧
- 安全性测试(三)--数据库安全检查点
- SwaggerUI+SpringMVC-构建RestFul API的可视化界面
- Web应用安全权威指南读书思维导图
- 有了IP和MAC 为什么还需要ARP协议
- 安全性测试(四)--接口安全检查
- 解决"initialization failure:0×0000000c"和"txwebserver遇到未知错误"
- tomcat 启动异常 Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardCont
- Unity Tiling和offset的使用
- iOS runTime 机制详解
- ShapedPrepference轻量级数据存储方式
- Android 小样之TextView横向滚动(跑马灯效果)
- chicken-and-egg problem的一些想法