Khi phát sóng, khách hàng gửi tin nhắn cho mọi người trên mạng và tất cả các máy chủ trả lời. Với multicast, bạn xác định một địa chỉ nhóm multicast và tất cả các máy chủ đăng ký nó. Sau đó, khách hàng gửi tin nhắn cho nhóm, các máy chủ đã đăng ký nhận nó và trả lời.
Multicast dành cho khi một người gửi muốn gửi đến một nhóm người nhận, giống như khi khách hàng trò chơi muốn gửi đến một nhóm máy chủ (tiềm năng). Địa chỉ Multicast là địa chỉ đặc biệt mà hệ thống biết để đối xử với chúng khác nhau. Người nhận nói với hệ thống rằng nó muốn nhận tin nhắn được gửi đến một nhóm cụ thể và người gửi sẽ gửi tin nhắn đến địa chỉ nhóm. Trên mạng LAN, nó chỉ hoạt động. Trên toàn mạng LAN, bạn cần định tuyến phát đa hướng không được triển khai trên hầu hết các mạng. Nhưng phát sóng cũng không hoạt động trên các mạng LAN.
Sử dụng multicast đảm bảo rằng chỉ những hệ thống trên mạng quan tâm đến việc nhận tin nhắn mới nhận được tin nhắn.
Làm thế nào bạn thực hiện điều này phụ thuộc vào ngôn ngữ lập trình, vv
Cấu trúc của một địa chỉ multicast IPv6 như sau:
- Nó luôn bắt đầu với 8 bit đầu tiên của địa chỉ được đặt thành 1, có nghĩa là hai ký tự đầu tiên của địa chỉ sẽ là
ff
;
- Ký tự thứ 3 (bit 9 đến 12) trong địa chỉ chỉ định cờ. Trong trường hợp của bạn, bạn có thể muốn một địa chỉ multicast cố định cho ứng dụng của bạn. Trong trường hợp đó, ký tự thứ 3 sẽ là ký tự
0
chỉ ra địa chỉ multicast được gán vĩnh viễn;
- Ký tự thứ 4 (bit 13 đến 16) xác định phạm vi của địa chỉ. Bạn rất có thể sẽ sử dụng giá trị
2
cho phạm vi liên kết cục bộ (LAN).
Cùng với điều này có nghĩa là bạn sẽ sử dụng một địa chỉ bắt đầu bằng ff02:
.
Địa chỉ Multicast được gán bởi IANA. RFC3307 định nghĩa cách thực hiện (tiêu chí là Đánh giá của chuyên gia, do đó không cần thiết phải viết RFC về những gì bạn đang làm hoặc bất cứ điều gì tương tự). Trong câu trả lời này, tôi sẽ sử dụng địa chỉ multicast ff02::db8:aa:bb
, nằm trong khối dành riêng cho tài liệu.
Bạn không cần phải có quyền truy cập root để sử dụng multicast. Các ví dụ Python3.3 sau đây có thể được chạy với tài khoản người dùng bình thường:
Máy chủ (nghe trên địa chỉ multicast):
#!/usr/bin/env python3.3
import socket
import struct
if_idx = socket.if_nametoindex('en0')
addr = 'ff02::db8:aa:bb'
port = 42424
group = socket.inet_pton(socket.AF_INET6, addr) + struct.pack("I", if_idx)
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_JOIN_GROUP, group)
sock.bind(('::', port))
while True:
msg, sender = sock.recvfrom(1024)
print('Received "%s" from "%s"' % (str(msg, 'UTF-8'), sender))
sock.sendto(bytes('Received %d bytes from you' % len(msg), 'UTF-8'), sender)
Và ứng dụng khách (gửi đến nhóm phát đa hướng và lắng nghe phản hồi):
#!/usr/bin/env python3.3
import socket
if_idx = socket.if_nametoindex('en0')
addr = 'ff02::db8:aa:bb'
port = 42424
sock = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)
sock.setsockopt(socket.IPPROTO_IPV6, socket.IPV6_MULTICAST_IF, if_idx)
sock.sendto(bytes('Hello there!', 'UTF-8'), (addr, port))
while True:
# You probably wait a certain time for replies, not indefinitely like this example
msg, sender = sock.recvfrom(1024)
print('Received "%s" from "%s"' % (str(msg, 'UTF-8'), sender))
Tôi đã sử dụng Python 3.3 vì các phiên bản cũ hơn không có socket.if_nametoindex
, nhưng mọi thứ khác cũng sẽ hoạt động trong Python 2.
PS: sử dụng thư viện hoặc khung hiện có để khám phá dịch vụ như được đề xuất trong câu trả lời khác là một ý tưởng hay. Nó sẽ sử dụng multicast dưới mui xe nhưng giúp bạn không phải thiết kế và thực hiện giao thức của riêng mình.