keepMyselfClam
286 天前
首先呢你这里的配置缺少了一个关键信息,那就是每个网段子网掩码的长度。下面我们补充一个设定,就是 192.168.X.X 下面的子网掩码长度是 24 位的。
第二呢,路由器 a 和路由器 d 的这个网段是重复了。后面我们直接忽略路由器 d 和它下面的这个网段。
第三是,路由器 b 的这个设定的,一般来说一个路由器有多个接口,分别接到不同的网段。正确的描述应该是路由器 b 它有三个接口,一个接到广域网。所谓路由器 C 应该看做路由器 B 的另一个接口。
-
然后你需要知道每个机器自己的 IP,子网掩码长度和他的这个网关这三者之间的关系。
以 192.168.1.2 发包给 192.168.0.100 为例.
每个主机在往外发包的时候会根据自己的 IP 和子网掩码长度判断目标 IP 和自己 IP 是不是在同一个子网内。
如果在一个子网内,那么我要向外广播 arp 消息,询问目标 IP 的 mac 地址是多少,拿到目标 mac 地址之后填入包的二层地址。目标的 IP 填入三层地址,然后发包。
如果不在一个子网内,那么我要向外广播 ARP 消息询问网关的 mac 是多少。拿到网关的 MAC 之后填入包的二层地址。目标的 IP 填入三层地址,然后发包。在同一个子网内是由交换机负责转发数据包的。交换机只看二层的 mac 地址,它就会把这个包送到网关处。
网关路由器拿到了这个包之后,首先他检查 mac 是自己的,说明是它收的包,然后检查目标 IP 不是自己的,那他要把这个包转发出去。
网关路由器在转发包的时候需要有路由表,路由表即可以是静态配置,也可以由动态的路由协议去发现。这里网关会根据路由表发现我应该把这个包发给路由器 B 。
然后同样的他会用 arp 协议获取路由器 B 的 mac 地址。然后把路由器的 mac 地址填到二层的地址上,三层及上面的保持不变。
路由器 b 从广域网接口收到这个包之后,它会发现目标 IP 在自己的一个接口下面。这个时候他会发 arp 请求目标主机 IP 所对应的 mac 地址。收到 mac 地址后,把二层的 mac 换成目标主机的 mac 。送过去。
目标主机这样就会收到这个包了,此时他收到的 mac 地址是自己的,IP 地址是自己的。