gpt4 book ai didi

linux - 套接字和 ARP(IP 邻居)表条目

转载 作者:太空狗 更新时间:2023-10-29 12:16:22 30 4
gpt4 key购买 nike

在 CentOS 6.4(内核 2.6.32)上,为什么下面的第二个 arping 调用会创建一个新的 ARP 表条目,而第一个不会?网络行为是相同的,我感到困惑的是,在我看来,系统调用实际上是等同的。我在这里缺少什么系统行为?

#:- arping -s 10.0.2.15 -f 10.0.2.4
ARPING 10.0.2.4 from 10.0.2.15 eth0
Unicast reply from 10.0.2.4 [52:54:00:01:02:03] 0.681ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
#:- ip neigh show | grep -c '^10\.0\.2\.4 '
0 # <--- no new ARP entry

#:- arping -f 10.0.2.4
ARPING 10.0.2.4 from 10.0.2.15 eth0
Unicast reply from 10.0.2.4 [52:54:00:01:02:03] 0.681ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)
#:- ip neigh show | grep -c '^10\.0\.2\.4 '
1 # <--- new ARP entry

10.0.2.15就是上面eth0的地址。如果您尝试自己重现此内容,请注意您的目标根本不在 ARP 表中——例如,它不能处于 STALE 状态,它必须完全不存在。

现在,如果我strace 每次调用(并忽略内存位置的差异)相关的差异是这样的:

$:- diff -uN /tmp/arp-no.trace /tmp/arp-yes.trace
--- /tmp/arp-no.trace 2014-04-23 20:17:46.301575314 -0500
+++ /tmp/arp-yes.trace 2014-04-23 20:17:48.790575314 -0500
@@ -1,4 +1,4 @@
-execve("/sbin/arping", ["arping", "-s", "10.0.2.15", "-f", "10.0.2.4"], [/* 19 vars */]) = 0
+execve("/sbin/arping", ["arping", "-f", "10.0.2.4"], [/* 19 vars */]) = 0
brk(0) = 0xMEMLOCATION
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xMEMLOCATION
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
@@ -37,7 +37,9 @@
ioctl(3, SIOCGIFFLAGS, {ifr_name="eth0", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
setsockopt(4, SOL_SOCKET, SO_BINDTODEVICE, "eth0\0", 5) = 0
-bind(4, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("10.0.2.15")}, 16) = 0
+setsockopt(4, SOL_SOCKET, SO_DONTROUTE, [1], 4) = 0
+connect(4, {sa_family=AF_INET, sin_port=htons(1025), sin_addr=inet_addr("10.0.2.4")}, 16) = 0
+getsockname(4, {sa_family=AF_INET, sin_port=htons(38207), sin_addr=inet_addr("10.0.2.15")}, [16]) = 0
close(4) = 0
bind(3, {sa_family=AF_PACKET, proto=0x806, if2, pkttype=PACKET_HOST, addr(0)={0, }, 40) = 0
getsockname(3, {sa_family=AF_PACKET, proto=0x806, if2, pkttype=PACKET_HOST, addr(6)={1, 080027538173}, [18]) = 0
... and then the sendto/recvfrom happen ...

在我指定源 IP 且未创建 ARP 条目的情况下,源 IP 地址通过创建、绑定(bind)和关闭的短期 IPPROTO_IP 套接字进行验证。在第二种情况下,arping 通过创建一个短暂的 IPPROTO_IP 套接字、connect()ed、getsockname()d 和关闭 来猜测源 IP 地址。

之后,程序行为(和网络事件)是相同的。然而,系统 react 不是,我看到的唯一实质性区别是每个程序对现已关闭的套接字的不同但无害的使用。

最佳答案

这很奇怪,不是吗? :-)

我很确定这是我在另一个 Arping 实现(我的)中调查的相同内核错误/功能:

https://blog.habets.se/2012/10/Interesting-Arping-bug-report

没有必要剪切和粘贴冗长的解释,但简而言之:如果您查找路由然后发送原始 ARP 数据包,那么内核将出于某种原因嗅探 ARP 回复并填充 ARP 表。

我不知道为什么,或者这是否是预期的行为。但它是内核做的。

关于linux - 套接字和 ARP(IP 邻居)表条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23272190/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com