Think Deep,Work Lean

icmp与ping全过程

Posted on By zack

前言

总是过一段时间就经常有疑惑:

  1. ip n arp是在什么时候起作用?
  2. IP数据包在路由过程中,目的ip是不是要改成ip r中匹配到的下一跳的IP?
  3. 它的源mac/目的mac/源IP/目的IP 到底是什么时候被替换?
  4. 如果ping的时候,到底是先从ip n|grep <目的IP>arp中取出对方的mac、然后直接将包发过去,还是先从ip r get <目的IP>中取出路由信息、然后直接将包发给这个下一跳?
  5. 同一网段直接走二层,直接就可以用mac地址来通信,IP是三层,为什么要用IP?
  6. 10.233.0.0/16子网具体是怎样的?如何理解?
  7. 10.233.0.2/16与10.233.0.2/24是同一个IP吗?如果主机上配了这个IP,能不能Ping通?Ping的是哪一个?如果这两个地址同时被配了,是不是有冲突?
  8. netfilter跟 ip r的先后顺序。

然后总是要把思路捋半天,才搞清楚,或是还有些还没有完全清楚,暂时在这记录。

关于icmp与ping

IP数据报文格式是 目的mac-源mac-目的ip-源ip。数据报文到了一个主机的网卡后,先是看目的mac是不是自己的,只有当目的mac是自己的时候才会处理,否则直接丢弃。此时报文会先去掉mac层。然后看IP是不是自己的,如果是自己的,这个数据报文就被接收了。如果不是自己的,就会在这个主机上路由。
这个就是数据的通信方式。但是协议可以有很多,如icmp/tcp等,但它们都是这个流程。
在路由的过程中,目的mac/源mac经常会变,目的IP基本上不会变,源IP也不会变。snat可以改变源IP,dnat可以改变目的IP。

场景一:同一网段的两个主机,相互ping时的过程。

node1/192.168.0.2 node2/192.168.0.3
node1 Ping node2

过程: node1 ping node2的时候,首先会看ping的这个IP地址是不是跟自己的IP的地址是同一个网段的,或者说跟自己的IP是不是在同一个子网的。如果是同一个子网的,那么会在子网内先发起一个ARP请求,找出这个IP地址对应的MAC地址。

13:05:31.494064 52:54:22:d7:6e:76 > Broadcast, ARP, length 42: Request who-has 192.168.0.5 tell 192.168.0.2, length 28
13:05:31.494144 52:54:22:0b:2e:bd > 52:54:22:d7:6e:76, ARP, length 42: Reply 192.168.0.5 is-at 52:54:22:0b:2e:bd, length 28

然后把该数据包的目的mac修改为这个刚获取到的mac地址。此时这个数据包就可以正常通过二层直接转发过去。此时源IP跟mac是node1的ip跟mac,目的IP跟mac是node2的源ip跟mac。

场景二:不同网段的两个主机,相互Ping。node1 192.168.0.2 / node2 192.168.1.2。

过程:原理是一样,首先看对方的IP是不是同一子网。发现不是,然后会先去获取路由信息,此时才会到ip r 。 如: …

待补充