如果使用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) |