主机发送IP数据包过程
当一个拥有公网IP的主机给其它主机发送IP数据包时,首先在IP首部封装自身IP地址(源IP)和目的主机的IP地址(目的IP),实现网络层数据的封装。接下来进行数据链路层封装,数据链路层数据帧的源MAC地址是本机MAC地址,但是目的主机的MAC地址主机并不知道,所以在完成数据链路层封装前必须知道目的MAC地址。
在TCP/IP协议族中,主机是通过ARP协议获取目的主机MAC地址的。假设主机A给其他主机发送IP数据,开始时主机A不知道目的主机的MAC地址,只知道目的主机的IP,主机A就发一个ARP请求帧,ARP帧的源IP是主机A的IP,目的IP是目的主机的IP,源MAC是主机A的MAC地址,目的MAC地址是广播地址。
然后这个ARP请求帧在内网中被广播,当其他主机收到这个ARP请求帧时,会查验请求帧中的目的IP地址是否是自己的IP地址,不是的话就丢弃。是的话,该主机(如主机B)就响应这个ARP请求,把自己的MAC地址发送给主机A。这样源主机A就可以完成数据链路层的封装。
如果目的主机是其他子网的主机,如主机D。那么路由器1收到ARP请求后,会判断出主机B属于其他子网,然后路由器1把自己的MAC地址发送给主机A,主机A以后再给主机D发IP数据时,目的MAC封装的是路由器1的MAC地址。
主机给其他主机发送IP数据前,会用本机的子网掩码与目标地址进行与运算,确定目标主机的IP地址与本机的IP地址是不是在同一个网段中。如果不在同一个网段则将IP数据包转发到网关,如果主机并不知道网关地址,主机还会通过发送ARP请求获得网关的MAC地址。然后主机将网关的MAC地址作为目的MAC地址,将数据发送给网关(路由器上的一个端口)。
如果目的IP地址与源主机的IP地址在同一个网段,源主机会查看自身ARP缓存,如果在缓存中查找到对应主机的MAC地址,就用该MAC地址作为目的MAC地址将数据发送出去。如果未查到目的主机的MAC地址,则源主机通过ARP广播获取目的主机的MAC地址,然后将数据发送出去。
当网关路由器接收到以太网数据帧时,如果发现目的MAC地址是自己,就会解封IP层数据获取目的IP地址,然后通过路由表和路由算法获取下一跳路由器的地址,然后将下一跳路由器MAC地址作为数据链路层的目的MAC地址,自身MAC地址作为源MAC地址,将数据转发到下一跳路由器。下一跳路由器收到数据帧后,重复上一跳路由器的操作,直到某个路由器发现目的IP地址是本网络的主机,就会将数据转发给目的主机。
当网关发现目的MAC地址不是自己时,就会查询MAC转发表,如果查询到MAC地址对应的物理端口,就会通过该物理端口将数据转发出去,目的主机就可以收到源主机的数据。
所以IP数据在转发的过程中,网络层的源IP地址和目的IP地址是保持不变的(NAT和RNAT协议除外),改变的是源MAC地址和目的MAC地址(在同一子网中,MAC地址也是保持不变的,只有跨网络时MAC地址才会改变)。