UDP(组播)原理及应用

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网络编程之多播 (特别推荐)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,816评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,729评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,300评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,780评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,890评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,084评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,151评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,912评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,355评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,666评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,809评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,504评论 4 334
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,150评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,882评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,121评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,628评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,724评论 2 351

推荐阅读更多精彩内容