![尝试理解 IP 数据包流](https://linux22.com/image/1416645/%E5%B0%9D%E8%AF%95%E7%90%86%E8%A7%A3%20IP%20%E6%95%B0%E6%8D%AE%E5%8C%85%E6%B5%81.png)
所以我很难理解数据包是如何从一台机器传输到另一台机器的。下面我给出了一个计算机 1 尝试连接到计算机 2 的示例。
Computer 1
IP: 192.168.1.11
Subnet: 255.255.255.0
Default Gateway: 192.168.1.1
MAC: 00:00:00:00:00:aa
Router 1
IP: 192.168.1.1
Subnet: 255.255.255.0
MAC: 00:00:00:00:00:bb
Router 2
IP: 192.168.2.1
Subnet: 255.255.255.0
MAC: 00:00:00:00:00:cc
Computer 2
IP: 192.168.2.1
Subnet: 255.255.255.0
Default Gateway: 192.168.2.12
MAC: 00:00:00:00:00:dd
如果我从计算机 1 连接到计算机 2 并跟踪数据包的流动,我相信信息离开路由器 2 的源地址将是 192.168.1.2,源 MAC 地址将是 00:00:00:00:00:cc。据我所知,目的地保持不变,但源将在其路径中更新。这是正确的还是我遗漏了什么?
答案1
呼。考虑到您的情况,这个问题有点棘手。
首先,路由器 2 不应该与路由器 1 共享位于其客户端接口上的接口。
在您的示例中,所有 4 台设备共享同一个 LAN 段,顺便说一下,该段位于 192.168.xy 系列的不可路由(编辑:跨“Internet”)IP 地址范围内。
更好的方法是这么想:
Computer 1
IP: 192.168.1.100
Subnet: 255.255.255.0
Default Gateway: 192.168.1.1
MAC: 03:00:00:00:00:11
Router 1
IP: 192.168.1.1
Subnet: 255.255.255.0
MAC: 03:00:00:00:00:22
IP: 192.168.12.1
Subnet: 255.255.255.0
MAC: 03:00:00:00:00:33
Router 2
IP: 192.168.12.2
Subnet: 255.255.255.0
MAC: 03:00:00:00:00:44
IP: 192.168.2.1
Subnet: 255.255.255.0
MAC: 03:00:00:00:00:55
Computer 2
IP: 192.168.2.200
Subnet: 255.255.255.0
Default Gateway: 192.168.2.1
MAC: 03:00:00:00:00:66
忽略 MAC 以 03 十六进制字符开头的事实,这只是为了确保网络势利者的正确性。[编辑] 我必须将其修改为 0x03,以便它既是本地分配的又是全局唯一的。
所以这里发生的情况是:计算机 1 有一根电缆插入路由器 1。这两个共享 192.168.1.x 网络。路由器 1 有一根电缆连接到路由器 2。它们共享 192.168.12.x 网络。路由器 2 有一根电缆连接到计算机 2。它们共享 192.168.2.x 网络。
在您最初的描述中,所有 4 台设备都必须连接到同一个交换机才能工作……在这种情况下,计算机 1 将直接与计算机 2 通信。注意:对于网络奇才,我知道您可以执行静态路由来强制原始网络配置工作,但这不是该用户所问的……
现在来讨论您的具体问题。
您说对了一半。计算机 2 看到的 MAC 地址是路由器 2 的 MAC 地址。在我的示例中,该地址是 MAC 03:00:00:00:00:55。但是,它看到的 IP 地址是计算机 1 的 IP 地址。这就是计算机 2 可以回复计算机 1 的方式。从理论上讲,IP 地址是“全球唯一的”。
根据您的知识水平,网络的工作方式是第 2 层(数据链路/MAC 层 - 在全以太网/IPv4 环境中)地址逐跳更改。逐跳定义为“经过任何第 3 层处理设备”。路由器和计算机几乎总是处理第 3 层。交换机可以处理第 3 层,但它们往往不处理它。
因此,当消息从计算机 1 传输到计算机 2 时,流程如下:
在 HOP 1 处 - 计算机 1 和路由器 1 之间
SourceIP: 192.168.1.100 (Computer 1)
SourceMAC: 03:00:00:00:00:11 (Computer 1)
DestIP: 192.168.2.200 (Computer 2)
DestMAC: 03:00:00:00:00:22 (Router 1 - Interface facing Computer 1)
第 2 跳 - 路由器之间
SourceIP: 192.168.1.100 (Computer 1)
SourceMAC: 03:00:00:00:00:33 (Router 1 - Interface facing Router 2)
DestIP: 192.168.2.200 (Computer 2)
DestMAC: 03:00:00:00:00:44 (Router 2 - Interface facing Router 1)
在 HOP 3 处 - 路由器 2 和计算机 2 之间
SourceIP: 192.168.1.100 (Computer 1)
SourceMAC: 03:00:00:00:00:55 (Router 2 - Interface facing Computer 2)
DestIP: 192.168.2.200 (Computer 2)
DestMAC: 03:00:00:00:00:66 (Computer 2)
所以您会看到,IP 地址层(第 3 层)地址在整个通信过程中保持不变,但数据链路层(第 2 层)地址每次涉及另一个处理第 3 层地址的设备时都会发生变化。
希望对您有所帮助。如果仍然感到困惑,请随时回复,我会尝试解释您觉得有挑战性的特定子集。
答案2
你的例子有缺陷。(我看到你编辑了它,但它仍然有缺陷。)
在您的示例中,路由器 1 和 2 位于同一子网(即它们具有相同的子网掩码)。因此,计算机 1 不会从默认网关发送任何内容,它只会将数据包从 NIC 中丢弃,并期望交换机或介质将其发送到计算机 2。
现在,如果将路由器 2 和计算机 2 更改为如下形式:
Router 2
IP: 192.168.2.2
和
Computer 2
IP: 192.168.2.12
[编辑昵称以粗体显示] 然后路由器 2 和计算机 2 将打开(他们有自己的独立子网, 不是:)单独的子网,这个例子就会开始变得更有意义了。
但是,由于您没有提供图表,我在这里假设您希望流量以这种方式移动:
计算机 1 <-> 路由器 1 <-> 路由器 2 <-> 计算机 2
路由器 1 和路由器 2 不能位于同一子网中,否则无法正常工作。实际上,它们之间会存在第三个网络,它们之间会交换流量。(默认路由引用私有网络也有点奇怪,通常是指“Internet”,但肯定是可能的。)
以下是我猜测您要做的事情,对于图片的粗糙,我深表歉意:
MAC 地址不会在路由器之外传播。计算机 1 想要向计算机 2 发送数据包。计算机 2 不在同一子网中,因此计算机 1 将其发送到默认网关。
这最终是一个从计算机 1 的 MAC 发送到路由器 1 的 MAC 的帧。
路由器转发数据包,转发意味着从不同的接口复制。因此,路由器 1 将看到它从计算机 1 获得的数据包的目的地是计算机 2。(在这种情况下,必须使用静态路由进行编程或使用 RIP/OSPF 等协议才能知道这一点。)
因此,IP 数据包现在具有路由器 1 的第二个 NIC 的源 MAC 和路由器 2 的第一个 NIC 的目标 MAC。依此类推,直到到达计算机 2。
答案3
你说对了一半,MAC 地址随着每次跳跃而改变,但是连接的 IP 地址不会改变,除非有内联 NAT/PAT 技术,或者正在使用应用程序代理。
请注意,我认为 computer2 的地址应该是 192.168.2.12,而不是 1.12。这意味着您的数据包根本不会经过 router2。我认为您正在寻找类似的东西:
Computer 1
IP: 192.168.1.11
Subnet: 255.255.255.0
Default Gateway: 192.168.1.1
MAC: 00:00:00:00:00:aa
Router 1
LAN IP: 192.168.1.1
Subnet: 255.255.255.0
MAC: 00:00:00:00:00:bb
WAN IP: 192.168.3.1
Subnet: 255.255.255.0
MAC: 00:00:00:00:00:b1
Router 2
LAN IP: 192.168.2.2
Subnet: 255.255.255.0
MAC: 00:00:00:00:00:cc
WAN IP: 192.168.3.2
Subnet: 255.255.255.0
MAC: 00:00:00:00:00:c1
Computer 2
IP: 192.168.2.12
Subnet: 255.255.255.0
Default Gateway: 192.168.2.2
MAC: 00:00:00:00:00:dd
所以我们有三个网络,计算机 1 所在的局域网 (.1.X)、两个路由器之间的网络 (.3.X) 以及计算机 2 所在的局域网 (.2.X)。
MAC 地址用于寻址帧,因此它们与每个 LAN 的实现相关。您可以使用 mac 地址 ::aa 在 Computer1 和 Router1 所连接的网络上发送帧,但如果您尝试在此 LAN 上将帧发送到 ::dd,它将无法到达目的地。因此,mac 地址仅适用于承载具有该 MAC 的设备的网络。
但是,IP 地址是在网络之间传递的,因此它保持不变。数据包每次经过路由器时都会重新封装在新的帧中,但 IP 数据包本身保持不变。这很重要,因为如果您的场景中的 Computer2 收到来自 192.168.1.1 的带有 MAC ::cc 的数据包,它将无法分辨该数据包不是来自路由器,并且当 computer2 响应时,router2 不知道它是在响应谁。
因此,computer2接收的数据包的源IP为192.168.1.11,但MAC地址为::cc。
NAT/PAT 使这变得有点令人困惑,因为需要更多信息来做出源/目的地决策,所以请记住,使用真实家用路由器的场景会更完整一些。
答案4
哎哟。路由器不会只有一个 IP。我建议阅读 Wendell Odom 的“网络第一步”。
您写道“据我所知,目的地保持不变,但源会在经过其路径时进行更新。”
你在说什么不清楚。你写的不多,而且你写的那一点点都是模棱两可的。如果你写不清楚,你就无法清楚地理解。
不要只说“源”和“目标”。请具体说明您指的是源 IP 地址、源 MAC 地址、目标 IP 地址还是目标 MAC 地址。
源 IP 和目标 IP 将保持不变。(除非存在 NAT 或某些非常不寻常的情况,而您没有这种情况)
MAC 地址(源和目标)可以更改。路由器会重写 MAC 地址。虽然您的路由器设置不正确。请参阅 ultra 的图片,了解路由器如何拥有多个 NIC,每个 NIC 在自己的子网上都有自己的 IP。