百度空间 | 百度首页 
               
 
查看文章
 
初识组播(2)
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成功后,还要到这个列表中查找,看是否也存在于这个列表中,如果存在,要删除,因为该组当前是活跃的。
    最后,调用myigmp_group_added完成真正的加入组播组的操作,对于IGMP_ALL_HOST这个组来讲,该函数做的事情相对比较少,它检查loaded成员,发现为0,则调用myip_mc_filter_add,加入一个网络设备级的组播地址。也就是说,代表网络设备接口的结构体struct net_device有一个成员mc_list,它是一个链表,每个结点代表一个组播组的mac地址。与in_device的mc_list中的组播IP地址对应。loaded为0时,我们要做的事情就是把IP地址224.0.0.1映射成一个mac地址加到net_device的mc_list链表中去,然后把loaded置1,该成员的结点定义如下:
    struct dev_mc_list
    {
        struct dev_mc_list  *next;
        __u8            dmi_addr[MAX_ADDR_LEN];
        unsigned char   dmi_addrlen;
        int             dmi_users;
        int             dmi_gusers;
    };
    dmi_addr是mac地址,dmi_addrlen是地址长度,dmi_users是引用计数。添加完成后,net_device的成员mc_count相应的加1。
    下面我们来看看组播IP地址是如何被映射成组播mac地址的。一个mac地址总共有6字节,48位,被分成两段:前3字节和后3字节,前3字节用于标识网卡的制造厂商,其中第40位(第一字节的最低位)用于标识组播,所以在网卡的mac地址中必须置0,后3字节是厂商内部使用的序列号。一个组播IP地址映射成mac地址的规则是:前三字节强制置01:00:5E,后3字节中,第23位置0,0-22位放入IP地址的0-23位。


类别:组播与igmp协议 | 添加到搜藏 | 浏览() | 评论 (23)
 
最近读者:
 
网友评论:
1
2006年07月22日 星期六 下午 01:17 | 回复
我想定位在协议编程方面。也就是在系统内核实现arp,ip,icmp,igmp,tcp,udp,等等。 也因为找工作,公司都要求有这方面的编程经验,希望找到一个项目来做一些实际编程工作。
 
3
2006年07月22日 星期六 下午 01:41 | 回复
这就好办了,去浙大的蓝晶书店,买一本《UNIX网络编程》,学完这本书就差不多了。实际编程工作嘛,写一个ftp客户端什么的就可以。
 
4
2006年07月22日 星期六 下午 02:41 | 回复
呵呵,这么简单? 我去看看
 
5
2006年07月22日 星期六 下午 02:58 | 回复
找了电子版,是W.Richard Stevens著的吧? <> <> 似乎不是我想看的。 还是先看看ICMP Shell的源代码,看看有什么收获,:)
 
6
2006年07月22日 星期六 下午 03:04 | 回复
那就祝你顺利了,一下子要进入内核还是有相当难度的。多多交流吧。:)
 
7
2006年07月22日 星期六 下午 05:55 | 回复
在Nettech版看到这个blog, 过来学习一下:) 不过想问一下, 大侠看的是2.6内核的协议栈么, 似乎跟TCP/IP详解第2卷的那套代码差异比较大了哎? 那本书还是可以参考吗?
 
8
2006年07月22日 星期六 下午 06:17 | 回复
你好,我看的协议的Linux 2.6.16内核的。TCP/IP详解第二卷的代码应该是4.4BSD_Lite版的,差异是相当大的。但原理是相通的。 我在学校时,读过这本书,硬啃了一遍,几乎是做了一遍无用功。当然,如果你能得到源代码,并试着编译,调试,那效果肯定是不错的。
 
9
2006年07月23日 星期日 上午 08:11 | 回复
好的, 我也相信不同的技术背后应该有想通的更抽象真理, 呵呵... 不过, 你这边看Linux 2.6.16内核有没有借助类似TCP/IP详解那样的参考资料呢? 因为我看详解已经看了一部分, 现在似乎习惯了有点参考的东东, 谢啦.
 
10
2006年07月23日 星期日 上午 09:13 | 回复
我在学习的过程中,始终坚持一点就是要可操作,也就是每行代码都要可以调试,可以看运行结果, 可以按自己的想法修改。光看,太抽象,很难深刻理解。所以,我是在自己写一个TCP/IP协议栈,参考么,那么大一个内核代码还不够参考啊?呵呵。遇到不清楚的,baidu一下或者google一下。,效率比查参考书要高。
 
11
2006年07月23日 星期日 下午 01:26 | 回复
嘿嘿, 知道啦, 以后多多交流 :D
 
12
2006年07月23日 星期日 下午 01:31 | 回复
多多交流,过几天,等我把组播部分完成了,我会把我的源代码放出来,有兴趣可以一起研究。我现的源代码非常方便,修改,insmod就可以看结果,加个调试语句,rmmod,再insmod,就又可以看到结果了。如果大家有兴趣,可以留下email,我发给你们。
 
13
2006年07月25日 星期二 下午 09:14 | 回复
嗯,我选择ICMP shell的一个原因也是想可以操作,也许我可以修改一点东西,然后得到一些新的特性 可是,昨天看了一天ICMP shell的源代码,发现没有注释的代码很难看啊。 又回到Linux了,今天看了看Linux1.0的网络部分的源代码,/net目录下的 问一下楼主,怎样修改源代码? 是修改源代码然后全部编译系统,然后。。。( 刚才没仔细看楼主的帖子,该打! ^_^ ) 给我发一个吧,谢谢!:7101227@sina.com 自己写的TCP/IP实现?佩服你了 你是我的目标,^_^
 
14
2006年07月25日 星期二 下午 09:22 | 回复
没问题,等我把组播发送调试完,大概明后天的样子发给你吧,目前大约一万行多一点的代码。 不过,先给你提个醒哦,我也是一行注释没有的,原来Linux内核中有的注释都被我删掉了,注释一般来讲,只是用来给开发同伴和自己提个醒,说明一些需要注意的地方,注释不能当文档读,更不能当教材看。 我的是一个模块,根本不需要编译整个系统,更不需要更新内核,重启系统。
 
15
2006年07月25日 星期二 下午 09:40 | 回复
呵呵,只是提个醒?这也许是你的一个误区吧,^_^ 觉得注释非常重要,写好代码后,再写一遍注释,对自己应该也很有帮助吧
 
16
2006年07月25日 星期二 下午 11:33 | 回复
热闹! 菜鸟加烂鸟飘过, 大家让我燃起希望!
 
18
2006年07月27日 星期四 下午 04:27 | 回复
呵呵,关于注释的问题,咱们还是各自保留意见吧,我觉得好的程序应该是“自注释”的。 那个“菜鸟加烂鸟”, 我大三的时候还不知道Linux是什么东东呢,呵呵,所以不用着急,只要坚持,你很快会成为牛人的。
 
19
2006年07月27日 星期四 下午 08:56 | 回复
感动,原来师兄在88当过VC版和LINUX版的版主啊
 
20
2006年07月27日 星期四 下午 09:09 | 回复
上过山,下过乡,啥都干过,呵呵。
 
21
2006年07月27日 星期四 下午 11:03 | 回复
lblin,代码已发给你,代码中已经包括了部分正在调试的TCP代码,还有部分应用程序例子,至于代码风格,你就不要作任何要求了,呵呵,很多东西都一知半解呢,根本没有精力顾及这些,为了编译模块方便,都是include在一个C文件里编译的。 等第二版重构时,再考虑这个问题吧。
 
22
2006年07月28日 星期五 下午 03:43 | 回复
收到了! 谢谢啊!
 
23
2008年03月21日 星期五 上午 11:50 | 回复
非常受益!现在正在学该方面的东西,忘能发我一份!谢谢了 yuanfeng1030@126.com
 
24
2008年07月09日 星期三 下午 06:21 | 回复
学习中,能不能发一份给我,谢谢 cccpu0316@163.com
 
25
2008年07月09日 星期三 下午 07:57 | 回复
作者还更新blog吗?
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu