提问:最近学习网络层协议,一直不理解不同子网的机器如何通信,请大佬指教

287 天前
 zhyf2901

问题:子网 A 的机器如果向子网 B 机器发送数据

网络结构

如果机器 1 和机器 3 首次通信,流程是什么样的。。

我理解的流程:

  1. 机器 1:构造 ip 报文, 源 ip:192.168.1.2 目标 ip:116.153.22.1
  2. 机器 1:arp 协议,寻找目标 ip 的 mac 地址,找到路由器 B mac
  3. 机器 1:构造数据包 发送到路由器 A ,
    • 源 mac:机器 1
    • 目标 mac:路由器 B
    • 源 ip:192.168.1.2
    • 目标 ip:116.153.22.1
  4. 路由器 A: 到这里就理解不了了,已知的数据包内容完全定位不到 机器 3 ,甚至定位不到路由器 C

已阅读资料: https://cloud.tencent.com/developer/article/1173761 https://blog.csdn.net/qq_42911741/article/details/132514748

5674 次点击
所在节点    Linux
64 条回复
jonathan11
286 天前
首先两个路由器直接是有 NAT 的,可以把内网地址跟外网地址进行映射,ping 的时候是 icmp 协议,没有端口,但是有个字段会代替端口的作用。
这里的一跟三是没办法 ping 通的,因为他们都在 NAT 之下,但是三可以通过 Nat 将自身端口映射到路由器 B ,达成一通过映射表达成访问三的端口(这里的一访问的是路由器 B 的 IP 地址)
如果不考虑 NAT ,路由器上面应该是有所有的路由,一发的包,目的 IP 是三,但是目的 MAC 会是路由器,因为跨网段会先通过网关查找路由表,然后在路由器 A 拆包发现 ip 地址不是自己,往路由器 B 发送。路由器 B 发现直连有同网段路由表,通过 arp 表,将目的 mac 换成三的 mac ,三收到后发现 ip 也是自己的,就开始准备回复,过程同理。
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 地址是自己的。
xumng123
286 天前
子网之间走路由
snoBall
286 天前
我想机器 1 和 3 应该是无法互相发现的,因为两个用的都是保留的局域网地址,机器 1 如果构造目的地址为 192.168.0.100 的包,在送到路由器 A 的时候路由器发现其连接的网络中没有 192.168.0.x/24 ,不会把包向公网发送,就把包丢弃通知机器 1 目标不可达。所以如果机器 1,3 之间想要通信要么拥有公网 ip ,要么使用 nat 技术,毕竟通信需要做到先发现再通信。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1027635

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX