linux – 路由添加/删除后的计时问题(路由未使用)
我有一个运行原始IP套接字的应用程序,此套接字的目标由通过’ip route add’命令安装的路由控制.这些路由可以在套接字的生命周期内更改(例如,因为下一跳更改)
简化,假设我有2个接口,eth0和eth1.我也有一个通过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 现在我看到的是,在此操作之后,流量通过eth1正确地进行了几秒钟,然后它出错(通过eth0)一会儿(不到半秒)然后再次正确(据我所见)永久性). 所以我的主要问题是: 我确实尝试在我的原始套接字上使用SO_BINDTODEVICE选项,但是这没有多大帮助,主要区别在于当流量出错时根本不会发送,因为它会覆盖错误的接口.但是,我希望的是,这会将errno设置为类似E_CANNOTROUTE(这不存在),所以我可以捕获它并重试发送数据包.它目前没有这样做,但有没有办法可以捕捉到这样的失败?我(几乎)完全控制系统和运行套接字的应用程序. 我知道可以使用的一个解决方案是不使用L3原始套接字而是使用AF_PACKET套接字(并且我自己也使用ARP / ND),但我还是不想进入那个. 更新 通过更改此路由更改行为,我改进了系统中的行为.当我必须更新下一跳时,我现在查看已安装的路由并根据它采取行动: >如果不存在,我只需安装新路线并跳过删除. 虽然这可以稳定我的大部分问题,但我仍然有时会发现实际的删除添加发生时(尽管不那么经常)发生同样的事情(新机制中的最后一种情况).而且,这实际上仍然没有解释出现了什么问题(它只是绕过它),所以我现在就把这个问题保持开放,因为我真的很好奇这里出了什么问题. 仅供参考:我对centos有这个问题,据我所知,从centos4到centos6,32位. 解决方法
如果我理解正确,数据包应该总是出去eth1,你的问题是,当更新到eth1上的新下一跳时,你的数据包有时会输出eth0?那是因为你的删除添加不是原子操作.
首先尝试执行添加,然后执行删除操作.删除必须是特定的(我相信设备和nexthop),这样它也不会删除刚刚添加的新路由. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |