Знаете ли вы, что такое “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.