问题:子网 A 的机器如果向子网 B 机器发送数据
网络结构
路由器 A (广域网 ip:116.153.22.1 )
路由器 B (广域网 ip:116.153.22.2 )
如果机器 1 和机器 3 首次通信,流程是什么样的。。
我理解的流程:
已阅读资料: https://cloud.tencent.com/developer/article/1173761 https://blog.csdn.net/qq_42911741/article/details/132514748
1
twl007 238 天前 via iPhone
有路由表 一级一级找下去 直到最后发给路由器 B 然后由 B 发送给 C
实际更复杂 建议先去了解一下各种路由交换协议 对路由器之间怎么交换信息先有个了结 问题不是怎么找到 C 而是路由器之间如何交换信息来知道 C 在哪里 |
2
defunct9 238 天前
说来话长。放弃
|
3
luoyide2010 238 天前
跨网段通信主要靠路由,能不能找到路由器 C ,就得看双方路由表有没有到达目的地的路由
流程大概是这样的(有点久没接触,不一定全对): 机器 1 发现是跨网段的,而且自己路由表没用到机器 3 的路由,就会获取网关 MAC 地址,构建数据包发给路由器 A ,让路由器 A 处理这个数据包(如果有机器 3 有到目的地的路由,就发给路由表中的 下一跳地址,让下一跳处理) 数据包到达路由器 A ,路由器查找自己的路由表,如果路由器有相关网段的路由,就发给该路由的下一跳,没有则发给默认网关处理。 循环上面步骤,找到目标就能通信,找不到就没法通信 |
4
SWALLOWW 238 天前
我也不熟,但是路由起和路由器之间会通过 bgp 或者 ospf 之类的协议构建路由表,然后 A 就知道 B 了,B 自己再发给内部的路由
|
5
wy315700 238 天前 2
机器 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. |
6
zhangsanfeng2012 238 天前
实际上机器 1 和机器 3 是不能直接通信的
|
7
dog82 238 天前
我的网络知识极度匮乏,我只知道局域网内不要 ip ,直接在数据链路层通信就行;跨网段就得配 IP 走网络层了
|
8
EchoWhale 238 天前
机器 3 和机器 1 在不同的广域网下.
如果能直接通信的话, 就不用费那么大劲要公网 ip 了 |
9
me1onsoda 238 天前
还有端口,你数据包里没提到。定位到机器 3 是路由器 B 的工作,内部有一种端口和 mac 地址的映射表,比如机器 3 暴露 8080 端口,路由器 B 就记录 23333:机器 3 的 mac 地址,端口 8080 。机器 1 的目的端口就是 23333 ,路由器 B 收到 23333 端口数据就转给机器 3 的 8080 端口
|
10
EchoWhale 238 天前
你第一步就错了吧.
1. 机器 1(192.168.1.2)构造 ip 报文, 目标地址应该是机器 3(192.168.0.100) 2. 机器 1 的网关发现目标是个保留地址, 丢掉 |
11
luzemin 238 天前 2
正好之前写过这么一篇很切题的 https://www.cnblogs.com/talentzemin/p/17616090.html
可以看看 |
12
f6x 238 天前 1
吾有一神物可解君愁, 名曰:traceroute
|
13
qingcheng 238 天前
首先提问的结构部门不明确,机器 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 |
14
zhyf2901 OP |
17
sentinelK 238 天前
“如果机器 1 和机器 3 首次通信,流程是什么样的。。”
答:在既有网络结构,且不借助其他手段的前提下(设置转发,或者中转服务等),不能通信。 你可以把内网地址,理解成你的“门牌号”。外网地址,理解为小区地址。 机器 1 只知道机器 3 住在 1001 ,他是不可能找到机器 3 的。 所以: 要么需要在路由器 B 、C 进行转发设置。同时改变机器 1 的请求位置。 要么做一个转发服务,机器 1 和 3 都面向 server 通信。 |
18
xzysaber 238 天前
少了一些流程吧。
并且"机器 1:arp 协议,寻找目标 ip 的 mac 地址,找到路由器 B mac",这里应该是找到路由器 A 的 MAC 。 |
19
MozzieW 238 天前
你的理解是对的,少的那部分不会是因为那个属于额外的知识:内网穿透、端口转发
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 ,是路由器内部根据不同端口做了转发。 |
20
hxysnail 238 天前
主机和路由的工作流程都一样:
1. 从 IP 包中取出目的地址,然后查询路由表,看下一跳的地址 N 是什么? 2. 接下来,通过数据链路层,把 IP 包发给下一跳 N ,步骤如下: - 执行 ARP 协议,查询下一跳 N 的 mac 地址; - 封装数据链路层帧,将 IP 包发给下一跳,目的 mac 地址是上一步通过 ARP 协议查询到的。 具体可以参考这篇文章: https://fasionchan.com/network/ip/routing/ |
22
wy315700 238 天前 2
@zhyf2901
ip 层或网络层没有端口 端口是 tcp 或者 UDP 上面的 你的路由器 AB 和路由器 C 其实是不同的东西。 路由器 AB 其实是网关。链接了你内网和外网并且进行了地址转换。 路由器 C 其实应该叫做三层交换机。 65535 个端口会不会不够用 现在都是对称 nat ,够用了。 |
23
gefranks 238 天前
如果我没理解错的话, 这个网络 A, B 里面都有 192.168.1.x 这个子网, 从机器 3 的包在回 1 的时候在 C 都会有问题, overlap 了.
以前 cisco press 有本书, ip addressing fundamentals 对 ipv4 这块讲的不错. Cisco Packet Tracer 可以模拟. |
24
proxytoworld 238 天前
如果发送的数据包不是自己的 IP ,会根据路由表查询,在自己路由表里面没有,则会发给默认路由,数据包到了路由器,路由器会查询自己的路由表,这个路由表根据各种算法来的。
|
25
Tumblr 238 天前
推荐 YouTube 的一个频道: https://www.youtube.com/@PowerCertAnimatedVideos
OP 提出的这个例子中,既涉及到了路由,也涉及到了地址转换,还是个相对比较复杂的场景,建议先从同一局域网下不同 subnet 的开始分析。 |
26
Cu635 238 天前
重修本科的网络基础课程吧。
|
27
royking930911 238 天前
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 这个地址 |
28
shilyx 238 天前
1 访问 3
情况 1 ,3 在自己的外网网关做端口映射 情况 2 ,3 在自己的外网网关那做 DNAT 情况 3 ,3 和 1 进行 udp 打洞 情况 4 、1 和 3 经 1 或 3 的外网或第三方加入一个 vpn |
29
lcy630409 238 天前
就和邮局的系统一样,网络寻址 通俗讲很简单的
而且你的理解有问题,要分层次理解,不要放一起混淆 而且路由器 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 如果还是路由类型 继续上述步骤,如果是最终终端 就根据自身端口是否打开来接不接数据 |
30
lcy630409 238 天前
再通俗一点 打个例子,ems 快递
什么 ARP 这些 接口层 你可以理解为现实中 你和本地邮局之间的物理路径,就是区你最近的邮局的路 ip 网络层 可以理解为你的地址 门牌号,能让本地邮局的快递员找到你 UDP TCP 传输层 可以理解为信封 信封上写着地址和包裹着内部数据 , 在快递员把信封给你的时候 你知道要给谁(收件人是你家谁) http dns 这类 应用层 就是内部数据,最终收件人拿到信封 拆开后 看了信件内容 才能知道对方发了个啥 再根据自身的功能回啥信 |
31
kalinzhang 238 天前
之前上网络课程有一个 lab 就是做的路由,如果想动手的话推荐一个小软件 https://mininet.org/;可以本机搭一个虚拟网络,跑几个现成的小 server 然后 traceroute 看一看
|
32
evill 238 天前
可以看看 calico 的 IPIP ,讲解的很清晰
|
33
cybort 238 天前 via Android
我理解楼主不是要问不同网段的机器怎么通信,而是没有公网 ip 的机器怎么通信。其实本来是不可以的,因为有了 NAT 把局域网上的机器视作公网出入口的机器的一个应用,才能相互通信,但这都属于是补丁,你自己做个私有协议也可以实现。
|
34
ben666 238 天前
1. 同一个子网内的主机可以通过 ARP 寻址,直接通讯
2. 跨子网,需要先把报文发给网关(可以是路由器、交换机等网络设备),网关再转出去 抓包分析一下有助于理解,如果能读 C 代码,可以直接看看这部分协议栈代码 dperf 测试仪的协议栈比较简洁,可以看看 ARP 、ICMP 、UDP 是怎么实现的 https://github.com/baidu/dperf |
35
shoco 238 天前
上课没好好听
|
36
goodryb 238 天前
简单看了下,你是 2 层、3 层混在一起,你都提到子网,那就好好看 3 层路由转发的逻辑,跟 mac 、arp 没啥关系
本机有路由表、 路由器也有路由表,都是按照路由表来转发的 |
37
zhaoxiaofeng 238 天前
基础有点差,可以先搜下二三层转发,把流程弄清
|
38
xwwsxp 238 天前
|
39
EvanQu 238 天前
|
40
zchyit 238 天前
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 是首次通信,还涉及内网穿透知识,背景不详,不作展开)。 依稀记得是这样的,可能有一些细节没提到。 |
41
nekoneko 238 天前
这俩没法通信, 通信的前提是一方是在广域网上内被找到的.
所以需要内网穿透 |
43
wanguorui123 238 天前
先得学习 NAT 协议,然后了解下 TCP 打洞原理
|
44
IDAEngine 238 天前
网关都不一样,不能通信,除非搭建 VPN 让机器在同一个子网,比如用 ZeroTier/LogMeIn/TailScale 这些
|
47
dode 238 天前
每一台网络设备都会查看数据包是不是发给本网络下的对端设备,不是的话数据包就会发送给这个设备的默认路由
每一个网关路由设备会保存当前网络和其它网络 TCP&UDB 会话列表,记录网络连接状态 |
48
tool2d 238 天前
你这情况比较特殊,需要自己手动构造路由表,估计要上软路由。
普通路由器都会限制 WAN 主动传入流量,甚至会主动 DROP WAN 端口的向内流量。一般都是 LAN 向外传,你需求是刚好相反的。 需要外网主动向内网发起访问。 |
49
FaiChou 238 天前
不良林这视频讲的挺详细的, 属于保存下来隔段时间就刷一遍的网络通讯:
|
50
shermie 238 天前
我曾经和你有一模一样的疑问,也想过那岂不是一个局域网下最多只能有 65535 个端口映射,后面看了一些书似懂非懂的,但是核心就是 ip:port 做路由映射,看那个日本人写的《网络是怎么样连接的》这本书,比较容易理解
|
51
leconio 238 天前 via iPhone
[路由器是如何路由的?(上集)-哔哩哔哩] https://b23.tv/qhvbWWQ
之前看过一个视频,讲的挺好的 |
52
Shinglee 238 天前
上面的推荐的不良林视频,建议你先看看。感觉你的整个思路都有问题。
|
53
feaul 238 天前
@wy315700 说的不错,因为在不同的私网里,并且私网路由无法在公网上传播,
首先先把 3 的端口映射出来。在 B 上做 C 的映射,在 C 上做 3 的映射,这样就是 1 直接访问 B 了, 1 ,机器 1 源 ip:192.168.1.2 目标 ip:116.153.22.2 发现是跨网段的,直接转发给网关 2 ,路由器 A 做源 NAT 把源地址更换 源 ip:116.153.22.1 目标 ip:116.153.22.2 3 ,路由器 B 查找映射表 做目的 NAT 把目的地址更换 源 ip:116.153.22.1 目标 ip:192.168.1.2 4. 路由器 C 查找映射表 做目的 NAT 把目的地址更换 源 ip:116.153.22.1 目标 ip:192.168.0.100 |
54
cdlnls 238 天前
1. 一个很常见的误区,家用”路由器“它不是书里面提到的”路由“器,它就是一个 ”NAT 设备“+”二层交换机“的二合一设备。
2. 真正的路由器 它只负责转发数据包,即“路由”。进过它的包进去是啥,出去还是啥。 3. 虚假的路由器(家用路由器/光猫),它看上去在“路由”,实际上背地里在做 NAT 地址转换。 两个不能混在一起谈。 |
55
Songxwn 238 天前
不同子网的机器,是扔给网关的,二层 MAC 地址是网关的。
|
57
julyclyde 238 天前
首先要理解:
冲突域、数据链路层 访问控制子层 广播域、网络层 这两组关系 |
58
smallfount 238 天前
你不能理解是因为你一上来就错了啊。。。
机器本身也会带路由表。。。 你的目标在本地带的明细路由不存在的情况下。。 机器的路由表会把你的包丢去默认路由指向的 IP, 也就是网卡的网关地址。 这时候 MAC 就不在有太大的作用了。。。数据包进到网关 IP 后就会根据路由设备的路由表转发流量 如果有 NAT 就映射地址。。没 NAT 就直接根据目标出去。 公网地址大部分都是默认路由出去了就。。 |
59
zhyf2901 OP 多谢大家,给了很多思路和学习资料,暂时看不完,感觉要补的课有点多,我去回炉重造一下。
|
61
jonathan11 238 天前 via Android
首先两个路由器直接是有 NAT 的,可以把内网地址跟外网地址进行映射,ping 的时候是 icmp 协议,没有端口,但是有个字段会代替端口的作用。
这里的一跟三是没办法 ping 通的,因为他们都在 NAT 之下,但是三可以通过 Nat 将自身端口映射到路由器 B ,达成一通过映射表达成访问三的端口(这里的一访问的是路由器 B 的 IP 地址) 如果不考虑 NAT ,路由器上面应该是有所有的路由,一发的包,目的 IP 是三,但是目的 MAC 会是路由器,因为跨网段会先通过网关查找路由表,然后在路由器 A 拆包发现 ip 地址不是自己,往路由器 B 发送。路由器 B 发现直连有同网段路由表,通过 arp 表,将目的 mac 换成三的 mac ,三收到后发现 ip 也是自己的,就开始准备回复,过程同理。 |
62
keepMyselfClam 238 天前
首先呢你这里的配置缺少了一个关键信息,那就是每个网段子网掩码的长度。下面我们补充一个设定,就是 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 地址是自己的。 |
63
xumng123 237 天前 via iPhone
子网之间走路由
|
64
snoBall 237 天前 via Android
我想机器 1 和 3 应该是无法互相发现的,因为两个用的都是保留的局域网地址,机器 1 如果构造目的地址为 192.168.0.100 的包,在送到路由器 A 的时候路由器发现其连接的网络中没有 192.168.0.x/24 ,不会把包向公网发送,就把包丢弃通知机器 1 目标不可达。所以如果机器 1,3 之间想要通信要么拥有公网 ip ,要么使用 nat 技术,毕竟通信需要做到先发现再通信。
|