zoukankan      html  css  js  c++  java
  • tcp/ip 卷一 读书笔记(5)arp和rarp 同网段和不同网段之间的通信过程

    arp和rarp 同网段和不同网段之间的通信过程

    IPv6中已经没有arp rarp协议,所以这里都是IPv4。

    链路层使用以太网地址来确定目的地址,应用则常使用ip地址通信
    arp协议是指从ip地址获取对应的mac地址的协议

    同网段和不同网段之间的通信过程

    网上别人写的很经典的ping过程,不清楚原创作者是谁:

    在当今的以太网络通信中,在IP数据包中有两个必不可少的地址,那就是IP地址和网卡地址(即MAC地址),在数据包中,无论是IP地址还是MAC地址,都有源地址和目标地址,因为通信是双方的,所以就必须同时拥有双方的地址!在同一IP网络中通信,将会发生以下事件:
    主机A与主机B通信,这时主机A肯定首先要封装这些需要发给主机B的数据包,那么对于主机A来说,自己的IP地址和MAC自己肯定能够轻易得到,对于主机B的IP地址这时主机A也应该知道,要不然它就不清楚自己将要和谁通信,当有了自己的IP地址,MAC地址以及主机B的IP地址后,主机A在数据包中可以正确地写上源IP地址,目标IP地址,接下来的工作就是写入自己的MAC地址(即源MAC),最后还必须正确写入目标主机B的MAC地址,可这时主机A才发现自己根本没有目标主机B的MAC地址,那该怎么办呢?这时主机A就通过比较上面已经封装好的源IP和目标IP,通过子网掩码计算一下,发现源IP和目标IP恰好在同一个IP网络内,那么它想要得到目标主机B的MAC地址就有办法了,首先主机A就向本网段发过一个ARP请求,这个ARP请求包中包括主机A的源IP地址,源MAC地址,目标主机B的IP地址,而目标MAC地址为广播MAC地址(全部为F),因为我们要找的就是目标MAC,所以这里用广播MAC地址,又因为是以太网,所以整个局域网的所有主机都能收到这个请求MAC地址的数据包,当然主机B也能收到,因此在主机B收到此ARP请求后,立即构建一个包括自己的MAC地址的ARP回应包,回应给主机A,当主机A收到这个ARP回应后,终于完成了找寻目标MAC的重大任务,从而把目标主机B的MAC地址正确封装进上面还未封装结束的正准备发给主机B的数据包,在这时,源IP和源MAC以及目标IP和目标MAC都已正确存在于数据包中,那么这里主机A向网络内发出这些数据包,因为目标地址在本网段,所以本网段所有主机都能收到这个数据包(这是以太网的特性),最后只有真正的目标主机B能够打开这些数据包,在此,同网段两台主机之间的通信就此圆满结束!在这里应该注意另外一个问题,因为主机A要寻找的目标主机B在同一网络,所以主机A能够通过ARP得到目标主机B的MAC地址,从而完成通信,当主机A在封装数据包时检测到目标主机并不在本网段,在这时,数据包不能把目标主机的MAC地址顺利封装进去,那么就用到另一种方法,那就是网关,主机A在准备发向主机B的数据中,封装好自己的IP地址和MAC地址,同时也封装好目标主机B的IP地址,数据包封装到这里,主机A就利用上面得到同网段目标主机B的方法去请求得到网关的MAC地址,同样也是用ARP去广播,因为网关必须和本机在同一网段,理所当然,网关能够收到这个ARP请求并能正确回应给主机A,这时主机A在数据包中封装好自己的IP地址和MAC地址,同时也封装好目标主机B的IP地址和网关的MAC地址,把数据包从网卡发出去,因为目标MAC是网关的,所以网关收到这个数据包后,发现目标MAC是自己,而目标IP却是别人,所以它不可以再往上打开这个数据包,它要做的工作就是把这些数据包发给下一跳路由器(如果网关自身就是一台路由器的话),如果网关是一台普通PC,那么它就发给路由器,让路由器把这些数据包正确传输到远程目标网络,到达远程网络后,它们的网关再将数据包发给数据包中的目标IP,即源主机A苦苦寻找的目标主机B,从而真正结束不同网络之间的通信,回应的数据包也是用同样的方法到达目的地,在这里,还需要注意的是,当网关把数据包发给下一跳路由器时,这个数据包必须由网关把目标MAC改成下一跳路由器的MAC地址(通过ARP得到),否则下一跳路由器收到目标MAC不是自己的数据包,会丢弃不予理睬,下一跳路由器再发给下一跳路由器同样要把目标MAC地址改为下一跳路由器的MAC地址再发出去!
    最后还可以总结出:在网段通信时,数据包中的地址就是源IP,目标IP,源MAC,目标MAC,根本用不到网关,而当检测到需要把数据包发到远程网络时,这时,目标MAC就必须改变了,在还没有出内网时,目标MAC必须写成网关的MAC地址发出去,当网关收到时,再把目标MAC地址改成下一跳的MAC地址发出去,而源IP和源MAC以及目标IP不曾改变,就算到达了公网上,目标MAC仍然在不断改变着,直到最后,这个数据包到达目标IP的网络,最终通信结束!

    arp高速缓存

    arp -a可以看到当前主机缓存的ip地址和mac地址对应的列表
    可以看到缓存的都是同网段的机器的mac地址,因为需要arp请求的地址,都是下一跳不经过路由器就能到的地址,这地址才有意义。

    主机和其他主机通信时,只有当目的地址和当前地址在同一个网络中时,才会发送arp请求这个目的地址的mac地址,如果交换机收到这个arp请求,发现这个ip对应的mac地址已经自己已经缓存了,就将这个地址回应给当前主机,发送给所有端口。如果是不同网段间的通信,源地址和目的地址不在同一个网络中就根据路由表,那么系统会选择下一跳的主机,目的mac地址填下一跳主机的地址。

    arp攻击

    可以编造包,去一直请求arp请求当前网络中不存在的主机,这样arp包会被发送到整个网络的所有主机上,也就是arp广播攻击了。
    也可以编造包,声称ip x.x.x.x的mac地址是自己,arp欺骗,劫持流量,影响正常通信。

    其他:
    安全是个大问题,以后遇到了再学吧。
    ARP攻击防范方法总结

    arp代理

    当一个路由器收到arp请求时,它可以代替它所连接到的主机回应这个请求,例如主机10.10.10.10有一条10.10.0.0/16的路由,他认为10.10.20.10和它在同一个网络内,所会发送arp请求,请求获得10.10.20.10的地址,通常是这样子,可是有时候这个地址并不在这个网络内,路由器收到地址后发现,它的en0连接到10.10.10.0/24,en1连接到10.10.20.0/24,如果没有配置arp代理,那正常的,路由器不会有任何响应,主机10.10.10.10会发现自己不能连接到目的地址,如果配置了arp代理,路由器就会把en0的地址回应给10.10.10.10,告诉他这就是10.10.20.10的地址。

    不必要arp

    gratuitous arp,既发送arp请求查询本机ip的mac地址,可以用于检测ip冲突,或者是当前接口mac地址变更后,向局域网内更新自己的mac地址变换

    tcp/ip卷一中文版把这个翻译成免费arp,这是不准确的。

    rarp

    逆地址解析协议,可以用于网卡启动时,向rarp server请求自己的ip。和dhcp类似的功能,现在基本都使用dhcp。

  • 相关阅读:
    2、细节&Class对象
    1、概述&应用场景
    Magento请求分发与控制器
    Magento强大的配置系统
    ecshop在PHP 5.4以上版本各种错误问题处理
    Thinkphp单字母函数使用指南
    五种常见的 PHP 设计模式
    MyISAM和InnoDB的区别
    linux下如何删除文件夹
    Linux软件安装与卸载
  • 原文地址:https://www.cnblogs.com/zhangyufei/p/5602304.html
Copyright © 2011-2022 走看看