linux ping广播地址无回应

看《TCP/IP详解 卷1:协议》第12章 广播和多播 时,说ping可以直接ping广播地址。

局域网发现功能。
具体就是:发现所有连接到路由器的设备。就是发现所有局域网主机。并列出主机名,mac,ip等。
当时网上搜了好长时间,最后发现,这不就是arp局域网内所有ip么,有回应的就用dns得一下域名(当时认为dns也得自己弄)。所以网上搜源码搜到了这个牛逼东西:arp-scan 在这里mark一下。
结果发现,编译时要使用libpcap库,运行需要管理员权限。
方案被否了,得自己用C/C++实现。心中一万个草泥马飞过。。。
之后又搜源码,结果发现,linux的socket函数要想发arp包就得要root权限。(socket函数,第二个参数如果是SOCK_RAW或SOCK_PACKET都需要root权限)
经讨论说不能给root权限,C使用arp行不通,还是java自己ping所有ip。(心里那个暗爽啊。哈哈哈)
剩下的任务就是怎么用dns查主机名了。
又经过一顿搜啊搜,发现Unix有个库函数gethostbyaddr就是根据跟定ip地址,返回对应的主机域名。它其实就是实现了dns解析器功能。(哎,基本常识都得搜半天,没文化真可怕啊)
后来又想了下,这种通用函数android能没有封装??结果查了下发现android确实有对应java类InetAddress的getByAddress函数。
最后。。。
最后,这个需求就跟自己没啥事了。。。

所以从上面的ping局域网内所有ip(根据子网掩码算出),是否可以ping广播地址??
linux运行如下命令:

$ ping 192.168.1.255
Do you want to ping broadcast? Then -b
$ ping 192.168.1.255 -b -c 1
WARNING: pinging broadcast address
PING 1192.168.1.255 (192.168.1.255) 56(84) bytes of data.

— 192.168.1.255 ping statistics —
1 packets transmitted, 0 received, 100% packet loss, time 10000ms

没有任何回应。
从baidu搜了半天,也没找出个所以然来。再次鄙视baidu和我天朝最牛B的墙。
还是自己找方法解决吧。
在该子网内的另一台机器运行tcpdump,然后再ping:

$ tcpdump -n icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:30:21.300465 IP 192.168.1.89 > 192.168.1.255: ICMP echo request, id 41295, seq 1, length 64

发现tcpdump机器确实收到了ping,但是没reply。
最后几经挫折,发现linux有个配置项控制是否要回应icmp的广播。

$ echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

在使用ping就收到了该主机的回复了

$ ping 192.168.1.255 -b -c 1
WARNING: pinging broadcast address
PING 192.168.1.255 (192.168.1.255) 56(84) bytes of data.
64 bytes from 192.168.1.121: icmp_seq=1 ttl=64 time=2.11 ms

— 192.168.1.255 ping statistics —
1 packets transmitted, 1 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 2.117/2.117/2.117/0.000 ms

最后mark一个文章:Linux网络服务参数配置说明及实战

你可能感兴趣的:(笔记)