小编Kil*_*nDS的帖子

路由添加/删除后的时序问题(未使用路由)

我有一个运行原始 IP 套接字的应用程序,该套接字的目标由通过“ip route add”命令安装的路由控制。这些路由在套接字的生命周期内可能会发生变化(例如,因为下一跳发生变化)

简化,假设我有 2 个接口,eth0eth1. 我也有一个默认路由,通过eth0.

例如10.10.10.10,原始套接字的端点是eth1 具有地址100.0.0.1,我在原始套接字的生命周期中执行以下操作:

ip -f inet route delete 10.10.10.10
ip -f inet route add 100.0.0.2 dev eth1
ip -f inet route add 10.10.10.10/32 via 100.0.0.2 dev eth1
Run Code Online (Sandbox Code Playgroud)

现在我看到的是,在此操作流量正确通过eth1几秒钟后,它会出错(通过 eth0)一小段时间(不到半秒),然后又正确(就我永久看到的而言) )。

所以我的主要问题是: - 任何人都可以解释这里可能出现的问题吗?我尝试ip route flush cache在前面提到的序列之后添加,但没有做任何事情。我目前对为什么流量有时会下降感到困惑。我认为这要么是路由命令中的计时问题,要么是其他一些触发器在一瞬间禁用了路由,但我的选择已经用完了。

我曾尝试使用SO_BINDTODEVICE选项在我的原始套接字,但很可惜这并没有帮助很大,主要区别是,当业务出现问题它没有发出可言,因为它会去了错误的接口。但是,我希望的是这会将 errno 设置为 E_CANNOTROUTE 之类的东西(这不存在),因此我可以捕获它并重试发送数据包。它目前没有这样做,但是有没有办法可以捕捉到这样的失败?我(几乎)完全控制了系统和运行套接字的应用程序。

我知道可行的一种解决方案是不使用 L3 原始套接字,而是使用AF_PACKET套接字(并且我自己也使用 ARP/ND),但我现在还不想这样做。

更新

通过更改此路由更改行为,我改进了系统中的行为。当我必须更新下一跳时,我现在会查看已安装的路由并根据该路由执行操作:

  • 如果它不存在,我只安装新路由并跳过删除。
  • 如果确切的路线已经存在(相同的 nh,相同的开发),我现在什么都不做。
  • 如果此路线存在另一个 nh,我现在只针对此 …

linux routing socket

5
推荐指数
1
解决办法
372
查看次数

标签 统计

linux ×1

routing ×1

socket ×1