欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

UDP(组播)原理和应用

最编程 2024-06-17 09:25:34
...

1、定义

用户数据报协议(UDP,User Datagram Protocol),无连接的传输层协议,提供面向事务的简单不可靠信息传送服务。

2、主要特点

2.1、无连接的,即通信时不需要创建连接(发送数据结束时也没有连接可以释放)所以减小了开销和发送数据前的时延;

2.2、采用最大努力交付,不保证可靠交付,因此主机不需要维护复杂的连接状态;

2.3、面向报文,只在应用层交下来的报文前增加了首部后就向下交付IP层;

2.4、无阻塞控制,即使网络中存在阻塞,也不会影响发送端的发送频率

2.5、支持一对一、一对多、多对一、多对多的交互通信

2.6、首部开销小,只有8个字节,比TCP的20个字节的首部要短。

3、报文结构
image

源端口:这个字段占据 UDP 报文头的前 16 位,通常包含发送数据报的应用程序所使用的 UDP 端口。接收端的应用程序利用这个字段的值作为发送响应的目的地址。这个字段是可选的,所以发送端的应用程序不一定会把自己的端口号写入该字段中。如果不写入端口号,则把这个字段设置为 0。这样,接收端的应用程序就不能发送响应了。

目的端口:接收端计算机上 UDP 软件使用的端口,占据 16 位。

长度:该字段占据 16 位,表示 UDP 数据报长度,包含 UDP 报文头和 UDP 数据长度。因为 UDP 报文头长度是 8 个字节,所以这个值最小为 8。

校验值:该字段占据 16 位,可以检验数据在传输过程中是否被损坏。

4、三种通信模式
image

4.1、单播

客户端与服务器之间的点对点通信

4.2、 多播 (组播)

多播,也称为“组播”,将网络中同一业务类型主机进行了逻辑上的分组,进行数据收发的时候其数据仅仅在同一分组中进行,其他的主机没有加入此分组不能收发对应的数据。

4.2.1、特点分析:

组播模式具有如下的优点:

1、具有同种业务的主机加入同一数据流,共享同一通道,节省了带宽和服务器的优点。

2、服务器的总带宽不受客户端带宽的限制,服务器端的带宽是常量,与客户端的数量无关。

3、允许在广域网进行传输的。

缺点:

1、没有纠错机制;

2、需要路由器及网络协议栈的支持;

4.2.2、组播地址范围:

组播的地址是特定的,D类地址用于多播,即224.0.0.0至239.255.255.255之间的IP地址,并被划分为局部连接多播地址、预留多播地址和管理权限多播地址3类:

1、局部多播地址:在224.0.0.0~224.0.0.255之间,这是为路由协议和其他用途保留的地址,路由器并不转发属于此范围的IP包。

2、预留多播地址:在224.0.1.0~238.255.255.255之间,可用于全球范围(如Internet)或网络协议。

3、管理权限多播地址:在239.0.0.0~239.255.255.255之间,可供组织内部使用,类似于私有IP地址,不能用于Internet,可限制多播范围。

4.2.3、socket选项:

IP_MULTICAST_TTL:设置多播组数据的TTL值

IP_ADD_MEMBERSHIP:在指定接口上加入组播组

IP_DROP_MEMBERSHIP:退出组播组

IP_MULTICAST_IF:获取默认接口或设置接口

IP_MULTICAST_LOOP:禁止组播数据回送

4.2.4、程序设计框架:

(1)建立一个socket。

(2)然后设置多播的参数,例如超时时间TTL、本地回环许可LOOP等。

(3)加入多播组。

(4)发送和接收数据。

(5)从多播组离开。

4.3、广播

主机之间一对所有”的通讯模式,广播者可以向网络中所有主机发送信息。

广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发

5、组播通信流程

发送组播消息的一端需要将数据发送到组播地址和固定的端口上,想要接收组播消息的终端需要绑定对应的固定端口然后加入到组播的群组,最终就可以实现数据的共享。

image

5.1、发送端

1、创建通信套接字

// 第二个参数是 SOCK_DGRAM, 第三个参数0表示使用报式协议中的udp
int fd = socket(AF_INET, SOCK_DGRAM, 0);

2、设置UDP组播属性,发送方不需要绑定端口

// 设置组播属性
struct in_addr opt;
// 将组播地址初始化到这个结构体成员中
inet_pton(AF_INET, "239.0.1.10", &opt.s_addr);
setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF, &opt, sizeof(opt));

3、使用组播地址发送组播消息到固定的端口(接收端需要绑定这个端口)

sendto();

4、关闭套接字(文件描述符)

close(fd);

5.2、接收端

1、创建通信的套接字

// 第二个参数是 SOCK_DGRAM, 第三个参数0表示使用报式协议中的udp
int fd = socket(AF_INET, SOCK_DGRAM, 0);

2、绑定固定的端口,发送端应该将数据发送到接收端绑定的端口上

bind();

3、加入到组播组

// 加入到多播组
struct ip_mreqn opt;
// 要加入到哪个多播组, 通过组播地址来区分
inet_pton(AF_INET, "239.0.1.10", &opt.imr_multiaddr.s_addr);
opt.imr_address.s_addr = INADDR_ANY;
opt.imr_ifindex = if_nametoindex("ens33");
setsockopt(fd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &opt, sizeof(opt));

4、接收组播数据

recvfrom();

5、关闭套接字(文件描述符)

close(fd);

6、组播的两种服务模型

6.1、ASM:Any Source Multicast 任意源组播

使用组播组地址来标识一个组播会话。
在这种模型下,任何发送方可以发送给任何组
对应socket选项:

选项名 数据类型 说明
IP_ADD_MEMBERSHIP struct ip_mreq 加入一个组播组
IP_DROP_MEMBERSHIP struct ip_mreq 离开一个组播组

6.2、SSM:Source Specific Multicast 源特定组播

使用组播组地址和组播源地址,同时来标识一个组播会话。
这种模型下,每个组只有一个发送方,当一台主机加入一个组后,它会被指定一个信道地址。其中包括一个组地址和一个源IP地址
对应socket选项:

选项名 数据类型 说明
IP_ADD_SOURCE_MEMBERSHIP struct ip_mreq_source 加入一个源特定多播组
IP_DROP_SOURCE_MEMBERSHIP struct ip_mreq_source 离开一个源特定多播组

ps:SSM模型需要通过IGMPv3的配合来维护主机与路由器之间的关系

参考资料:

1、百度百科-UDP(用户数据报协议)

2、UDP协议的特点

3、UDP报文格式详解

4、UDP 单播、广播、多播

5、UDP特性之组播(多播)(特别推荐)

6、组播之SSM ASM

7、ASM(任意源组播)和SSM(源特定组播)

8、Unix网络编程之多播 (特别推荐)