《TCP/IP网络编程》学习笔记 | Chapter 14:多播与广播

《TCP/IP网络编程》学习笔记 | Chapter 14:多播与广播

  • 《TCP/IP网络编程》学习笔记 | Chapter 14:多播与广播
    • 多播
      • 多播的数据传输方式和特点
      • 路由(Routing)和 TTL(Time to Live,生存时间),以及加入组的办法
      • 实现多播 Sender 和 Receiver
    • 广播
      • 广播的理解和实现方法
      • 实现广播数据的 Sender 和 Receiver
    • 基于 Windows 的实现
      • 基于 Windows 的多播示例程序
      • 基于 Windows 的本地广播示例程序
      • 基于 Windows 的直接广播示例程序
    • 多播 VS 广播
      • 对比
      • 多播的使用场景
      • 广播的使用场景
    • 习题
      • (1)TTL的含义是什么?请从路由器的角度说明较大的TTL值与较小的TTL值之间的区别及问题。
      • (2)多播与广播的异同点是什么?请从数据通信的角度说明。
      • (3)下列关于多播的描述错误的是?
      • (4)多播也对网络流量有利,请比较TCP数据交换方式解释其原因。
      • (5)多播方式的数据通信需要MBone虚拟网络。换言之, MBone是用于多播网络,但它是虚拟网络。请解释此处的“虚拟网络”。

《TCP/IP网络编程》学习笔记 | Chapter 14:多播与广播

多播

多播(Multicast)方式的数据传输是基于UDP完成的,可以同时向多个主机传递数据。

多播常用于视频会议、在线直播、IPTV等场景,其中数据需要发送给多个特定的接收者而不是所有人。

多播的数据传输方式和特点

多播的特点:

  1. 多播服务器针对特定的多播组,只发送一次数据。
  2. 即使只发送一次数据,该组内所有客户端都会接受到数据。
  3. 多播组数可以在IP地址范围内任意增加。
  4. 加入多播组就能收到发往该多播组的数据。

多播组时D类IP地址,即224.0.0.0~239.255.255.255,并被划分为三类:

  • 局部链接多播地址:224.0.0.0~224.0.0.255,这是为路由协议和其它用途保留的地址,路由器并不转发属于此范围的IP包。
  • 预留多播地址:224.0.1.0~238.255.255.255,可用于全球范围(如Internet)或网络协议。
  • 管理权限多播地址:239.0.0.0~239.255.255.255,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。

「加入多播组」可以理解为通过程序完成如下声明:在 D 类IP地址中,我希望接收发往目标 239.234.218.234 的多播数据。

多播技术基于UDP传输,向网络传输1个多播数据包时,路由器会复制该数据包并传递到多个主机,如下图所示:

在这里插入图片描述

多播的传输需要借助路由器完成。若通过 TCP 或 UDP 向 1000 个主机发送文件,则共需要传递 1000 次。但是此时如果用多播网络传输文件,则只需要发送一次。正是由于这样的特性,大大节省了网络流量,减少了占用带宽,同时也减少了发送端的重复无用的工作,多播主要用于“多媒体数据的实时传输”。

要实现多播通信,要求介于多播源和接收者之间的路由器、集线器、交换机以及主机均需支持IP多播。目前,IP多播技术已得到硬件、软件厂商的广泛支持。

然而,有些路由器并不支持多播,或即便支持也因网络拥堵问题故意阻断多播。因此,为了在不支持多播的路由器中完成多播通信,也会使用隧道(Tunneling)技术。

路由(Routing)和 TTL(Time to Live,生存时间),以及加入组的办法

为了传递多播数据包,必须设置 TTL ,它是决定「数据包传递距离」的主要因素。TTL 用整数表示,并且每经过一个路由器就减一。TTL 变为 0 时,该数据包就无法再被传递,只能销毁。因此,TTL 的值设置过大将影响网络流量。当然,设置过小,也无法传递到目标。

在这里插入图片描述

缺省情况下,发送 IP 多播数据报时其 TTL 值为 1。与设置 TTL 相关的协议层为 IPPROTO_IP ,选项名为 IP_MULTICAST_TTL。这些阈值将针对具有以下初始 TTL 值的多播数据报强制实施相应约定:

  • 0:限定在同一主机
  • 1:限定在同一子网
  • 32:限定在同一站点
  • 64:限定在同一地区
  • 128:限定在同一洲
  • 255:范围不受限制

站点和地区并未严格定义,站点可以根据实际情况再分为更小的管理单元。

因此,可以用如下代码把 TTL 设置为 64:

int send_sock;
int time_live = 64;
...
send_sock = socket(PF_INET, SOCK_DGRAM, 0);
setsockopt(send_sock, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&time_live, sizeof(time_live));
...

加入多播组也通过设置套接字可选项来完成。加入多播组相关的协议层为 IPPROTO_IP,选项名为 IP_ADD_MEMBERSHIP 。可通过如下代码加入多播组:

int recv_sock;
struct ip_mreq join_adr;
...
recv_sock = socket(PF_INET, SOCK_DGRAM, 0);
...
join_adr.imr_multiaddr.s_addr = "多播组地址信息";
join_adr.imr_interface.s_addr = "加入多播组的主机地址信息";
setsockopt(recv_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *)&join_adr, sizeof(join_adr));
...

下面是 ip_mreq 结构体的定义:

struct ip_mreq
{struct in_addr imr_multiaddr; // 写入加入组的IP地址struct in_addr imr_interface; // 加入该组的套接字所属主机的IP地址
};

有关多播的实现需要设置UDP套接字的一些可选项,以表格的形式进行汇总:

IPPROTO_IP 选项名说明数据类型
IP_MULTICAST_TTL生存时间(Time To Live),组播传送距离int
IP_ADD_MEMBERSHIP加入组播struct ip_mreq
IP_DROP_MEMBERSHIP离开组播struct ip_mreq
IP_MULTICAST_IF获取默认接口或设置接口int
IP_MULTICAST_LOOP组播数据回送,缺省默认回送int

实现多播 Sender 和 Receiver

多播中用「发送者」(以下称为 Sender) 和「接收者」(以下称为 Receiver)替代服务器端和客户端。顾名思义,此处的 Sender 是多播数据的发送主体,Receiver 是需要多播组加入过程的数据接收主体。下面是示例,示例的运行场景如下:

  • Sender : 向 AAA 组广播(Broadcasting)文件中保存的新闻信息
  • Receiver : 接收传递到 AAA 组的新闻信息。

news_sender.c 程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define TTL 64
#define BUF_SIZE 30void error_handling(char *message);int main(int argc, char *argv[])
{int send_sock;struct sockaddr_in mul_adr;int time_live = TTL;FILE *fp;char buf[BUF_SIZE];if (argc != 3){printf("Usage : %s <GroupIP> <PORT>\n", argv[0]);exit(1);}send_sock = socket(PF_INET, SOCK_DGRAM, 0); // 创建  UDP 套接字memset(&mul_adr, 0, sizeof(mul_adr));mul_adr.sin_family = AF_INET;mul_adr.sin_addr.s_addr = inet_addr(argv[1]); // 必须将IP地址设置为多播地址mul_adr.sin_port = htons(atoi(argv[2]));// 指定套接字中 TTL 的信息setsockopt(send_sock, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&time_live, sizeof(time_live));if ((fp = fopen("news.txt", "r")) == NULL)error_handling("fopen() error");while (!feof(fp)) // 如果文件没结束就返回0{fgets(buf, BUF_SIZE, fp);sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr *)&mul_adr, sizeof(mul_adr));sleep(2);}fclose(fp);close(send_sock);return 0;
}void error_handling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}

news_receiver.c 程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 30void error_handling(char *message);int main(int argc, char *argv[])
{int recv_sock;int str_len;char buf[BUF_SIZE];struct sockaddr_in adr;struct ip_mreq join_adr;if (argc != 3){printf("Usage : %s <GroupIP> <PORT>\n", argv[0]);exit(1);}recv_sock = socket(PF_INET, SOCK_DGRAM, 0);memset(&adr, 0, sizeof(adr));adr.sin_family = AF_INET;adr.sin_addr.s_addr = htonl(INADDR_ANY);adr.sin_port = htons(atoi(argv[2]));if (bind(recv_sock, (struct sockaddr *)&adr, sizeof(adr)) == -1)error_handling("bind() error");// 初始化结构体join_adr.imr_multiaddr.s_addr = inet_addr(argv[1]); // 多播组地址join_adr.imr_interface.s_addr = htonl(INADDR_ANY);  // 待加入的IP地址// 利用套接字选项 IP_ADD_MEMBERSHIP 加入多播组,完成了接受指定的多播组数据的所有准备setsockopt(recv_sock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *)&join_adr, sizeof(join_adr));while (1){// 通过 recvfrom 函数接受多播数据。如果不需要知道传输数据的主机地址信息,可以向recvfrom函数的第5 6参数分贝传入 NULL 0str_len = recvfrom(recv_sock, buf, BUF_SIZE - 1, 0, NULL, 0);if (str_len < 0)break;buf[str_len] = 0;fputs(buf, stdout);}close(recv_sock);return 0;
}void error_handling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}

通过结果可以看出,使用 sender 多播信息,通过 receiver 接收广播,如果延迟运行 receiver 将无法接受之前发送的信息。

广播

广播(Broadcast)在「一次性向多个主机发送数据」这一点上与多播类似,但传输数据的范围有区别。多播即使在跨越不同网络的情况下,只要加入多播组就能接受数据。相反,广播只能向同一网络中的主机传输数据。

广播的理解和实现方法

广播是向同一网络中的所有主机传输数据的方法。与多播相同,广播也是通过 UDP 来完成的。根据传输数据时使用的IP地址形式,广播分为以下两种:

  • 直接广播(Directed Broadcast):向特定区域内的所有主机传输数据。广播的IP地址除了网络地址外,其余主机地址全部设置为1,例如希望向 192.168.1.32 所在网络中的所有主机发送广播数据时可以向 192.168.1.255 传输。
  • 本地广播(Local Broadcast):本地广播的IP地址限定为 255.255.255.255,向该主机所在网络的所有主机发送广播数据。例如,192.32.24 网络中的主机向 255.255.255.255 传输数据时,数据将传输到 192.32.24 网络中所有主机。

有关广播的实现需要设置UDP套接字的一些可选项:

SOL_SOCKET 选项名说明数据类型
SO_BROADCAST允许或禁止发送广播数据(1启用,0不启用)int

数据通信中使用的IP地址是与 UDP 示例的唯一区别。默认生成的套接字会阻止广播,因此,只需通过如下代码更改默认设置:

int send_sock;
send_sock = socket(AF_INET, SOCK_DGRAM, 0); // 使用UDP传输int opt = 1; // 启用广播
setsockopt(send_sock, SOL_SOCKET, SOL_SOCKET, (void *)&opt, sizeof(opt));

实现广播数据的 Sender 和 Receiver

news_sender_brd.c 程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 30
void error_handling(char *message);int main(int argc, char *argv[])
{int send_sock;struct sockaddr_in broad_adr;FILE *fp;char buf[BUF_SIZE];int so_brd = 1;if (argc != 3){printf("Usage : %s <GroupIP> <PORT>\n", argv[0]);exit(1);}send_sock = socket(PF_INET, SOCK_DGRAM, 0); // 创建  UDP 套接字memset(&broad_adr, 0, sizeof(broad_adr));broad_adr.sin_family = AF_INET;broad_adr.sin_addr.s_addr = inet_addr(argv[1]);broad_adr.sin_port = htons(atoi(argv[2]));setsockopt(send_sock, SOL_SOCKET, SO_BROADCAST, (void *)&so_brd, sizeof(so_brd));if ((fp = fopen("news.txt", "r")) == NULL)error_handling("fopen() error");while (!feof(fp)) // 如果文件没结束就返回0{fgets(buf, BUF_SIZE, fp);sendto(send_sock, buf, strlen(buf), 0, (struct sockaddr *)&broad_adr, sizeof(broad_adr));sleep(2);}fclose(fp);close(send_sock);return 0;
}void error_handling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}

news_receiver_brd.c 程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>#define BUF_SIZE 30
void error_handling(char *message);int main(int argc, char *argv[])
{int recv_sock;int str_len;char buf[BUF_SIZE];struct sockaddr_in adr;if (argc != 2){printf("Usage : %s <PORT>\n", argv[0]);exit(1);}recv_sock = socket(PF_INET, SOCK_DGRAM, 0);memset(&adr, 0, sizeof(adr));adr.sin_family = AF_INET;adr.sin_addr.s_addr = htonl(INADDR_ANY);adr.sin_port = htons(atoi(argv[1]));if (bind(recv_sock, (struct sockaddr *)&adr, sizeof(adr)) == -1)error_handling("bind() error");while (1){// 通过 recvfrom 函数接受数据。如果不需要知道传输数据的主机地址信息,可以向recvfrom函数的第5 6参数分贝传入 NULL 0str_len = recvfrom(recv_sock, buf, BUF_SIZE - 1, 0, NULL, 0);if (str_len < 0)break;buf[str_len] = 0;fputs(buf, stdout);}close(recv_sock);return 0;
}void error_handling(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}

基于 Windows 的实现

在Windows平台中,该技术的套接字设置没有区别,只需要修改对应的变量和头文件即可。

基于 Windows 的多播示例程序

news_sender_win.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>#define TTL 64
#define BUF_SIZE 30void ErrorHanding(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char *argv[])
{WSADATA wsaData;SOCKET sendSock;SOCKADDR_IN mulAddr;int timeLive = TTL;char buf[BUF_SIZE];if (argc != 3){printf("Usage: %s <GroupIP> <port>\n", argv[0]);exit(1);}if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)ErrorHanding("WSAStartup() error!");sendSock = socket(PF_INET, SOCK_DGRAM, 0);if (sendSock == INVALID_SOCKET)ErrorHanding("socket() error!");memset(&mulAddr, 0, sizeof(mulAddr));mulAddr.sin_family = AF_INET;mulAddr.sin_addr.s_addr = inet_addr(argv[1]);mulAddr.sin_port = htons(atoi(argv[2]));setsockopt(sendSock, IPPROTO_IP, IP_MULTICAST_TTL, (void *)&timeLive, sizeof(timeLive));FILE *fp = fopen("news.txt", "r");if (fp == NULL)ErrorHanding("fopen() error!");while (!feof(fp)){fgets(buf, BUF_SIZE, fp);sendto(sendSock, buf, strlen(buf), 0, (SOCKADDR *)&mulAddr, sizeof(mulAddr));Sleep(2000);}closesocket(sendSock);WSACleanup();return 0;
}

news_receiver_win.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>#define BUF_SIZE 30void ErrorHanding(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char *argv[])
{WSADATA wsaData;SOCKET recvSock;SOCKADDR_IN recvAddr;struct ip_mreq joinAddr;int strLen;char buf[BUF_SIZE];if (argc != 3){printf("Usage: %s <GroupIP> <port>\n", argv[0]);exit(1);}if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)ErrorHanding("WSAStartup() error!");recvSock = socket(PF_INET, SOCK_DGRAM, 0);if (recvSock == INVALID_SOCKET)ErrorHanding("socket() error!");memset(&recvAddr, 0, sizeof(recvAddr));recvAddr.sin_family = AF_INET;recvAddr.sin_addr.s_addr = htonl(INADDR_ANY);recvAddr.sin_port = htons(atoi(argv[2]));if (bind(recvSock, (SOCKADDR *)&recvAddr, sizeof(recvAddr)) == SOCKET_ERROR)ErrorHanding("bind() error!");joinAddr.imr_multiaddr.s_addr = inet_addr(argv[1]);joinAddr.imr_interface.s_addr = htonl(INADDR_ANY);if (setsockopt(recvSock, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *)&joinAddr, sizeof(joinAddr)) == SOCKET_ERROR)ErrorHanding("setsocket() error!");while (1){strLen = recvfrom(recvSock, buf, BUF_SIZE - 1, 0, NULL, 0);if (strLen < 0)break;buf[strLen] = '\0';fputs(buf, stdout);}closesocket(recvSock);WSACleanup();return 0;
}

编译:

gcc news_sender_win.c -lwsock32 -o newsSendWin
gcc news_receiver_win.c -lwsock32 -o newsRecvWin

运行结果:

// 接收端
C:\Users\81228\Documents\Program\TCP IP Project\Chapter 14>newsRecvWin 224.1.1.2 9190
Chinese President Xi Jinping on Monday called for building a fair and equitable global governance system, while warning against politicizing economic issues, fragmenting the global market and taking protectionist moves, in remarks delivered at the Session II of the 19th G20 Summit in Rio de Janeiro, Brazil.
// 发送端
C:\Users\81228\Documents\Program\TCP IP Project\Chapter 14>newsSendWin 224.1.1.2 9190

基于 Windows 的本地广播示例程序

news_sender_local_broad_win.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>#define BUF_SIZE 30void ErrorHanding(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char *argv[])
{WSADATA wsaData;SOCKET sendSock;SOCKADDR_IN localBroadAddr;int brd = 1;char buf[BUF_SIZE];if (argc != 3){printf("Usage: %s <GroupIP> <port>\n", argv[0]);exit(1);}if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)ErrorHanding("WSAStartup() error!");sendSock = socket(PF_INET, SOCK_DGRAM, 0);if (sendSock == INVALID_SOCKET)ErrorHanding("socket() error!");memset(&localBroadAddr, 0, sizeof(localBroadAddr));localBroadAddr.sin_family = AF_INET;localBroadAddr.sin_addr.s_addr = inet_addr(argv[1]);localBroadAddr.sin_port = htons(atoi(argv[2]));// 广播setsockopt(sendSock, SOL_SOCKET, SO_BROADCAST, (void *)&brd, sizeof(brd));FILE *fp = fopen("news.txt", "r");if (fp == NULL)ErrorHanding("fopen() error!");while (!feof(fp)){fgets(buf, BUF_SIZE, fp);sendto(sendSock, buf, strlen(buf), 0, (SOCKADDR *)&localBroadAddr, sizeof(localBroadAddr));Sleep(2000);}closesocket(sendSock);WSACleanup();return 0;
}

news_receiver_local_broad_win.c:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>#define BUF_SIZE 30void ErrorHanding(char *message)
{fputs(message, stderr);fputc('\n', stderr);exit(1);
}int main(int argc, char *argv[])
{WSADATA wsaData;SOCKET recvSock;SOCKADDR_IN recvAddr;int strLen;char buf[BUF_SIZE];if (argc != 2){printf("Usage: %s <port>\n", argv[0]);exit(1);}if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)ErrorHanding("WSAStartup() error!");recvSock = socket(PF_INET, SOCK_DGRAM, 0);if (recvSock == INVALID_SOCKET)ErrorHanding("socket() error!");memset(&recvAddr, 0, sizeof(recvAddr));recvAddr.sin_family = AF_INET;recvAddr.sin_addr.s_addr = htonl(INADDR_ANY);recvAddr.sin_port = htons(atoi(argv[1]));if (bind(recvSock, (SOCKADDR *)&recvAddr, sizeof(recvAddr)) == SOCKET_ERROR)ErrorHanding("bind() error!");while (1){strLen = recvfrom(recvSock, buf, BUF_SIZE - 1, 0, NULL, 0);if (strLen < 0)break;buf[strLen] = '\0';fputs(buf, stdout);}closesocket(recvSock);WSACleanup();return 0;
}

编译:

gcc news_sender_local_broad_win.c -lwsock32 -o newsSendLocalBroadWin
gcc news_receiver_local_broad_win.c -lwsock32 -o newsRecvLocalBroadWin

运行结果:

// 接收端
C:\Users\81228\Documents\Program\TCP IP Project\Chapter 14>newsRecvLocalBroadWin 9190
Chinese President Xi Jinping on Monday called for building a fair and equitable global governance system, while warning against politicizing economic issues, fragmenting the global market and taking protectionist moves, in remarks delivered at the Session II of the 19th G20 Summit in Rio de Janeiro, Brazil.
// 发送端
C:\Users\81228\Documents\Program\TCP IP Project\Chapter 14>newsSendLocalBroadWin 255.255.255.255 9190

基于 Windows 的直接广播示例程序

前一小节的程序不用变,我们将本地广播地址改成自己主机的地址。

按下 win + R,输入 cmd,进入,输入 ipconfig 指令,就能找到自己主机的 IPv4 地址。

在这里插入图片描述

再次运行程序,修改发送端指定的发送 IP 地址为我们主机的地址。

运行结果:

// 接收端
C:\Users\81228\Documents\Program\TCP IP Project\Chapter 14>newsRecvLocalBroadWin 9190
Chinese President Xi Jinping on Monday called for building a fair and equitable global governance system, while warning against politicizing economic issues, fragmenting the global market and taking protectionist moves, in remarks delivered at the Session II of the 19th G20 Summit in Rio de Janeiro, Brazil.
// 发送端
C:\Users\81228\Documents\Program\TCP IP Project\Chapter 14>newsSendLocalBroadWin 192.168.113.1 9190

多播 VS 广播

对比

  • 接收者范围: 广播发送给所有设备,而多播只发送给特定的组。
  • 网络效率: 多播比广播更高效,因为它减少了不必要的数据传输。
  • 地址类型: 广播使用广播地址,多播使用多播地址。
  • 适用场景: 广播适用于需要通知所有设备的场景,而多播适用于需要向特定群体发送数据的场景。

多播的使用场景

  1. 大规模数据分发: 股票市场信息、新闻更新或在线直播。
  2. 视频会议和在线教育
  3. IPTV和多媒体流
  4. 网络监控和安全
  5. 分布式计算
  6. 实时数据服务: 天气更新、交通信息或金融市场数据,可以多播给所有订阅服务的用户。

广播的使用场景

  1. 局域网内通信: 如打印作业请求或网络发现协议。
  2. 设备发现: 一些设备和服务使用广播来发现网络上的其他设备。
  3. 游戏和娱乐: 在局域网游戏或多媒体应用中,广播可以用于快速发现和连接游戏服务器或媒体播放设备。
  4. 紧急通知系统: 在某些情况下,可能需要向局域网内的所有设备发送紧急通知或警报。

习题

(1)TTL的含义是什么?请从路由器的角度说明较大的TTL值与较小的TTL值之间的区别及问题。

TTL是Time to Live的简写,意思是生存时间,是决定“数据包传递距离”的主要因素。

TTL的值设置过大将影响网络流量。当然,设置过小,也无法传递到目标。

(2)多播与广播的异同点是什么?请从数据通信的角度说明。

广播在“一次性向多个主机发送数据”这一点上与多播类似,但传输数据的范围有区别,多播即使在跨越不同网络的情况下,只要加入多播组就能接收数据,相反,广播只能向同一网络中的主机传输数据。

(3)下列关于多播的描述错误的是?

a. 多播是用来向加入多播组的所有主机传输数据的协议。
b. 主机连接到同一网络才能加入多播组,也就是说,多播组无法跨越多个网络。
c. 能够加入多播组的主机数并无限制,但只能有1个主机(Sender)向该组发送数据。
d. 多播时使用的套接字是UDP套接字,因为多播是基于UDP进行数据通信的。

答:b、c。

(4)多播也对网络流量有利,请比较TCP数据交换方式解释其原因。

若通过TCP向1000个主机发送文件,共需传递1000次,但此时若使用多播方式传输文件,则是需要发送1次,之后由路由器进行转发。

(5)多播方式的数据通信需要MBone虚拟网络。换言之, MBone是用于多播网络,但它是虚拟网络。请解释此处的“虚拟网络”。

“虚拟网络”是指一个不依赖于实际物理网络硬件的网络拓扑,它通过在现有物理网络上叠加逻辑结构和功能来实现特定目的。在多播通信中,MBone(Multicast Backbone)作为虚拟网络,起到了支持多播数据传输的作用。

具体来说,MBone的“虚拟网络”特性包含以下几点:

  1. 建立在现有的物理网络之上:
    MBone并不是一个独立的物理网络,而是通过软件配置和协议(如多播路由协议)在现有的IP网络(如互联网)中创建的逻辑网络。

  2. 逻辑拓扑:
    MBone使用一组支持多播的路由器(通常通过多播路由协议如 DVMRP 或 PIM)来构建虚拟链路。数据在这些逻辑链路之间传递,而不必依赖物理链路的具体布局。

  3. 多播组成员动态加入和离开:
    通过MBone,用户可以动态加入或离开一个多播组,这种灵活性由虚拟网络的逻辑实现,而不是由物理硬件决定。

  4. 支持多播流量的转发和优化:
    多播通常需要将一份数据高效地分发到多个目的地。MBone的虚拟网络通过在逻辑层次管理数据包的转发,避免了在物理网络中传输过多的冗余数据。

总结:MBone被称为虚拟网络,是因为它依赖现有的物理网络,通过软件和协议来构建支持多播通信的逻辑网络。它为多播通信提供了必要的基础设施,而无需物理网络的重新部署或重大改造。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/475837.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

利用 TensorFlow Profiler:在 AMD GPU 上优化 TensorFlow 模型

TensorFlow Profiler in practice: Optimizing TensorFlow models on AMD GPUs — ROCm Blogs 简介 TensorFlow Profiler 是一组旨在衡量 TensorFlow 模型执行期间资源利用率和性能的工具。它提供了关于模型如何与硬件资源交互的深入见解&#xff0c;包括执行时间和内存使用情…

游戏引擎学习第15天

视频参考:https://www.bilibili.com/video/BV1mbUBY7E24 关于游戏中文件输入输出&#xff08;IO&#xff09;操作的讨论。主要分为两类&#xff1a; 只读资产的加载 这部分主要涉及游戏中用于展示和运行的只读资源&#xff0c;例如音乐、音效、美术资源&#xff08;如 3D 模型和…

(二)Ubuntu22.04+Stable-Diffusion-webui AI绘画 中英双语插件安装

一、说明 看情况添加 二、双语安装 双语插件 https://github.com/journey-ad/sd-webui-bilingual-localization 中文语言包 https://github.com/dtlnor/stable-diffusion-webui-localization-zh_CN 先装中文语言包 错误&#xff1a;AssertionError: extension access disable…

UE5 DownloadImage加载jpg失败的解决方法

DownloadImage加载jpg失败的解决方法 现象解决方案具体方法 现象 用UE自带的 DownloadImage 无法下载成功&#xff0c;从 failure 引脚出来。 接入一个由监控器自动保存起的图像&#xff0c;有些可以正常加载成功&#xff0c;有些无法加载成功。 经调查问题出现在&#xff0c;…

Elasticsearch 中的热点以及如何使用 AutoOps 解决它们

作者&#xff1a;来自 Elastic Sachin Frayne 探索 Elasticsearch 中的热点以及如何使用 AutoOps 解决它。 Elasticsearch 集群中出现热点的方式有很多种。有些我们可以控制&#xff0c;比如吵闹的邻居&#xff0c;有些我们控制得较差&#xff0c;比如 Elasticsearch 中的分片分…

Statsmodels之OLS回归

目录 Statsmodels基本介绍OLS 回归实战实战1&#xff1a;实战2&#xff1a; Statsmodels基本介绍 Statsmodels 是 Python 中一个强大的统计分析包&#xff0c;包含了回归分析、时间序列分析、假设检验等等的功能。Statsmodels 在计量的简便性上是远远不及 Stata 等软件的&…

【接口封装】—— 1、加载样式表

函数定义 static void loadStyleSheet(QWidget* widget, const QString &fileName,const QString& otherStyleQString());&#xff08;头文件&#xff09;&#xff1a; #include <qfile.h> #include <QWidget> 源文件: void CommonUtils::loadStyleSheet(…

AI、VR与空间计算:教育和文旅领域的数字转型力量

在这个数字技术高速发展的时代&#xff0c;AI、VR技术及大空间计算技术&#xff0c;已成为推动多个行业革新的强劲动力。近日&#xff0c;世优科技推出了最新研发的VR大空间产品《山海经》&#xff0c;这一全新的沉浸式体验项目不仅重新定义了观展方式&#xff0c;还为文化旅游…

AWTK 最新动态:支持鸿蒙系统(HarmonyOS Next)

HarmonyOS是全球第三大移动操作系统&#xff0c;有巨大的市场潜力&#xff0c;在国产替代的背景下&#xff0c;机会多多&#xff0c;AWTK支持HarmonyOS&#xff0c;让AWTK开发者也能享受HarmonyOS生态的红利。 AWTK全称为Toolkit AnyWhere&#xff0c;是ZLG倾心打造的一套基于C…

数据库、数据仓库、数据湖、数据中台、湖仓一体的概念和区别

数据库、数据仓库、数据湖、数据中台和湖仓一体是数据管理和分析领域的不同概念&#xff0c;各自有不同的特点和应用场景。以下是它们的主要区别&#xff1a; 1. 数据库&#xff08;Database&#xff09; 定义&#xff1a;结构化的数据存储系统&#xff0c;用于高效地存储、检…

Linux运维篇-iscsi存储搭建

目录 概念实验介绍环境准备存储端软件安装使用targetcli来管理iSCSI共享存储 客户端软件安装连接存储 概念 iSCSI是一种在Internet协议上&#xff0c;特别是以太网上进行数据块传输的标准&#xff0c;它是一种基于IP Storage理论的存储技术&#xff0c;该技术是将存储行业广泛…

Django一分钟:django中收集关联对象关联数据的方法

场景&#xff1a;我有一个模型&#xff0c;被其它多个模型关联&#xff0c;我配置了CASCADE级联删除&#xff0c;我想要告知用户删除该实例之后&#xff0c;哪些关联数据将会被一同删除。 假设我们当前有这样一组模型&#xff1a; class Warehouse(models.Model):""…

iPhone 17 Air看点汇总:薄至6mm 刷新苹果轻薄纪录

我们姑且将这款iPhone 17序列的超薄SKU称为“iPhone 17 Air”&#xff0c;Jeff Pu在报告中提到&#xff0c;我同意最近关于 iPhone 17超薄机型采用6 毫米厚度超薄设计的传言。 如果这一测量结果被证明是准确的&#xff0c;那么将有几个值得注意的方面。 首先&#xff0c;iPhone…

Tcp协议Socket编程

&#x1f30e; Tcp协议Socket编程 本次socket编程需要使用到 日志文件&#xff0c;此为具体日志编写过程。以及 线程池&#xff0c;线程池原理比较简单&#xff0c;看注释即可。 文章目录&#xff1a; Tcp协议Socket编程 TCP Socket API简介 构建Tcp_echo_server      …

嵌入式系统中QT实现网络通信方法

大家好,今天主要给大家分享一下,如何使用QT中的网络编程实现。 第一:QT网络编程基本简介 QT中网络模块为提供了可以使用TCP/IP客户端与服务器的类。它提供了较低级别的类,例如代表低级网络概念的 QTcpSocket, QTcpServer 和 QUdpSocket,以及诸如 QNetworkRequest, QNetw…

【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)

【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现&#xff08;Kalman Filter&#xff09; 更新以gitee为准&#xff1a; 文章目录 数据预测概念和适用方式线性系统的适用性 数据预测算法和卡尔曼滤波公式推导状态空间方程和观测器先验估计后验估计…

大模型时代的具身智能系列专题(十三)

迪士尼研究中心 瑞士苏黎世迪斯尼研究中心致力于不同领域的业务活动&#xff0c;其中包括电影、电视、公园和度假村以及消费产品。我们针对所有这些领域进行科研工作。我们开发能使我们将后道生产元素整合到前级生产中的技术。由此可节省许多昂贵的效果&#xff0c;这些效果最…

IDEA2023设置控制台日志输出到本地文件

1、Run->Edit Configurations 2、选择要输出日志的日志&#xff0c;右侧&#xff0c;IDEA2023的Logs在 Modify option 里 选中就会展示Logs栏。注意一定要先把这个日志文件创建出来&#xff0c;不然不会自动创建日志文件的 IDEA以前版本的Logs会直接展示出来 3、但是…

o1的风又吹到多模态,直接吹翻了GPT-4o-mini

开源LLaVA-o1&#xff1a;一个设计用于进行自主多阶段推理的新型VLM。与思维链提示不同&#xff0c;LLaVA-o1独立地参与到总结、视觉解释、逻辑推理和结论生成的顺序阶段。 LLaVA-o1超过了一些更大甚至是闭源模型的性能&#xff0c;例如Gemini-1.5-pro、GPT-4o-mini和Llama-3.…

AJAX的基本使用

AJAX的基本使用 &#x1f389;&#x1f389;&#x1f389;欢迎来到我的博客,我是一名自学了2年半前端的大一学生,熟悉的技术是JavaScript与Vue.目前正在往全栈方向前进, 如果我的博客给您带来了帮助欢迎您关注我,我将会持续不断的更新文章!!!&#x1f64f;&#x1f64f;&#x…