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

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

5607 次点击
所在节点    Linux
64 条回复
twl007
269 天前
有路由表 一级一级找下去 直到最后发给路由器 B 然后由 B 发送给 C

实际更复杂 建议先去了解一下各种路由交换协议 对路由器之间怎么交换信息先有个了结

问题不是怎么找到 C 而是路由器之间如何交换信息来知道 C 在哪里
defunct9
269 天前
说来话长。放弃
luoyide2010
269 天前
跨网段通信主要靠路由,能不能找到路由器 C ,就得看双方路由表有没有到达目的地的路由

流程大概是这样的(有点久没接触,不一定全对):

机器 1 发现是跨网段的,而且自己路由表没用到机器 3 的路由,就会获取网关 MAC 地址,构建数据包发给路由器 A ,让路由器 A 处理这个数据包(如果有机器 3 有到目的地的路由,就发给路由表中的 下一跳地址,让下一跳处理)

数据包到达路由器 A ,路由器查找自己的路由表,如果路由器有相关网段的路由,就发给该路由的下一跳,没有则发给默认网关处理。

循环上面步骤,找到目标就能通信,找不到就没法通信
SWALLOWW
269 天前
我也不熟,但是路由起和路由器之间会通过 bgp 或者 ospf 之类的协议构建路由表,然后 A 就知道 B 了,B 自己再发给内部的路由
wy315700
269 天前
机器 1 和 3 因为处在两个不相连的私网里,所以无法直接通讯,需要机器 3 在路由器 B 上面做一个端口映射。

连接过程是
1. 机器 1:构造 ip 报文, 源 ip:192.168.1.2 目标 ip:116.153.22.2
2. 机器 1 在路由表里没有发现这个包的路由,于是把包发给网关 192.168.1.1 。也就是路由器 1
3. 路由器 1 寻找路由表,经过广域网把包发给路由器 B 。
4. 路由器 B 寻找端口映射表,发现这个包要转发给机器 3 ,但是机器 3 和路由器 B 不在一个网段内,于是寻找路由表发现 192.168.0.100 的下一级节点是路由器 C ,于是把包交给路由器 C 。
5. 路由器 C 经过 arp 协议,寻找 机器 3 的 mac 地址,把包发给机器 3.
zhangsanfeng2012
269 天前
实际上机器 1 和机器 3 是不能直接通信的
dog82
269 天前
我的网络知识极度匮乏,我只知道局域网内不要 ip ,直接在数据链路层通信就行;跨网段就得配 IP 走网络层了
EchoWhale
269 天前
机器 3 和机器 1 在不同的广域网下.
如果能直接通信的话, 就不用费那么大劲要公网 ip 了
me1onsoda
269 天前
还有端口,你数据包里没提到。定位到机器 3 是路由器 B 的工作,内部有一种端口和 mac 地址的映射表,比如机器 3 暴露 8080 端口,路由器 B 就记录 23333:机器 3 的 mac 地址,端口 8080 。机器 1 的目的端口就是 23333 ,路由器 B 收到 23333 端口数据就转给机器 3 的 8080 端口
EchoWhale
269 天前
你第一步就错了吧.
1. 机器 1(192.168.1.2)构造 ip 报文, 目标地址应该是机器 3(192.168.0.100)
2. 机器 1 的网关发现目标是个保留地址, 丢掉
luzemin
269 天前
正好之前写过这么一篇很切题的 https://www.cnblogs.com/talentzemin/p/17616090.html
可以看看
f6x
269 天前
吾有一神物可解君愁, 名曰:traceroute
qingcheng
269 天前
首先提问的结构部门不明确,机器 1 和路由器 C 有着相同的内网 IP 和网关(机器 2 和路由器 D 同理)

那么对结构有以下猜测:
路由器 A 与路由器 B 的局域网 IP 地址、网关地址相同,通过广域网互相访问,不能通过内网直接访问

基于上述的猜测,仅当机器 1 和机器 3 之间进行了 NAT 穿透或路由器配置了转发规则的情况下可以通讯:

1. 机器 1 和 机器 3 通过穿透在路由器上打开映射端口
2. 机器 1 请求访问 路由器 B (广域网 ip:116.153.22.2 )对应的端口,不在本地转发表内,丢给默认网关路由器 A
3. 路由器 A 把数据法送给它的默认网关(广域网不应该是局域网)
4. 路由器 B 收到广域网网关发送的数据,根据转发规则和端口号将数据转发给机器 3
zhyf2901
269 天前
@me1onsoda
@wy315700
网络层数据包有端口的话,我感觉稍稍好理解一些了, 但引申出几个问题
1 、ip 层或网络层有端口的概念吗,貌似看网上各种资料都说端口是 tcp 层的概念
2 、如果要在路由器映射到子网机器的端口, 那端口数量是不是有限的, 如果子网机器多,或者是机器本身开放端口比较多,65535 个端口会不会不够用
me1onsoda
269 天前
@EchoWhale #10 目的地址是个内网 ip ,你觉得路由器该怎么做转发
EchoWhale
269 天前
@me1onsoda 我觉得路由器应该丢掉这个包.
sentinelK
269 天前
“如果机器 1 和机器 3 首次通信,流程是什么样的。。”

答:在既有网络结构,且不借助其他手段的前提下(设置转发,或者中转服务等),不能通信。

你可以把内网地址,理解成你的“门牌号”。外网地址,理解为小区地址。
机器 1 只知道机器 3 住在 1001 ,他是不可能找到机器 3 的。

所以:
要么需要在路由器 B 、C 进行转发设置。同时改变机器 1 的请求位置。
要么做一个转发服务,机器 1 和 3 都面向 server 通信。
xzysaber
269 天前
少了一些流程吧。
并且"机器 1:arp 协议,寻找目标 ip 的 mac 地址,找到路由器 B mac",这里应该是找到路由器 A 的 MAC 。
MozzieW
269 天前
你的理解是对的,少的那部分不会是因为那个属于额外的知识:内网穿透、端口转发
1. 192.168 段是内网(局域网),你已经知道机器 1 构造的时候要用广域网 IP 了。第一步的 目标 IP 应该是 116.153.22.2 (路由器 B ),应该是写错了?
2. 路由器 B 收到的是来自路由器 A 的请求,它并不知道 机器 1.假设我们请求的端口是 8080 ,路由器 B 也不会处理这个请求,因为它上面没有提供这个端口的服务。
3. 目的是机器 3 收到,那么这个信息要给路由器 B 知道。所以需要在路由器 B 上配置端口转发,这样路由器 B 能把来自 8080 端口请求转发给 机器 3. 这个逻辑要不要在路由器 C 上配置呢?我理解还有看路由器 B 和路由器 C 之间的配置(超纲了,我不会)
4. 对路由器 B 而言,它一直和路由器 A 交流;路由器 A 也只和路由器 B 交流。至于机器 1 和机器 3 ,是路由器内部根据不同端口做了转发。
hxysnail
269 天前
主机和路由的工作流程都一样:

1. 从 IP 包中取出目的地址,然后查询路由表,看下一跳的地址 N 是什么?
2. 接下来,通过数据链路层,把 IP 包发给下一跳 N ,步骤如下:
- 执行 ARP 协议,查询下一跳 N 的 mac 地址;
- 封装数据链路层帧,将 IP 包发给下一跳,目的 mac 地址是上一步通过 ARP 协议查询到的。

具体可以参考这篇文章: https://fasionchan.com/network/ip/routing/

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

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

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

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

© 2021 V2EX