Linux-TC에서 MTU와 버스트의 차이점

Linux-TC에서 MTU와 버스트의 차이점

나는 약간의 실험을 해보았다.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소스코드를 보면 똑같습니다.

두 가지 옵션이 "버퍼" 변수를 변경합니다.

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 {

...
}


관련 정보