Знаете ли вы, что такое ”multicast”? Немногие смогут ответить, что прекрасно знают и используют его осознанно.
Мне лень напрягаться и придумывать формулировки. Приведу лишь один полезный пример.
Бывает необходимость определить, какие есть “живые” хосты в своей подсети (например, устройства, подключенные к домашней WiFi-сети). Привычный для людей, не очень далёких от сетевых технологий - это отправка icmp-пакетов (говоря проще - пинга) на широковещательный адрес (broadcast). Допустим, если у вас дома сеть 192.168.98.0/24, то broadcast - 192.168.98.255:
$ ifconfig | grep broadcast inet 192.168.98.10 netmask 0xffffff00 broadcast 192.168.98.255 inet 172.16.51.1 netmask 0xffffff00 broadcast 172.16.51.255 inet 172.16.200.1 netmask 0xffffff00 broadcast 172.16.200.255 $ ping 192.168.98.255 64 bytes from 192.168.98.10: icmp_seq=0 ttl=64 time=0.093 ms 64 bytes from 192.168.98.1: icmp_seq=0 ttl=255 time=2.366 ms (DUP!) 64 bytes from 192.168.98.2: icmp_seq=0 ttl=64 time=2.776 ms (DUP!) 64 bytes from 192.168.98.12: icmp_seq=0 ttl=64 time=8.094 ms (DUP!)
Видим, что в подсети отвечают 4 хоста (WiFi-точка, сервер, ноутбук и iPhone).
Недостаток метода в том, что нужно выяснять broadcast-адрес для конкретной сети. Это, конечно, всего лишь одна дополнительная команда, но есть способ гораздо элегантнее, основанный на использовании multicast-адреса 224.0.0.1, описывающего “The All Hosts multicast group that contains all systems on the same network segment”. Перечень “well-known” multicast-адресов можно найти в Wikipedia.
Посылаем icmp-пакеты на multicast-адрес 224.0.0.1 и получаем ответы:
$ ping 224.0.0.1 64 bytes from 192.168.98.10: icmp_seq=16 ttl=64 time=0.110 ms 64 bytes from 192.168.98.1: icmp_seq=16 ttl=255 time=0.894 ms 64 bytes from 192.168.98.2: icmp_seq=16 ttl=64 time=1.222 ms 64 bytes from 192.168.98.12: icmp_seq=16 ttl=64 time=3.254 ms
Удобно. Рекомендую.
Ещё полезные команды вы можете посмотреть в обсуждении на Server Fault и на Hacker News.