Chinaunix首页 | 论坛 | 博客
  • 博客访问: 171125
  • 博文数量: 65
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 720
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-16 08:59
文章分类

全部博文(65)

文章存档

2011年(3)

2010年(3)

2009年(43)

2008年(16)

我的朋友

分类: LINUX

2009-03-04 10:44:26

如果使用linux作路由器或防火墙时使用netfilter的话,会发现ping较多地址时比较容易发生丢包现
象,这对于国内大部分只用ping来测试网络的好坏的网管而言,立即就可以下结论设备不行了。
linux下对ping包为什么那么不友好呢?
看看icmp的跟踪处理中的packet函数:
/* net/ipv4/netfilter/ip_conntrack_proto_icmp.c */

/* Returns verdict for packet, or -1 for invalid. */
static int icmp_packet(struct ip_conntrack *ct,
         const struct sk_buff *skb,
         enum ip_conntrack_info ctinfo)
{
 /* Try to delete connection immediately after all replies:
           won't actually vanish as we still have skb, and del_timer
           means this will only run once even if count hits zero twice
           (theoretically possible with SMP) */
 if (CTINFO2DIR(ctinfo) == IP_CT_DIR_REPLY) {
  if (atomic_dec_and_test(&ct->proto.icmp.count)
      && del_timer(&ct->timeout))
   ct->timeout.function((unsigned long)ct);
 } else {
  atomic_inc(&ct->proto.icmp.count);
  ip_conntrack_event_cache(IPCT_PROTOINFO_VOLATILE, skb);
  ip_ct_refresh_acct(ct, ctinfo, skb, ip_ct_icmp_timeout);
 }
 return NF_ACCEPT;
}

从函数中可知,一旦收到回应包,就立即把连接删除了,则也解释了为什么在ping通的情况下
在/proc/net/ip_conntrack中看不到icmp的连接的原因,只有在ping不通的时候才能看到icmp连接的
信息。

由于一旦收到回应包后就删除连接,而一般ping测试都是长ping不停的,因此netfilter就要为每个
ping包建立连接,不停的重复新建和删除操作,因此ping对于netfilter来说和tcp syn是相同的,每
个包都能引起新连接的建立,对netfilter的压力是最大的,因此丢包也再所难免。但TCP有重发机制
,丢个包看不出来,而ping包丢了就丢了,总是会毫不客气地打印出“Request time out”的。
阅读(3724) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~