1. 程式人生 > >UNP學習 多播

UNP學習 多播

圖片 路由 ipv6 所有 廣播 發現 cast glob global

一、概述

單播地址標識單個接口,廣播地址標識子網上的所有接口,多播地址標識一組接口。

單播和廣播是編址方案的兩個極端,多播的目的就在於提供一種折衷的方案。

二、多播地址

我們必須區分IPv4多播地址和IPv6多播地址。

IPv4

D類地址是多播地址,從244.0.0.0到239.255.255.255是多播地址。D類地址的低28位構成了多播組ID,而整個32位地址則稱為組地址。

下面是幾個特殊的IPv4多播地址:

  • 224.0.0.1是一個所有主機組,子網上所有具有多播能力的主機必須在所有具有多播能力的接口上加入該組。
  • 224.0.0.2是一個所有路由器組,所有多播路由器必須在所有具有多播能力的接口加入該組
  • 介於224.0.0.0到224.0.0.255間的地址稱為鏈路局部地址。用於保留低級拓撲發現和維護協議。

IPv6多播地址

IPv6多播地址的高序字節值為ff,組地址的低序32位拷貝到以太網地址的低序32位。以太網的高序2字節值為33:33.

以太網地址第一字節的低序2位表明該地址是一個本地管理組地址。本地管理意味著不能保證地址的唯一性,可能有除IPv6外的其他協議族共享同一網絡並使用同樣的以太網地址高序2字節值。

4位多播標誌用於區分眾所周知多播組和臨時多播組。該字段的高3為保留。IPv6多播地址還包含一個4位的範圍字段。

IPv6多播地址:

  • ff02::1是一個所有節點組。子網上的具有多播能力的所有主機必須在具有多播能力的所有接口上加入該組。
  • ff02::2是一個所有路由器組。所有子網上的多播路由器必須在具有多播能力的所有接口上加入該組。

多播地址的範圍:

1:節點局部即局部於節點

2:鏈路局部即局部於鏈路

3:網點局部即局部於網點

8:組織局部即局部於組織

14:全球(global)

三、局域網上多播和廣播的比較

四、廣域網上的多播

五、多播套接口選項

多播的API支持僅需要5個新的套接口選項

技術分享圖片

struct ip_mreq {
    struct in_addr imr_multiaddr;
    struct in_addr imr_interface;
};

struct ipv6_mreq {
    
struct in6_addr ipv6mr_multiaddr; unsigned int ipv6mr_interface; };

六、mcast_join和相關函數

#include "unp.h"
int mcast_join(int sockfd, const struct sockaddr * sa, socklen_t salen,
    const char *ifname, u_int ifindex);
int mcast_leave(int sockfd, const struct sockaddr *sa, socklen-t salen);
int mcast_set_if(int sockfd, const char *ifname, u_int ifindex);
int mcast_set_loop(int sockfd, int flag);
int mcast_set_ttl(int sockfd, int ttl);
返回:成功0,出錯-1
int mcast_get_if(int sockfd);
返回:成功非負接口索引,出錯-1
int mcast_get_loop(int sockfd);
返回:成功當前回饋標誌,出錯-1
int mcast_get_ttl(int sockfd);
返回:成功當前TTL或跳限,出錯-1

mcast_join函數加入一個多播組

mcast_leave離開一個多播組

mcast_set_if給外出多播數據報設置缺省的接口索引

mcast_set_loop設置回饋選項為1或0

UNP學習 多播