TCP_INFO tcp_rtti равен 0 при повторной передаче - PullRequest
0 голосов
/ 15 марта 2019

Я бы хотел измерить RTT от клиента и сервера.

Поэтому я обращаюсь к https://linuxgazette.net/136/pfeiffer.html и пишу демонстрационную программу.

#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <stdio.h>

int main() {
    int fd = socket(AF_INET, SOCK_STREAM, 0);

    struct sockaddr_in addr;
    socklen_t socklen = sizeof(addr);
    addr.sin_family = AF_INET;
    addr.sin_port = htons(80);
    addr.sin_addr.s_addr = inet_addr("8.8.8.8");

    if (connect(fd, (struct sockaddr*)&addr, socklen) < 0) {
        printf("connect error: %m");
        return -1;
    }


    struct tcp_info info;
    socklen_t length = sizeof(info);
    if (getsockopt(fd, SOL_TCP, TCP_INFO, &info, &length) == -1) {
        printf("getsockopt error: %m");
        return -1;
    }

    printf("connect success, rtt: %u, total retrans: %u\n", info.tcpi_rtt, info.tcpi_total_retrans);

    return 0;
}

Работает нормально, пока не произойдет повторная передача: rtt равно 0.

$ for (( i = 0; i < 10; i++ )); do ./a.out ; done
connect success, rtt: 10203, total retrans: 0
connect success, rtt: 0, total retrans: 1
connect success, rtt: 10396, total retrans: 0
connect success, rtt: 10066, total retrans: 0
connect success, rtt: 9692, total retrans: 0
connect success, rtt: 10244, total retrans: 0
connect success, rtt: 9877, total retrans: 0
connect success, rtt: 3275, total retrans: 0
connect success, rtt: 10083, total retrans: 0
connect success, rtt: 9207, total retrans: 0

Я не знаю много о ядре, так что же случилось с ядром?

Не могу ли я измерить RTT с помощью tcp_info.tcpi_rtt?

...