发布时间:2013-01-18 19:30:51
上一篇我们讲到,因为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组,结果当然是没有。则,首先创建一个新的结构体s......【阅读全文】
发布时间:2013-01-18 19:30:44
前面我们讲到如何加入到一个组播组中,当一个客户端完成了加入一个组播组的操作后,就可以从该组接收数据了。下面我们看看组播数据报接收的详细流程。 通过加入组播组的操作后,网络设备接口已经知道要接收该组的数据报,所以组播数据会从网卡接收进来,一直到达myip_rcv函数,我们就从myip_rcv函数开始,跟踪整个组播数据报的接收流程。 同样,myip_rcv还是先检查数据报的类型(是否为本机需要接收的包),ip首部是否正确,然后调用myip_rcv_finish。 myip_rcv_finish对任何数据报都要先查找输......【阅读全文】
发布时间:2013-01-18 19:30:41
前面我们已经讲到了加入一个组播组的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中找到对......【阅读全文】
发布时间:2013-01-18 19:30:35
我们还是以发送UDP的组播数据为例。其实发送一个UDP的组播数据报跟发送一个单播UDP数据报的差别并不大。 首先是在myudp_sendmsg函数中,如果发送接口的源地址没有确定,并且目的地址是组播地址的话,则源地址使用 inet_sock->mc_addr。而发送接口的源地址首先是通过inet_sock->saddr来确定的,如果发现 inet_sock->saddr为零,才会采用inet_sock->mc_addr的值。 通过前面的文章,我们可以了解到bind系统调用的......【阅读全文】