Рубрики
Без рубрики

Многоадресная рассылка

Автор оригинала: Doug Hellmann.

Соединения точка-точка обрабатывают множество коммуникационных потребностей, но передача одной и той же информации между множеством одноранговых узлов становится сложной задачей по мере роста числа прямых соединений. Отправка сообщений каждому получателю по отдельности требует дополнительного времени на обработку и пропускной способности, что может быть проблемой для таких приложений, как потоковое видео или аудио. Использование многоадресной передачи для доставки сообщений более чем одной конечной точке за один раз обеспечивает более высокую эффективность, поскольку сетевая инфраструктура гарантирует, что пакеты доставляются всем получателям.

Многоадресные сообщения всегда отправляются с использованием UDP, поскольку TCP предполагает наличие пары взаимодействующих систем. Адреса для многоадресной рассылки, называемые группами многоадресной рассылки , представляют собой подмножество обычного диапазона адресов IPv4 (от 224.0.0.0 до 230.255.255.255), зарезервированного для многоадресного трафика. Эти адреса обрабатываются сетевыми маршрутизаторами и коммутаторами особым образом, поэтому сообщения, отправленные группе, можно распространять через Интернет всем получателям, присоединившимся к группе.

Примечание

На некоторых управляемых коммутаторах и маршрутизаторах многоадресный трафик по умолчанию отключен. Если у вас возникли проблемы с примерами программ, проверьте настройки сетевого оборудования.

Отправка многоадресных сообщений

Этот модифицированный эхо-клиент отправит сообщение группе многоадресной рассылки, а затем сообщит обо всех полученных ответах. Поскольку у него нет возможности узнать, сколько ответов ожидать, он использует значение тайм-аута в сокете, чтобы избежать блокировки на неопределенный срок во время ожидания ответа.

Сокет также необходимо настроить со значением времени жизни (TTL) для сообщений. TTL контролирует, сколько сетей получит пакет. Установите TTL с помощью параметра IP_MULTICAST_TTL и setsockopt () . Значение по умолчанию 1 означает, что пакеты не пересылаются маршрутизатором за пределы текущего сегмента сети. Значение может быть в диапазоне до 255 и должно быть упаковано в один байт.

socket_multicast_sender.py

import socket
import struct
import sys

message  b'very important data'
multicast_group  ('224.3.29.71', 10000)

# Create the datagram socket
sock  socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Set a timeout so the socket does not block
# indefinitely when trying to receive data.
sock.settimeout(0.2)

# Set the time-to-live for messages to 1 so they do not
# go past the local network segment.
ttl  struct.pack('b', 1)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)

try:

    # Send data to the multicast group
    print('sending {!r}'.format(message))
    sent  sock.sendto(message, multicast_group)

    # Look for responses from all recipients
    while True:
        print('waiting to receive')
        try:
            data, server  sock.recvfrom(16)
        except socket.timeout:
            print('timed out, no more responses')
            break
        else:
            print('received {!r} from {}'.format(
                data, server))

finally:
    print('closing socket')
    sock.close()

Остальная часть отправителя выглядит как эхо-клиент UDP, за исключением того, что он ожидает множественных ответов, поэтому использует цикл для вызова recvfrom () , пока не истечет время ожидания.

Получение многоадресных сообщений

Первым шагом к установке получателя многоадресной рассылки является создание сокета UDP. После того, как обычный сокет создан и привязан к порту, его можно добавить в группу многоадресной рассылки, используя setsockopt () , чтобы изменить параметр IP_ADD_MEMBERSHIP . Значение параметра – это 8-байтовое упакованное представление адреса группы многоадресной рассылки, за которым следует сетевой интерфейс, на котором сервер должен прослушивать трафик, идентифицированный его IP-адресом. В этом случае получатель прослушивает все интерфейсы, используя INADDR_ANY .

socket_multicast_receiver.py

import socket
import struct
import sys

multicast_group  '224.3.29.71'
server_address  ('', 10000)

# Create the socket
sock  socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Bind to the server address
sock.bind(server_address)

# Tell the operating system to add the socket to
# the multicast group on all interfaces.
group  socket.inet_aton(multicast_group)
mreq  struct.pack('4sL', group, socket.INADDR_ANY)
sock.setsockopt(
    socket.IPPROTO_IP,
    socket.IP_ADD_MEMBERSHIP,
    mreq)

# Receive/respond loop
while True:
    print('\nwaiting to receive message')
    data, address  sock.recvfrom(1024)

    print('received {} bytes from {}'.format(
        len(data), address))
    print(data)

    print('sending acknowledgement to', address)
    sock.sendto(b'ack', address)

Основной цикл для приемника аналогичен обычному эхо-серверу UDP.

Пример вывода

В этом примере показан приемник многоадресной рассылки, работающий на двух разных хостах. A имеет адрес 192.168.1.13 , а B имеет адрес 192.168.1.14 .

[A]$ python3 socket_multicast_receiver.py

waiting to receive message
received 19 bytes from ('192.168.1.14', 62650)
b'very important data'
sending acknowledgement to ('192.168.1.14', 62650)

waiting to receive message

[B]$ python3 source/socket/socket_multicast_receiver.py

waiting to receive message
received 19 bytes from ('192.168.1.14', 64288)
b'very important data'
sending acknowledgement to ('192.168.1.14', 64288)

waiting to receive message

Отправитель работает на хосте B .

[B]$ python3 socket_multicast_sender.py
sending b'very important data'
waiting to receive
received b'ack' from ('192.168.1.14', 10000)
waiting to receive
received b'ack' from ('192.168.1.13', 10000)
waiting to receive
timed out, no more responses
closing socket

Сообщение отправляется один раз, и принимаются два подтверждения исходящего сообщения, по одному от каждого из хостов A и B .

Смотрите также

  • Wikipedia: Multicast – статья, описывающая технические детали многоадресной рассылки.
  • Википедия: IP Multicast – статья о многоадресной IP-рассылке с информацией об адресации.