关闭

一个关于组播的网络问题--暂没有时间确定真实原因

标签: 网络debiannullkillcache工具
2440人阅读 评论(0) 收藏 举报

操作系统:Debian 3(内核2.6.8-2-686-smp)
网卡:四块网卡,驱动程序为e1000(e1000.ko)
应用程序:在其中一块或者多块网卡上启动heartbeat(向组播地址发包)
现象:heartbeat绑在ethx发送组播,然而ethx没有插网线,网卡口本身状态up,此时modprobe ip_conntrack,然后rmmod ip_conntrack,rmmod将会阻塞,通过ps查看它是running状态,发送SIGKILL给它也不行,此时只需要在ethx插上网线或者ifdown ethx,rmmod方可返回(此中ethx可以代表多个网卡口,若代表多个网卡,那么必须这几个网卡都插上线或者都ifdown了才可以);
分析过程:使用别的网卡是没有这个现象的,我的意思是说在别的不使用e1000驱动的网卡的机器上是没有这个问题的,另外不启动组播也是没有问题的,因此问题肯定在网卡驱动和组播。
内核代码情况:在ip_conntrack_core.c中有ip_conntrack_cleanup函数,肯定是在该函数中死循环了,因为/proc/net/ip_conntrack文件已经没有了,故而proc_net_remove("ip_conntrack")调用是成功的,按照下面的序列:
cleanup_proc:
    proc_net_remove("ip_conntrack");
 cleanup_init:
    ip_conntrack_cleanup();
 cleanup_nothing:
    return ret;
则肯定是ip_conntrack_cleanup的问题:
void ip_conntrack_cleanup(void)
{
    ip_ct_attach = NULL;
    synchronize_net();
 i_see_dead_people:
    ip_ct_selective_cleanup(kill_all, NULL);
    if (atomic_read(&ip_conntrack_count) != 0) {  //1
        schedule();
        goto i_see_dead_people;
    }
    while (atomic_read(&ip_conntrack_untracked.ct_general.use) > 1) //2
        schedule();
    kmem_cache_destroy(ip_conntrack_cachep);
    vfree(ip_conntrack_hash);
    nf_unregister_sockopt(&so_getorigdst);
}
该函数中有两个循环,一个是1处,一个是2处,经调试是1处死循环了,结果是ip_conntrack_count这个计数器一直是1,然而ip_ct_selective_cleanup中的:
while ((h = get_next_corpse(kill, data, &bucket)) != NULL)
其h返回却是NULL,进一步跟踪发现get_next_corpse是从ip_conntrack_hash中找数据的,而ip_conntrack_hash中的数据是在ip_confirm被加入的,也就是说在一个数据包必须离开内核的时候才会将其ip_conntrack加入到ip_conntrack_hash,然而ip_conntrack_count计数器却是在init_conntrack中被递增的,也就是在数据包刚进入内核的时候被递增的,这就在ip_conntrack_hash的更新和ip_conntrack_count的更新之间留下了一个时间段,不过这个时间段不要紧,内核并不保证ip_ct_selective_cleanup中的ip_conntrack_hash遍历的数目一定要和ip_conntrack_count完全一致,也就是说,一个ip_conntrack可以已经由于它的存在递增了ip_conntrack_count,但是它可以不加入ip_conntrack_hash哈希表,这样不会有任何问题,这是因为在ip_ct_selective_cleanup中遍历ip_conntrack_hash表,然后依次调用ip_conntrack_put来降之destroy掉,如果哈希表中没有的ip_conntrack则可以在别的内核路径调用ip_conntrack_put来destroy掉,进而在destroy中递减ip_conntrack_count这个计数器,最终肯定在ip_conntrack_cleanup中会得到计数器ip_conntrack_count成为0的信息,最终从i_see_dead_people这个不吉利的循环中出来。
     现在的问题就是为何在使用e1000驱动并且没有插网线发送组播的情况下(数据肯定发不出去),卸载ip_conntrack模块的时候没有任何内核路径调用ip_conntrack_put来释放这个游离的ip_conntrack,另外为何会有一个游离的ip_conntrack没有加入到ip_conntrack_hash哈希表却已经存在了,也即是它还没有准备从内核出去!此时,只要一插网线(在组播相关的所有网卡上插一下网线,哪怕插一下再拔下也行)或者ifdown所有的组播相关的网卡,一个ip_conntrack_put将被调用释放掉最后的那个游离ip_conntrack结构,递减掉最后的那个1,最终卸载ip_conntrack模块完成。
     目前没有时间来调试e1000的驱动,我觉得问题十有八九出在这个驱动里面,可能需要网卡工具对网卡设置一下什么的。

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

计算机网络(六)---IP多播

IP多播是需要在因特网上增加更多的智能才能提供的一种服务。 与单播相比,在一对多的通信中,多播可大大节约网络资源。当采用多播方式时,视频服务器只需要把视频分组当作多播数据报来发送,并且只需发送一次。当...
  • QQ1170836331
  • QQ1170836331
  • 2016-12-13 10:57
  • 1562

LInux Tcp 延迟确认问题

案例一:同事随手写个压力测试程序,其实现逻辑为:每秒钟先连续发N个132字节的包,然后连续收N个由后台服务回显回来的132字节包。其代码简化如下: char sndBuf[132...
  • weiyuefei
  • weiyuefei
  • 2016-03-13 16:27
  • 2442

思科CCNA第一学期第七章答案

1   在网络中实现第 2 层协议时应该考虑哪三个因素?(选择三项) 所选的第 3 层协议 网络的地址范围 ...
  • u014253173
  • u014253173
  • 2015-01-02 11:31
  • 6481

【网络开发】组播问题分析

1、知识介绍    根据接收者对组播源处理方式的不同,组播模型分为以下三类:    1)ASM 模型:Any-Source Multicast,任意信源组播    2)SFM 模型:Source...
  • LG1259156776
  • LG1259156776
  • 2017-04-05 23:33
  • 188

组播应用问题与解决

  • 2014-01-04 12:12
  • 22KB
  • 下载

网络编程之 广播 组播 域内套接字

1、网络编程之 广播 组播 域内套接字 2、网络编程之 协议分析 1、广播=====》基于UDP协议形式的消息发送 特点: 必须要发送广播地址  ===》局域网中的网段最大地址...
  • u011164819
  • u011164819
  • 2016-08-04 11:08
  • 497

Linux网络编程 之 UDP 组播

最近一直在做linux的网络,现在作个总结,陆续贴出来。 在网上搜了很多资料 ,其中周立发的博客对我的学习参考作用最大,谢谢前辈。 直接上代码吧,一个很简单udp 组播通信的例子,分别为服务器端和...
  • yanyuanfen2011
  • yanyuanfen2011
  • 2013-11-22 17:59
  • 4123

C#利用组播实现网络会议室功能(即群聊功能)

C#利用组播实现群发功能   [csharp] view plaincopy using System;   using System.Collec...
  • gws1229
  • gws1229
  • 2013-12-06 08:21
  • 1489

C#利用组播实现网络会议室功能(即群聊功能)

C#利用组播实现群发功能   using System; using System.Collections.Generic; using System.ComponentModel; using ...
  • huangwenhua5000
  • huangwenhua5000
  • 2012-08-31 16:16
  • 1271

网络组播程序基础

-------------------------------------------------------------------------------- 1 组播简介 ----------...
  • hejinjing_tom_com
  • hejinjing_tom_com
  • 2014-06-06 10:39
  • 774
    个人资料
    • 访问:6891195次
    • 积分:83190
    • 等级:
    • 排名:第18名
    • 原创:1427篇
    • 转载:2篇
    • 译文:0篇
    • 评论:3085条
    文章存档
    最新评论