IP 数据包如何发送到网关?

网络工程 路由器 ip 网关 路线 ip 转发表
2022-02-03 02:28:44

这是一些路由命令输出示例:

$ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.240.1   0.0.0.0         UG    0      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
192.168.240.0   0.0.0.0         255.255.240.0   U     0      0        0 eth2

当我的计算机要发送一个目的地址为 的 IP 数据包时1.2.3.4,该数据包通过 eth0 发送到网关192.168.240.1IP 数据包包含 2 个字段:源 IP 和目标 IP。如果源IP是我电脑的IP,目的IP是1.2.3.4,那么路由器(网关)怎么知道这个IP包是他要转发的呢?IP数据包中网关的IP存储在哪里?

4个回答

来自https://serverfault.com/a/904385/656791

TL;DR:网关的地址仅存储在包含该 TCP/IP 数据包的以太网帧中

服务器->交换机->路由器流量,以及服务器->交换机->服务器流量,是IP寻址实际上没有任何意义的地方。这是底层协议的世界,很可能是以太网。所以这是一个基于 MAC 寻址的世界。

所以你只需要解决默认网关是IP地​​址的混淆。嗯,它是,有点……向人类展示了什么……但是网关的 IP只需要做一件事,那就是问:谁在这附近有 192.168.1.1?答案是网关是 MAC 88:99:aa:bb:cc:dd:ee:ff。(那是 ARP 查询/响应,两个世界之间的转换器。) MAC 是实际使用的。数据包在以太网级别上到达那个 MAC,尽管它在 IP 级别上拥有不同的目的地。

因此,通过设置以太网帧的“目标 MAC”字段,数据包被标记为发送到所选网关。如果有多个网关,该字段确定该网络上的哪个网关将获得它。(“框架”是一个底层封装,用于保存数据包或数据包的一部分。)

概括:虽然路由表是 IP 协议的核心,但当数据包通过线路时,它们的列中表示 Next Hop永远不会使用 IP 地址实现。Next Hop 实际上总是使用以太网、MPLS 或其他底层协议:

 192.168.98.0/24     via 192.168.99.1 dev eth0 |                   |                         | |  <- IP world ->   | <- underlying world  -> | |                  
|                         | ```

路由器(网关)怎么知道这个IP包是他要转发的?IP数据包中网关的IP存储在哪里?

“下一跳” IP 不直接存储在数据包中。当 IP 在多点*链路层上运行时,下一跳 IP 必须转换为链路层地址。然后,链路层必须确保数据包仅传送到预期主机或路由器的 IP 堆栈。

在以太网(或 wi-fi)网络上运行 IP 时,“下一跳”IP 用于确定数据包的目标 MAC 地址。目的 MAC 地址用于过滤接收主机或路由器的传入数据包,从而防止不必要的重复。

* 请注意,从协议的角度来看,以太网链路被视为多点,即使它们在物理上碰巧是点对点的。

您正确地识别出数据包中的 L3 地址识别会话两个端点的IP 地址和目标IP 地址。

您没有考虑的是L2 地址,它将识别路径上当前跃点的MAC 地址和目标MAC 地址。

以这张图片为例: 来自 https://www.youtube.com/watch?v=JI9Zm2tbUoE 的屏幕截图

主机 A (10.1.1.22) 正在尝试向主机 C (10.9.9.44) 发送数据。主机 C 存在于外部网络上。因此,主机 A 将构建一个 L2 标头,它将数据包带到路由器。L2 标头包括主机 A 的 MAC 源 (a2a2) 和路由器的 MAC (e5e5)。

这就是将数据包发送到路由器的原因。然后路由器将根据需要转发它。

注意:在构建 L2 报头之前,主机必须配置默认网关(告诉主机 A 路由器的 IP),并且必须完成 ARP 以解析路由器的 MAC 地址。此过程在拍摄上述图像的视频中进一步解释。

免责声明:我创建了视频

网关地址仅用作参考,根本没有添加到 IP 数据包中(嗯,技术上可以将其添加为 的一部分source route,但这非常罕见,互联网上没有人基于路由来源)。正如您正确提到的,当您的计算机想要向 1.2.3.4 发送内容时,它只是执行此操作。收到此 IP 数据报后,网关设备(通常是路由器)将执行以下操作:

  • 检查 IP 标头的 IP DST 字段。这将是 1.2.3.4
  • 检查其路由表(或路由策略),了解将此流量路由到的位置
  • 转发数据包并减少 IP 标头中的 TTL 值。

下一个路由器将完全相同,直到数据包到达1.2.3.4

当然,这是对过程的 10,000 英尺的总结,但我希望它可以帮助您了解机制。

编辑以解决您的评论

发送到本地网络之外的网络的 IP 数据包永远不会按照您想象的方式发送。换句话说,如果您的主机 192.168.240.2 想要向 1.2.3.4 发送流量,除非它有到该目的地的路由,否则它不会发送该流量。如果没有路由,则使用默认网关。默认路由将始终包含我们本地子网中设备的地址,ARP 请求将为其获取 MAC 地址,因此 L2 帧将在 DST 字段中包含我们网关的 MAC 地址。现在.. 大多数操作系统不会开始只是将此流量发送到 ff:ff:ff 因为这是一个安全漏洞(本地网络上的每个人都会收到它)。但是,如果发生这种情况,并且无论出于何种原因,以这种方式发送流量,则本地网段上的路由器可能只需按照上述说明进行即可。我说可能是因为这将取决于路由器/供应商进程如何处理广播流量或 BUM(他们将转发它还是简单地丢弃它)。很有可能,数据包将被丢弃......