您正在查看 "组播与igmp协议" 分类下的文章
2007年01月03日 星期三 下午 10:37
应用程序通过命令字IP_DROP_MEMBERSHIP使一个socket离开一个多播组,IP_DROP_MEMBERSHIP是一个IP层的命令字,其调用使用的参数是结构体struct ip_mreq。该结构体的两个成员分别用于指定所要离开的多播组的组IP地址,和所要离开组的那个本地接口的IP地址。
ip_setsockopt实现了该命令字,它通过调用ip_mc_leave_group使socket离开一个多播组。
表示INET域socket的结构体struct inet_sock的成员mc_list是该socket所加入的所有多播组的一个链表,ip_mc_leave_group从该 |
2006年12月31日 星期日 下午 03:41
应用程序通过命令字IP_ADD_MEMBERSHIP把一个socket加入到一个多播组,IP_ADD_MEMBERSHIP是一个IP层的命令字,其调用使用的参数是结构体struct ip_mreq,其定义如下:
struct ip_mreq
{
struct in_addr imr_multiaddr;
struct in_addr imr_interface;
};
该结构体的两个成员分别用于指定所加入的多播组的组IP地址,和 |
2006年12月21日 星期四 下午 06:38
5、组成员协议的描述
IGMP是一个非对称的协议,分别指定组成员(即那些希望接收多播数据报的主机和路由器)和多播路由器的行为。本节主要描述IGMPv3运用于所有组成员 的那部分(需要注意的是,一个同时是组成员的多播路由器会同时执行IGMPv3的两部分,对来自自己的和邻居的IGMP消息,它都会接收和报告。 IGMPv3的多播路由器部分在第6节描述)。
一个系统在所有支持多播接收的接口上执行本节所描述的协议,即使有多个接口连接在同一网络上也是如此。
为了能跟运行旧版 |
2006年12月21日 星期四 下午 06:37
备忘录状态
略
摘要
本文档说明了因特网组管理协议的第3版,IGMPv3。IGMP协议被IPv4系统用于向邻接的多播路由器报告它们的组成员关系。第3版的IGMP增加了对“源过滤”的支持,即系统能够报告它只对接收到的发往某一特定多播组的数据报中,某些来自特定源地址的数据感兴趣,或者是只对除了某些特定源地址之外的数据感兴趣。这个信息能够被多播路由协议用于避免把某些来自特定源地址的多播数据报发往对它不感兴趣的网络。
1、简介
IGMP协议 |
2006年12月18日 星期一 下午 12:51
1、定义
略
2、简介
因特网组管理协议(IGMP)被IP主机用于向所有的直接相邻的多播路由器报告它们的多播组成员关系。本文档只描述在主机和路由器之间的确定组成员关系的IGMP应用。作为多播组成员的路由器应当还能表现为一台主机,甚至能对自己的查询作出响应。IGMP还可以应用在路由器之间,但这种应用不在这里描述。
就像ICMP一样,IGMP作为整合在IP里面的一部分。所有希望接收IP组播的主机都 |
2006年12月16日 星期六 上午 11:38
1、备忘录状态
略
2、简介
IP多播是用于把一个IP数据报传送给一个由多个主机组成的“组”,传送中,使用一个目的IP地址来标识由0个或多个主机组成的组。就像单播的IP数据一样,一个多播IP数据报被尽可能可靠地传送到它的目的组中的每一台主机。也就是说,数据报是不保证能够完整地到达目的组中的每一台主机,也不能保证跟其它数据报之间不会乱序。
多播组的成员是动态的,也就是说,任何时候,任何一个成员都 |
2006年07月25日 星期二 下午 10:18
前面一篇文章中提到的两个示例程序,它们虽然对外发送了组播数据报,但它们实际上调用的是协议栈中的单播发送的代码。一般情况下,它们不会有什么问题,但是它们不是标准的组播程序,下面我们看看协议栈究竟是如何发送组播数据报的。 我们还是以发送UDP的组播数据报为例。前面已经讲过,IP选项IP_MULTICAST_IF确定组播发送的接口,在通过系统调用设置该选项时,参数只需要一个本地网络接口的IP地址即可,myudp_sendmsg函数在发送组播数据报时,会以该选项设定的IP地址作为输出路由查询的源地址。 对于一个输出组播数据报,协议栈也要做检查,检查该组播发送的接口是否也加入了同一个组播组(即检查net_device->in_device->mc_list链表,查看是否存在跟输出组播数据报目的地址相同的组),如果检查结果确实加入了同一个组(本机可能有其它进程在同一网络设备口上,在该组中接收数据报),则把组播输出函数指定为myip_mc_output,该函数与普通的IP数据报输出函数相比,多了一个判断,如果启用了组播环路,则先向loopback接口发送一个组播数据报,确保本机需要接收该组中的数据的进程能收到数据。组播环 |
2006年07月24日 星期一 下午 10:15
我们还是以发送UDP的组播数据为例。其实发送一个UDP的组播数据报跟发送一个单播UDP数据报的差别并不大。 首先是在myudp_sendmsg函数中,如果发送接口的源地址没有确定,并且目的地址是组播地址的话,则源地址使用inet_sock->mc_addr。而发送接口的源地址首先是通过inet_sock->saddr来确定的,如果发现inet_sock->saddr为零,才会采用inet_sock->mc_addr的值。 通过前面的文章,我们可以了解到bind系统调用的作用就是为一个本地套接口指定发送源地址和接收地址(即把一个本地套接口绑定在一个本地网络设备接口上)。而组播选项IP_MULTICAST_IF用于指定组播数据报的发送接口,两者的功能似乎有些重复。bind影响的是inet_sock的成员rcv_saddr, saddr, sport,分别表示接收地址(输入数据报首部中指定该地址为目的地址的,将被接收),发送源地址(本地某个网络设备接口的地址),发送和接收的端口。对于单播的情况,显然rcv_saddr==saddr,因为一般来讲 ,一个应用程序总是使用一个网络设备接口进行数据的收发的。但如果应用程序非要把一个组播地址和端口绑定到一个本地套接口上,则bind系统调用 |
2006年07月23日 星期日 下午 04:48
前面我们已经讲到了加入一个组播组的IP选项IP_ADD_MEMBERSHIP,关于组播的IP选项,除了这个,还有总共四个,它们分别是IP_DROP_MEMBERSHIP,IP_MULTICAST_IF,IP_MULTICAST_TTL,IP_MULTICAST_LOOP,下面分别一一介绍。 IP_DROP_MEMBERSHIP表示退出一个组播组,该选项最终会调用内核函数myip_mc_leave_group。该函数首先拿到结构体struct in_device,取走要离开的组的源过滤机制,即从in_device->mc_list中找到对应的组struct ip_mc_list,将其成员sfcount[sfmode]减一,然后从其成员sources中取走相应的过滤源。然后将in_device->mc_list中该组所在的节点的引用计数减一,如果引用计数已经减为零了,则清struct net_device和struct in_device中该组的记录。最后,套接字结构体struct inet_sock的成员mc_list中有关该组的节点也被删除。至此,完成离开一个组播组的操作,该选项的参数是结构体struct ip_mreq,同IP_ADD_MEMBERSHIP。 IP_MULTICAST_IF是一个用于确定提交组播报文的接口,它的参数也是struct ip_mreq,通过该参数指定发送组播报文所使用的本地IP地址和本地网络设备接口的索引号,用 |
2006年07月23日 星期日 下午 01:02
前面我们讲到如何加入到一个组播组中,当一个客户端完成了加入一个组播组的操作后,就可以从该组接收数据了。下面我们看看组播数据报接收的详细流程。 通过加入组播组的操作后,网络设备接口已经知道要接收该组的数据报,所以组播数据会从网卡接收进来,一直到达myip_rcv函数,我们就从myip_rcv函数开始,跟踪整个组播数据报的接收流程。 同样,myip_rcv还是先检查数据报的类型(是否为本机需要接收的包),ip首部是否正确,然后调用myip_rcv_finish。myip_rcv_finish对任何数据报都要先查找输入路由,输入路由查找函数是myip_route_input,当该函数在路由缓存myrt_hash_table中找不到相应的路由项时,判断数据报的输入地址,如果发现是组播地址,就不能简单地查找FIB,而是要作特殊处理。 首先,调用myip_check_mc对这个组播数据报作检查,从网络设备接口的struct in_device中去匹配组播地址,如果匹配不到,表示这个不是我们希望接收的组播包,丢弃。匹配到了,则作下一步检查,如果这本身就是一个IGMP包,则接收,否则,查看这个组播组在我们的struct in_device中设置的过滤 |
2006年07月22日 星期六 下午 10:36
网络中的一台主机如果希望能够接收到来自网络中其它主机发往某一个组播组的数据报,那么这么主机必须先加入该组播组,然后就可以从组地址接收数据包。在广域网中,还涉及到路由器支持组播路由等,但本文希望以一个最为简单的例子解释清楚协议栈关于组播的一个最为简单明了的工作过程,甚至,我们不希望涉及到IGMP包。 我们先从一个组播客户端的应用程序入手来解析组播的工作过程: #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <string.h> #include "my_inet.h" #include <arpa/inet.h> #define MAXBUF 256 #define PUERTO 5000 #define GRUPO "224.0.1.1" int main(void) { int fd, n, r; |
2006年07月21日 星期五 上午 07:10
上一篇我们讲到,因为my_inet是系统中第二个加载的IPv4模块,所以网络设备接口早已完成了加入IGMP_ALL_HOST组的操作,my_inet只是简单增加引用计数和源过滤计数,下面我们来看看,第一个加载的IPv4模块(即内核原有的TCP/IP协议栈模块)是如何把网络设备接口加入IGMP_ALL_HOST组的。 在myip_mc_inc_group函数中,首先检查in_device->mc_list列表中已加入的组播组,看本接口是否已经加入了IGMP_ALL_HOST组,结果当然是没有。则,首先创建一个新的结构体struct ip_mc_list *im,初始化其成员值,设成员multiaddr为组播地址224.0.0.1,sf_mode为MCAST_EXCLUDE,sfcount[MCAST_EXCLUDE]为1,sources为NULL,表示使用一个源过滤机制,该机制不过滤任何组播源。成员loaded为0,表示该组播组尚未被载入(稍后将看到载入的操作)。初始化完成后,将这个新的组播组加入到mc_list链表的表头。 前面讲到过,mc_tomb也是in_device的一个成员,也表示一个组播组列表,这个列表中的组应该是不活跃的(当前不在使用的,具体留待以后分析),新的组加入到mc_list成功后,还要到这个列表中查找,看是否也存在于这个列 |
2006年07月20日 星期四 下午 11:13
我们知道在内核中用结构体struct net_device标识一个网络设备接口,该结构体有一个成员指针ip_ptr,它是留给IPv4协议用于填充协议相关的一些数据的。IPv4协议的模块将其指向一个结构体struct in_device,该结构体含有很多协议相关的数据,比如配置在这个网络设备接口上的所有的IPv4的地址,该网络设备接口接受的组播地址等,下面是其完整的定义: struct in_device { struct net_device *dev; atomic_t refcnt; int dead; struct in_ifaddr *ifa_list; //IP地址列表 rwlock_t mc_list_lock; struct ip_mc_list *mc_list; //IP组播过滤列表。 |
|
|