Làm cách nào để tìm một máy chủ trò chơi trong mạng LAN với công nghệ IPv6?


8

Quay trở lại những ngày IPv4, mọi người chỉ cần sử dụng các gói phát sóng để kiểm tra xem có máy chủ nào có sẵn trong mạng như được mô tả trong câu trả lời này không . Nhưng trong giao thức IPv6, họ đã bỏ hỗ trợ phát sóng. Vẫn có hỗ trợ phát đa hướng nhưng tôi có thể / nên sử dụng nó như thế nào?

Câu trả lời:


7

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ự 0chỉ 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ị 2cho 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.


bạn không cần quyền quản trị để tạo / tham gia một nhóm? và bên cạnh đó nhóm này hoạt động như thế nào? Ý tôi là tôi có chọn địa chỉ nhóm khi tôi muốn tạo / tham gia không?
Ali1S232

Tôi sẽ mở rộng câu trả lời để bao gồm một số chi tiết khác
Sander Steffann

Câu trả lời này có lẽ đúng về mặt kỹ thuật nhưng nó bỏ lỡ một chút giải thích về cách hoạt động của multicast. Tôi có hiểu chính xác rằng bạn có thể tạo một ổ cắm phát đa hướng và sau đó mọi người trong mạng biết ổ cắm này ở đâu không?
API-Beast

Ngoài ra nếu vậy, làm thế nào để phân biệt ổ cắm nào trong mạng cục bộ và bên ngoài, như internet.
API-Beast

Câu trả lời mở rộng
Sander Steffann

4

Có các giao thức để khám phá dịch vụ mà các ứng dụng hiện đại nên sử dụng thay vì các giải pháp phát đa hướng phát sóng hoặc tại nhà, cho dù bạn đang sử dụng IPv4 hay IPv6.

Apple đẩy mDNS / DNS-SD và Microsoft đẩy UPnP . Cả hai đều hoàn thành các mục tiêu giống nhau để khám phá dịch vụ đơn giản, trong khi UPnP cung cấp nhiều tính năng bổ sung.

Có các thư viện có sẵn miễn phí cho cả hai API đó cho nhiều nền tảng. Các hệ điều hành có liên quan bao gồm hỗ trợ riêng. Linux cung cấp hỗ trợ thông qua các thành phần hệ thống bán chuẩn được cài đặt theo mặc định trên hầu hết các bản phát hành.

Lưu ý rằng UPnP cũng có thể được sử dụng cho cấu hình tường lửa và do đó có thể là lựa chọn tốt hơn cho các trò chơi có kế hoạch chơi Internet, mặc dù bạn không thể dựa vào hoặc yêu cầu kiểm soát tường lửa UPnP vì nhiều người dùng không có bộ định tuyến tương thích hoặc bật tính năng ra khỏi hoang tưởng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.