少し実験してみました。Linux-tc
私の質問は、バーストとMTUの違いは何ですか?Linux tc-htb
同じ効果があるようです。唯一のバースト値を変更します。
(このコマンドを使用してこれを確認できますtc -s -s -d c ls dev <iface>
。)
しかし、両方のページでは異なることを言います。
1)HTB - 交通制御はいかがですか説明する
飛び出す アイドル期間中に蓄積できる最大バイトバースト(計算済み)
最大伝送単位 速度マップを生成する最大パケットサイズ {1600}
2)MAN tc-tbfページ説明する
飛び出す バッファまたは最大バーストとも呼ばれます。バケットのサイズ(バイト)です。 ...
MTU/最小バースト最高速度バケットサイズを指定します。
解釈は異なりますが、効果は同じですか?
読んでくれてありがとう!
答え1
実際、linux tc
ソースコードを見ると同じです。
2つのオプションが「バッファ」変数を変更します。
mtu
具体的には、HTB はオプションを使用するときに変数 "buffer" を変更します。 burst
ただし、TBFはオプションを使用すると変数 "buffer"を変更します。 burst
ただし、このオプションを使用すると、変数 "mtu"mtu
しかし、それが何を意味するのかをより深く掘り下げる必要があります。
[1] /tc/q_tbf.c
static int tbf_parse_opt(struct qdisc_util *qu, int argc, char **argv,
struct nlmsghdr *n, const char *dev)
{
...
} else if (matches(*argv, "burst") == 0 ||
strcmp(*argv, "buffer") == 0 ||
strcmp(*argv, "maxburst") == 0) {
const char *parm_name = *argv;
NEXT_ARG();
if (buffer) {
fprintf(stderr, "tbf: duplicate \"buffer/burst/maxburst\" specification\n");
return -1;
}
if (get_size_and_cell(&buffer, &Rcell_log, *argv) < 0) {
explain1(parm_name, *argv);
return -1;
}
...
} else if (strcmp(*argv, "mtu") == 0 ||
strcmp(*argv, "minburst") == 0) {
const char *parm_name = *argv;
NEXT_ARG();
if (mtu) {
fprintf(stderr, "tbf: duplicate \"mtu/minburst\" specification\n");
return -1;
}
if (get_size_and_cell(&mtu, &Pcell_log, *argv) < 0) {
explain1(parm_name, *argv);
return -1;
}
...
opt.buffer = tc_calc_xmittime(opt.rate.rate, buffer);
if (opt.peakrate.rate) {
opt.peakrate.mpu = mpu;
opt.peakrate.overhead = overhead;
if (tc_calc_rtable(&opt.peakrate, ptab, Pcell_log, mtu, linklayer) < 0) {
fprintf(stderr, "tbf: failed to calculate peak rate table.\n");
return -1;
}
opt.mtu = tc_calc_xmittime(opt.peakrate.rate, mtu);
}
...
}
[2] /tc/q_htb.c
static int htb_parse_class_opt(struct qdisc_util *qu, int argc, char **argv, struct nlmsghdr *n, const char *dev)
...
} else if (matches(*argv, "burst") == 0 ||
strcmp(*argv, "buffer") == 0 ||
strcmp(*argv, "maxburst") == 0) {
NEXT_ARG();
if (get_size_and_cell(&buffer, &cell_log, *argv) < 0) {
explain1("buffer");
return -1;
}
} else if (matches(*argv, "cburst") == 0 ||
strcmp(*argv, "cbuffer") == 0 ||
strcmp(*argv, "cmaxburst") == 0) {
NEXT_ARG();
if (get_size_and_cell(&cbuffer, &ccell_log, *argv) < 0) {
explain1("cbuffer");
return -1;
}
} else if
..
...
if (!buffer)
buffer = rate64 / get_hz() + mtu;
if (!cbuffer)
cbuffer = ceil64 / get_hz() + mtu;
...
}
static int htb_print_opt(struct qdisc_util *qu, FILE *f, struct rtattr *opt)
{
...
if (show_details) {
fprintf(f, "burst %s/%u mpu %s ",
sprint_size(buffer, b1),
1<<hopt->rate.cell_log,
sprint_size(hopt->rate.mpu, b2));
fprintf(f, "cburst %s/%u mpu %s ",
sprint_size(cbuffer, b1),
1<<hopt->ceil.cell_log,
sprint_size(hopt->ceil.mpu, b2));
fprintf(f, "level %d ", (int)hopt->level);
} else {
...
}