Node.js socket.addMembership() 方法

2025年4月30日 | 阅读 7 分钟

Node.js 中的 socket.addMembership() 方法是 UDP(用户数据报协议)套接字接口的重要组成部分,它允许开发人员处理多播通信。多播是一种将单个数据包一次性发送到多个目标的技术;它主要用于流式视频需要传达给数百万用户,或者需要与他人玩在线游戏,或者在其他实时数据广播场景中。

让我们通过了解 Node.js 中的 UDP 是什么,多播是什么,以及此方法如何适应通信机制来深入了解 socket.addMembership()。

Node.js 中的 UDP

UDP 协议是无连接的。这意味着客户端和服务器之间不需要建立持久连接。数据以数据报的形式传输,数据报是包含到达地址详细信息的独立信息包。因此,UDP 适用于应用程序速度至关重要且偶尔数据丢失影响最小的情况下,例如在线游戏、直播流和 VoIP(网络电话)。

UDP 套接字支持发送或接收数据报。例如,客户端使用 UDP 套接字向服务器发送数据。此类服务器将响应,而无需建立持久连接,例如 TCP 的情况。您可以使用 Node.js 和 dgram 模块来支持通过 UDP 进行通信。

多播简介

在多播中,单个数据包可以被多个接收者接收。这是一种将数据分发到接收者组的高效方法。它不太可能应用于直播视频、股票价格更新或多人游戏等应用程序。在多播机制下,发送者发送一份数据副本,底层网络会确保其到达属于同一多播组的多个客户端。

多播的概念围绕着一个多播组。多播组可以通过一个特殊的数字范围来标识,通常称为 D 类 IP 地址。在这种情况下,分配给 IP 地址的数字从 224.0.0.0 开始,到 239.255.255.255 结束。

什么是 socket.addMembership()?

Node.js 为套接字提供了一个 addMembership() 方法。此方法允许 UDP 套接字加入任何多播组。它将开始接收发送到特定多播组地址的数据报。一旦套接字成为组的成员,它就可以开始接收发送到与该组关联的多播地址的任何数据报。

socket.addMembership() 的语法

它具有以下语法:

参数

  • MulticastAddress(多播地址):这是套接字将加入多播组的 IP 地址。多播组将由 224.0.0.0 到 239.255.255.255 范围内的 IP 地址标识。
  • MulticastInterface(多播接口):这是一个可选参数。它是将多播成员资格添加到其中的本地网络接口。如果未定义,操作系统将使用默认接口。

socket.addMembership() 如何工作?

加入多播组,UDP 套接字可以使用 socket.addMembership() 方法加入多播组。添加到多播组后,发送到该组的数据报将由操作系统接收并分发到套接字。它提供了可选参数 multicastInterface,可用于指定哪个网络接口应接收多播流量。当机器有多个网络接口(如以太网和 Wi-Fi)并且您希望在其中一个接口上接收多播流量时,这非常有用。

它会自动选择任何合适的多播接口。一旦套接字通过套接字加入多播组,它将开始接收发送到多播地址的数据报。这意味着多播流量现在可以来自多个客户端,而无需发送方发送相同数据的多个副本。同样,网络会确保数据能够到达多播组的所有成员,这使得该方法对于实时数据分发非常高效。

socket.addMembership() 示例

以下是如何在 Node.js 中使用 socket.addMembership() 的示例

在此示例中,我们使用 diagram.createSocket() 创建一个 UDP 套接字,然后使用 socket.addMembership() 加入多播组 224.0.0.114。之后,它会等待发送到多播地址并打印到控制台的任何消息。

发送方代码(用于发送多播消息)

发送方将向 224.0.0.114 组的 41234 端口发送多播消息。这是发送方代码

先运行接收方:打开一个终端,运行以下命令

Node.js socket.addMembership() Method

这将开始监听多播消息。您应该会看到

Node.js socket.addMembership() Method

运行发送方:在另一个终端中,运行发送方代码

Node.js socket.addMembership() Method

它将发送多播消息,您应该会看到

Node.js socket.addMembership() Method

检查接收方终端:在第一个终端(运行接收方的终端)中,发送消息后您应该会看到以下输出

Node.js socket.addMembership() Method

在这里,<sender's IP address> 将是运行发送方脚本的机器的 IP 地址,而 <sender's port> 将是发送方用于发送消息的端口。

关键注意事项

1. 各种接口

如果您的设备有多个网络接口(以太网、Wi-Fi 等),您应确保使用合适的接口接收多播流量。通常,操作系统会为您自动选择其中一个。如果您想选择一个特定的接口,可以在调用 socket.addMembership() 时使用 multicastInterface 参数。

例如

在这种情况下,套接字通过 IP 地址为 192.168.1.5 的接口参与多播组。

2. 多播 TTL

在多播中,TTL 值表示数据包在网络中可以传播多远,然后被丢弃。默认情况下,此值为 1,这意味着数据包仅传递到同一本地网络中的其他成员。您可以使用套接字的 setMulticastTTL() 方法更改此值。

它将 TTL 设置为 128,这意味着它将把此多播数据包转发最多 128 个网络跳。

3. 离开多播组

您可以调用 socket.dropMembership() 方法停止接收多播组的数据报。socket.dropMembership() 方法允许套接字离开多播组并停止对该组的进一步流量接收。

使用 socket.addMembership() 进行多播的优点

  1. 网络可扩展性
    由于数据作为单个数据包传输到许多接收者,而不是通过多个单播连接进行通信,因此减少了网络流量。
    此功能非常适合实时环境中的应用程序,例如直播视频流、股票更新和多人游戏。
  2. 减少服务器负载
    通过多播传输数据而不是创建多个出站连接服务器可以减少开销。
  3. 优化的数据广播
    它允许将相同的数据发送到多播组中的数千个客户端,从而使数据广播更快、更具可扩展性。
  4. TTL 控制
    TTL 代表“生存时间”(Time-to-Live);它允许开发人员设置多播数据包在网络中允许传播的时间。较低的 TTL 值仅限于本地网络中的流量,而较高的值则允许其到达更广泛的网络。
  5. 多个接口
    对于拥有多个网络接口的机器,multicastInterface 参数将帮助开发人员确定哪个接口会转发多播流量。
    之后,多播流量将在最佳接口上正确转发,以最大化网络性能。

常见用例

在许多实时数据分发应用程序中都使用了相同的 socket.addMembership() 方法,在这些应用程序中需要一次将相同的数据发布给许多客户端。此功能的一些常见用例如下:

  • 流媒体:在视频或音频流应用程序中,多播可以有效地将数据分发给许多观看者。
  • 股票价格或天气更新的实时馈送,这些馈送表明应用程序需要转发给多个客户端,都是多播的绝佳示例。
  • 在线游戏:多人游戏大量使用多播来发送数据,例如,将玩家的位置更新发送给所有玩游戏的人。

结论

总之,Node.js 有一个非常高效的 socket.addMembership() 方法,可用于通过 UDP 套接字启用多播。此方法允许套接字加入多播组并将数据发送到多个接收者,而不会产生通常与此类活动相关的开销。此方法最常用于实时应用程序,包括媒体流、在线游戏以及实时数据源的发布或联合。在这些应用中,低延迟数据分发的效率至关重要。

使用 socket.addMembership() 需要非常注意我们所寻址的接口以及多播数据包的 TTL。当然,在任何需要的情况下,您都不应忘记使用 socket.dropMembership() 来离开组。