iptables limit 模块限速不准确原因分析

本文探讨iptables limit模块在限速时出现不准确的原因,分析了iptables用户空间的parse_rate函数和内核空间的令牌桶算法实现。指出由于除法运算误差及令牌生成策略,导致实际限速与设定值存在差异。
摘要由CSDN通过智能技术生成

iptables -I test -m limit --limit xxx/yyy
iptables
用户空间:libxt_limit.c
int parse_rate(const char *rate, uint32_t *val)

该函数中*val = XT_LIMIT_SCALE * mult/ r;
XT_LIMIT_SCALE10000(时间精度)
mult:yyy
smult:1yyymmult:60,yyyhmult是:60x60yyydmult是:24x60x60
r
xxx
所以上式中的*val为传输一个包需要的时间。iptables显示的数字实际应该是:10000/(*val),即表示每秒允许的数据包数量。
iptables -I test -m limit --limit 2600/s为例:
*val=10000*1/2600=3

10000/3=3333
iptables -I test -m limit --limit 1400/s为例:
*val=10000*1/1400=7

10000/7=1428

 

iptables内核空间:xt_limit.c

staticstructxt_matchlimit_mt_reg__read_mostly={

    .name            ="limit",

    .revision        =0,

    .family          =NFPROTO_UNSPEC,

    .match           =limit_mt,

    .checkentry      =limit_mt_check,

    .destroy         =limit_mt_destroy,

    .matchsize       =sizeof(structxt_rateinfo),

#ifdef CONFIG_COMPAT

    .compatsize      =sizeof(struct

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值