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

269 天前
 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

5609 次点击
所在节点    Linux
64 条回复
zhyf2901
269 天前
@MozzieW 是写错了,目标 ip 是 116.153.22.2
wy315700
269 天前
@zhyf2901
ip 层或网络层没有端口
端口是 tcp 或者 UDP 上面的

你的路由器 AB 和路由器 C 其实是不同的东西。
路由器 AB 其实是网关。链接了你内网和外网并且进行了地址转换。
路由器 C 其实应该叫做三层交换机。

65535 个端口会不会不够用

现在都是对称 nat ,够用了。
gefranks
269 天前
如果我没理解错的话, 这个网络 A, B 里面都有 192.168.1.x 这个子网, 从机器 3 的包在回 1 的时候在 C 都会有问题, overlap 了.
以前 cisco press 有本书, ip addressing fundamentals 对 ipv4 这块讲的不错.
Cisco Packet Tracer 可以模拟.
proxytoworld
269 天前
如果发送的数据包不是自己的 IP ,会根据路由表查询,在自己路由表里面没有,则会发给默认路由,数据包到了路由器,路由器会查询自己的路由表,这个路由表根据各种算法来的。
Tumblr
269 天前
推荐 YouTube 的一个频道: https://www.youtube.com/@PowerCertAnimatedVideos

OP 提出的这个例子中,既涉及到了路由,也涉及到了地址转换,还是个相对比较复杂的场景,建议先从同一局域网下不同 subnet 的开始分析。
Cu635
269 天前
重修本科的网络基础课程吧。
royking930911
269 天前
Cisco Packet Tracer 模拟器跟一下就知道了
楼主这个拓扑图跟广域网没啥关系 机器 1 和 3 通信根本不会走到广域网上去
可以这么理解 路由 CD 相当于挂在路由 A 下面
机器 3 4 N 向机器 1 2 发数据这个很简单,直接数据包往网关地址丢就行了 路由器拆包以后发送到对应端口 因为下层网络是知道上层网络的出口地址的 就是内网网关
关键是机器 1 2 向 3 4 N 发数据
由于路由器 A 并不知道 192.168.0.0 这个子网的路径 需要在路由器 A 设置路由表 将 192.168.0.0 的数据丢到 192.168.1.2 这个地址
shilyx
269 天前
1 访问 3
情况 1 ,3 在自己的外网网关做端口映射
情况 2 ,3 在自己的外网网关那做 DNAT
情况 3 ,3 和 1 进行 udp 打洞
情况 4 、1 和 3 经 1 或 3 的外网或第三方加入一个 vpn
lcy630409
269 天前
就和邮局的系统一样,网络寻址 通俗讲很简单的
而且你的理解有问题,要分层次理解,不要放一起混淆
而且路由器 C 和 D 有问题,路由器 C 和 D 的 ip 应该是 B 网段的,才能联通,CD 的网关应该是 B

你说的这段网络层( ip 层)的流程就是:
机器 1 根据自身路由表 找 116.153.22.2 因为没有该路由 所以走默认路由(路由器 192.168.1.1 )
路由器 A 收到你的消息之后会在根据自身路由表找寻 116.153.22.2 ,没有的话 还是走默认路由 也就是运营商,一路找过去,一直抵达路由 B ,至此完成网络层的链接

在传输层来讲
在路由器 A 收到机器 1 的数据(访问 116.153.22.2:80 )的时候 路由器会记录机器 1 的发出端口(比如 6666 ),再根据自己的安全等级( nat 类型)来选择一个端口(比如 nat 为 full 那么出发端口同样是 6666 )发到 116.153.22.2 ,这就是 nat 映射表( 192.168.1.2:6666->116.153.22.1:6666 ),此时数据经过网络层的方法达到路由器 B
路由器 B 解析数据 发现有 nat 数据,就根据自身的映射表查找访问端口 6666 是否有记录,没有就找默认转发( DMZ ),DMZ 也没有就断开链接,有记录的话就转发到相应的 ip 上去,这个相应的 ip 如果还是路由类型 继续上述步骤,如果是最终终端 就根据自身端口是否打开来接不接数据
lcy630409
269 天前
再通俗一点 打个例子,ems 快递
什么 ARP 这些 接口层 你可以理解为现实中 你和本地邮局之间的物理路径,就是区你最近的邮局的路
ip 网络层 可以理解为你的地址 门牌号,能让本地邮局的快递员找到你
UDP TCP 传输层 可以理解为信封 信封上写着地址和包裹着内部数据 , 在快递员把信封给你的时候 你知道要给谁(收件人是你家谁)
http dns 这类 应用层 就是内部数据,最终收件人拿到信封 拆开后 看了信件内容 才能知道对方发了个啥 再根据自身的功能回啥信
kalinzhang
269 天前
之前上网络课程有一个 lab 就是做的路由,如果想动手的话推荐一个小软件 https://mininet.org/;可以本机搭一个虚拟网络,跑几个现成的小 server 然后 traceroute 看一看
evill
269 天前
可以看看 calico 的 IPIP ,讲解的很清晰
cybort
269 天前
我理解楼主不是要问不同网段的机器怎么通信,而是没有公网 ip 的机器怎么通信。其实本来是不可以的,因为有了 NAT 把局域网上的机器视作公网出入口的机器的一个应用,才能相互通信,但这都属于是补丁,你自己做个私有协议也可以实现。
ben666
269 天前
1. 同一个子网内的主机可以通过 ARP 寻址,直接通讯
2. 跨子网,需要先把报文发给网关(可以是路由器、交换机等网络设备),网关再转出去

抓包分析一下有助于理解,如果能读 C 代码,可以直接看看这部分协议栈代码
dperf 测试仪的协议栈比较简洁,可以看看 ARP 、ICMP 、UDP 是怎么实现的
https://github.com/baidu/dperf
shoco
269 天前
上课没好好听
goodryb
269 天前
简单看了下,你是 2 层、3 层混在一起,你都提到子网,那就好好看 3 层路由转发的逻辑,跟 mac 、arp 没啥关系

本机有路由表、 路由器也有路由表,都是按照路由表来转发的
zhaoxiaofeng
269 天前
基础有点差,可以先搜下二三层转发,把流程弄清
xwwsxp
269 天前
EvanQu
269 天前
https://sspai.com/post/64634
可以看下 一共 7 篇
小白也能看懂的网络基础 由浅到深
zchyit
269 天前
1 、机器 1 在 TCP/IP 层判断与机器 3 不在同一子网,于是将数据包转发给默认网关(即路由器 A ,机器 1 通过 ARP 获取默认网关的 MAC ,并填充到报文中,此时源目 IP 分别是 192.168.1.2 和 116.153.22.2 )。
2 、默认网关(路由器 A )收到报文,发现目的 MAC 是自己,于是收下,转交 TCP/IP 层处理。默认网关(路由器 A )发现目的 IP 在不同子网,同样转发给自己的默认网关 116.153.22.X ,并做 NAT 地址转换(此时源目 IP 分别是 116.153.22.1 和 116.153.22.2 ),接下来过程在 ISP 内部,我们快进到路由器 B 的上一跳。
3 、此时报文到达路由器 B ,需要根据 IP 和端口做 NAT 地址转换(此时源目 IP 分别是 116.153.22.1 和 192.168.0.100 ),转发到机器 3 (这里只考虑这是一次正常的回包,如果机器 1 是首次通信,还涉及内网穿透知识,背景不详,不作展开)。

依稀记得是这样的,可能有一些细节没提到。

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

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

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

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

© 2021 V2EX