udp 广播 和 多播

使用UDP协议进行信息的传输之前不需要建议连接。换句话说就是客户端向服务器发送信息,客户端只需要给出服务器的ip地址和端口号,然后将信息封装到一个待发送的报文中并且发送出去。至于服务器端是否存在,或者能否收到该报文,客户端根本不用管。

通常我们讨论的udp的程序都是一对一的单播程序。本章将讨论一对多的服务:广播(broadcast)多播(multicast)。对于广播,网络中的所有主机都会接收一份数据副本。对于多播,消息只是发送到一个多播地址,网络知识将数据分发给哪些表示想要接收发送到该多播地址的数据的主机。总得来说,只有UDP套接字允许广播或多播。

UDP广播
广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。

广播地址通常用于在网络游戏中处于同一本地网络的玩家之间交流状态信息等。广播就不在写演示程序了,读者可以将ECHO程序的ip地址改为广播地址即可。

其实广播顾名思义,就是想局域网内所有的人说话,但是广播还是要指明接收者的端口号的,因为不可能接受者的所有端口都来收听广播。

同一网段所有主机都能接收,前提是端口要监听

客户端发送广播,开启端口监听的服务端接收并打印消息

UDP多播
同样的UDP多播也要指明接受者的端口号,而且与广播相似的是多播与单播之间的区别还在于地址。ipv4中的多播地址范围是:224.0.0.0到239.255.255.255。在JAVA中,多播一样十分好实现,要实现多播,就要用到MulticastSocket类,其实该类就是DatagramSocket的子类,在使用时除了多播自己的一些特性外,把它当做DatagramSocket类使用就可以了。

多播数据报套接字类用于发送和接收 IP 多播包。MulticastSocket 是一种 (UDP) DatagramSocket,它具有加入 Internet 上其他多播主机的“组”的附加功能。

多播组通过 D 类 IP 地址和标准 UDP 端口号指定。D 类 IP 地址在 224.0.0.0 和 239.255.255.255 的范围内(包括两者)。地址 224.0.0.0 被保留,不应使用。

可以通过首先使用所需端口创建 MulticastSocket,然后调用 joinGroup(InetAddress groupAddr) 方法来加入多播组:(以上是jdk-doc的说明,补充如下:服务器和客户端必须都要加入相同的组播地址才可以)

若一个主机把帧发送给属于多播组的多个主机,则称为多播。
单播:单台主机与单台主机之间的数据通信;
广播:单台主机向网络中所有主机发送数据报的过程;
多播:单台主机向选定的一组主机发送数据报的过程;

多播也称为组播,组播是向指定的一组主机发送数据包。与单播相比,提高了发送数据包的效率,与广播相比,减少了网络流量。与广播不同的是,要实现组播需要在接受组播的客户机上安装相应的客户端程序。能接收发送一个特定多播组地址数据的主机集合称为主机组。

IP 多播提供两类服务:

向多个目的地址传送数据;
客户对服务器的请求;

参考网址:

《网络编程》广播和多播
https://blog.youkuaiyun.com/chenhanzhun/article/details/42006385

局域网UDP组播与设备自动发现测试
https://www.jianshu.com/p/8ccd0b99766f?from=singlemessage

除了AirKiss、SmartConfig此类网络应用技巧,我们需要尽可能利用手头开源硬件来测试传统的TCP/UDP连接。其中UDP的组播在物联网应用中有一定的重要意义。主要的UDP组播应用协议有:

  • mDNS
  • SSDP/uPnP
  • Apple AirPlay
  • DLNA,各类媒体播放器

  • IP组播与IGMP

IGMP(Internet Group Management Protocol)协议告诉路由器,在所在子网内有客户端对发送到某一个组播组的数据感兴趣,这样当该组的数据到达后,路由器会转送给所有感兴趣的客户端。

首先怀疑WiFi路由器禁止了IGMP和uPnP服务,测试下来,同一WiFi局域网内,电视和手机的媒体推送没有任何问题。

但即便开启了Windows的Bonjour服务,关闭了防火墙,依然失败。推测Windows的网路配置上依然存在问题,这是Windows 10以及Ubuntu子系统无法侦听和推送多播报文的主要原因。Windows 10自带的Ubuntu子系统受控于操作系统防火墙,无法收发组播报文。

ESP8266

以组播为基础的mDNS/SSDP作为IoT最大的好处就是可以通过这两项服务构建起一个本地的IoT设备生态,无论是办公司、家居、工业、农业、军事等。均可以通过IPv4/v6组播实现自动接入、然后利用TCP/UDP的单播进行后续认证和协同。

ESP8266自带mDNS/SSDP例子。之所以对组播感兴趣也就是因为自己要做些产品而做得实验。

iperf的其他版本

iperf是法国人写的,除了最初的Linux,还支持32bit/64bit Windows,以及Android,iOS,Mac等,主流平台都得到了支持。如果Chrome/Android/iOS移动端的JavaScript runtime支持组播,那么甚至可以不需要Java/C/C++/Python的参与了。

作者:小鱼儿他老汉
链接:https://www.jianshu.com/p/8ccd0b99766f
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

mdns协议

mdns(即多播dns,Multicast DNS)主要实现了在没有传统DNS服务器的情况下使局域网内的主机实现相互发现和通信,使用的端口为5353,遵从dns协议,使用现有的DNS信息结构、语法和资源记录类型,并且没有指定新的操作代码或响应代码。

在局域网中,设备和设备之前相互通信需要知道对方的ip地址等信息,大多数情况,设备的ip不是静态的,而是通过dhcp协议动态分配的,如何发现设备彼此间的服务呢?现在物联网设备和app之间的通信,要么通过广播,要么通过组播,发一些特定信息,感兴趣的设备应答,实现局域网设备的发现,当然mdns比这强大的多。

mdns使用组播地址为224.0.0.251(ipv6:FF02::FB),端口为5353。mdns是用于局域网内部的,并且主机的域名以.local结尾,每个进入局域网的主机,如果开启了mDNS服务的话,都会向局域网内的所有主机组播一个消息——我是谁(域名)和IP地址是多少。然后其它有mdns服务的主机就会响应,也会告诉你——它是谁(域名)和IP地址是多少。当然设备需要服务时,就是使用mdns查询域名对对应的ip地址,对应的设备收到该报文后同样通过组播方式应答,此时其它主机设备也是可以收到该应答报文,其它主机也会记录域名和ip以及ttl等,更新缓存。

比如,A主机进入局域网,开启了mDNS服务,并向mDNS服务注册以下信息:提供FTP服务,IP是192.168.1.101,端口是21。当B主机进入局域网,并向B主机的mDNS服务请求,要找局域网内FTP服务器,B主机的mDNS就会去局域网内向其它的mDNS询问,并且最终告诉你,有一个IP地址为192.168.1.101,端口号是21的主机,也就是A主机提供 FTP服务,所以B主机就知道了A主机的IP地址和端口号了。

<think>好的,用户想了解UDP广播多播的区别以及它们的应用场景。首先我需要明确这两个概念的定义,然后比较它们的异同,再结合引用资料中的信息来织回答。 首先,广播(Broadcast)是指将数据包发送到同一网络内的所有设备。这意味着无论设备是否需要该数据,都会接收到。广播地址通常是特定的,比如IPv4中的255.255.255.255或子网广播地址。广播的优势是简单,但缺点也很明显,比如网络资源浪费可能引发广播风暴。 接着是多播(Multigroup),也称为多播允许数据包只发送给加入特定多播的设备。多播地址范围在IPv4中是224.0.0.0到239.255.255.255。多播更高效,因为它只传输给感兴趣的接收者,减少了网络流量。不过,多播需要路由器支持IGMP协议,且配置相对复杂。 根据引用资料,比如引用[3]提到UDP常用于广播多播,而引用[1][2]指出UDP适合实时性高的场景,比如视频、音频。因此,广播可能用于局域网内的通知,而多播适用于跨网络的流媒体传输。 需要区分两者的核心差异:广播是发给所有,多播是发给特定。应用场景方面,广播适合局域网服务发现,多播适合大规模流媒体分发。同时,要注意网络设备对两者的支持情况,比如多播需要路由器的支持,而广播通常局限在本地网络。 最后,结合用户提供的引用,确保回答准确并适当标注引用来源。比如引用[1]提到UDP用于广播多播,引用[3]提到具体应用如DNS、视频等。需要将这些信息整合到回答中,确保内容可靠。</think>### UDP广播多播的区别及场景分析 #### 1. **定义与传输范围** - **广播(Broadcast)**: 将数据包发送到同一网络内的所有设备(如局域网),无论设备是否需要该数据。广播地址是固定的(如IPv4中的$255.255.255.255$或子网广播地址)。 特点:简单但效率低,可能导致网络拥塞[^1][^3]。 - **多播(Multicast,)**: 将数据包仅发送给加入特定多播的设备。多播地址范围在IPv4中为$224.0.0.0$到$239.255.255.255$。 特点:针对性强,减少冗余流量,需网络设备(如路由器)支持IGMP协议[^1]。 #### 2. **核心差异** | **特性** | **广播** | **多播** | |------------------|----------------------------|----------------------------| | 目标设备 | 同一网络内所有设备 | 加入特定的设备 | | 地址类型 | 固定广播地址 | 动态多播地址范围 | | 网络资源占用 | 高(所有设备强制接收) | 低(仅内设备接收) | | 应用场景 | 局域网服务发现、简单通知 | 跨网络流媒体、实时数据传输 | | 配置复杂度 | 简单 | 需路由器协议支持 | #### 3. **应用场景** - **广播的典型应用**: - 局域网内设备发现(如ARP协议解析MAC地址)[^3]。 - 系统通知(如DHCP服务器分配IP地址)[^4]。 - **多播的典型应用**: - 实时音视频传输(如IPTV、在线会议系统),避免单重复传输。 - 分布式系统状态同步(如金融行情数据分发)[^2]。 #### 4. **优缺点对比** - **广播的局限性**: - 可能引发**广播风暴**,导致网络拥堵; - 无法跨子网传输,仅限本地网络。 - **多播的优势**: - 支持跨网络传输(需路由器配置); - 资源利用率高,适合大规模分发场景。 #### 5. **技术实现示例** - **广播代码片段(Python)**: ```python import socket sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) sock.sendto(b"Broadcast Message", ('255.255.255.255', 12345)) ``` - **多播代码片段(Java)**: ```java InetAddress group = InetAddress.getByName("224.0.0.1"); MulticastSocket socket = new MulticastSocket(12345); socket.joinGroup(group); socket.receive(packet); // 接收多播数据 ``` #### 6. **引用总结** 广播适用于**小范围、低复杂度**的通信(如局域网服务发现),而多播更适合**大规模、跨网络**的高效数据传输(如流媒体分发)[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值