ARP协议、路由器详细工作原理
ARP原理分析
第一次通信时,有对方IP地址但是没有目标MAC地址,该PC就会在网络层启动ARP协议生成一个ARP报文"我叫1.1,我的MAC是AA;谁是1.3,你的MAC是多少?",该PC把报文广播出去,到交换机加上帧头帧尾.帧头的目标MAC是12个F进行广播,报文变为广播请求报文.交换机看到12个F就进行广播,所有人都收到.被广播接收方拿下帧头帧尾再查看3级ARP报文,看问的是谁,其他PC和网关发现找的不是自己就丢弃不给回应.
正确接收方接收到发现问的就是自己,就会给个回应,把自己的MAC地址写进去.因为知道是谁问的,所以此时回应不需要广播,这叫ARP单播应答.PC收到单播应答后,就获取到对方MAC地址.并在自己电脑上生成ARP缓存表,该缓存表内就是别人的IP和别人的MAC地址.
如果路由器发现找的不是自己,不会再继续转发广播.交换机控制不了广播,路由器是天然控制二层广播的设备.广播到路由器永远出不去。
ARP分析(同网段与不同网段):
当PC与其他主机通信时,首先判断与自己是否在同一网段
若在同一网段,则发送ARP广播寻求目标IP地址的MAC地址
若不在同一网段,则发送ARP广播寻求网关的MAC地址(前提是给PC配了网关).(想要上网,直接找网关的目标MAC地址)
路由器详细工作原理
①一个帧到达路由器后,首先检查帧中目标MAC地址是否是本接口的MAC,如不是则丢弃,如是则解封装并将IP包移动到路由器内部。
②将IP包中目标IP与路由表进行匹配,如匹配路由表不成功,则丢弃,返回ICMP错误消息;若成功,则将数据路由到相应的出口,再封装帧头帧尾
③检查ARP缓存中是否有下一跳的MAC,如有则重新封装出去;如没有,则发送ARP请求广播报文获取下一跳的MAC,并记录到ARP缓存表中,再重新封装数据帧发送出去。
路由器处理ARP包过程
PC0------SW---------ROUTER---------PC1
假设是第一次通信,有路由器存在,跨网段的通信哦。
1.PC0开始Ping PC1,因为是跨网段的通信,所以要先发ARP包请求网关的MAC地址,要拿到网关的MAC地址才能正确封装数据。这时ARP包(注意这里是ARP包,不是你的Ping包)里源ip地址为PC0的IP地址,源MAC地址为PC0的MAC地址,目标IP地址网关的地址,目标MAC地址为全F(也就是二层的广播地址)
2.当Sw收到PC0的ARP包,先学习,将PC1的MAC地址记录下来并和对应的接口绑定,形成CAM表,因为SW没有学习到关于PC0 的网关的任何表项,所以将此ARP包进行泛洪,包的内容并没有修改。
3.当ARP包到达了路由器,路由器先记录PC0的IP地址和对应的MAC地址,然后会响应这个ARP包,并作出回应,回应的这个ARP,源IP为路由器接口IP,源MAC为路由器接口MAC,目标IP为PC0的IP,目标MAC为PC0 的MAC。。这个ARP回应发回给SW,Sw学习这个MAC地址,并记录到CAM表,然后转发给PC0。
4.这时 PC0已经有了网关的MAC地址,Ping包就可以正常发送 ,Ping包格式源IP是PC0的IP,源MAC为PC0的MAC,目标IP为PC1的IP,目标MAC为PC0的网关的MAC。
5.当PC0的Ping包到达路由器,路由器这时就要查看自己的路由表,发现有连接有PC1的这个网段,但是路由器没有PC1的MAC地址,无法将此包进行封装转发,封装失败,就将这个包丢弃
6.路由器这时就从连接PC1网段的这个接口发送ARP包,源IP地址,连接PC1的接口IP地址,源MAC地址,连接PC1的接口MAC地址,目标IP地址,PC1的ip地址,目标MAC地址全F。
7.当PC1收到这个路由器发送的ARP包,进行相应,将自己的MAC地址返回给路由器。
8.路由器这个时候就获取了PC1的IP地址和对应的MAC地址。
最新文章
- PHP面向对象06_异常处理
- PHP判断字符串中是否包含指定字符串,支持中文哦
- mysql编译时报的一个警告warning: type-punning to incomplete type might break strict-aliasing rules,可能是bug
- Inno Setup使用技巧
- HDU 1532 (Dinic算法)
- golang windows程序获取管理员权限(UAC ) via gocn
- QT 读写sqllite数据库
- 深入理解offsetTop与offsetLeft
- FormSheet式模态视图,点击模态视图外隐藏模态视图的方法
- hdoj 5311 Hidden String(KMP)
- 在容器中运行 Jenkins pipeline 任务
- Java 并行与并发
- layui+ztree 树状下拉框
- JavaScript定义类和实例化示例
- MyBatis中调用存储过程和函数
- react-router 4.x
- VC设置视图背景颜色方法
- java 解析pdm文档
- Unity 游戏开发技巧集锦之创建透明的材质
- Android内存优化(三)避免可控的内存泄漏