Что означает tcpi_rcv_mss? - PullRequest
       20

Что означает tcpi_rcv_mss?

2 голосов
/ 02 июля 2019

Как известно, MSS - это максимальный размер сегмента данных TCP.

В Ipv4 MSS составляет 1460 в целом, а в Ipv6 MSS составляет 1440 в целом.

Но странная вещь: в struct tcp_info есть два типа MSS, которые tcpi_snd_mss и tcpi_rcv_mss.

Я провел простой эксперимент, подключил www.stackoverflow.com и вывел эти два значения.

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

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

    struct sockaddr_in server;
    server.sin_family = AF_INET;
    server.sin_port = htons(80);
    server.sin_addr.s_addr = inet_addr("151.101.193.69");

    int rc = connect(fd, (void*)&server, sizeof(server));
    assert(rc >= 0);

    struct tcp_info info;
    socklen_t len = sizeof(info);
    rc = getsockopt(fd, SOL_TCP, TCP_INFO, (void*)&info, &len);
    assert(rc >= 0);


    printf("%u\n", info.tcpi_snd_mss);
    printf("%u\n", info.tcpi_rcv_mss);
    return 0;
}
$ ./a.out
1440
536

tcpi_rcv_mss - это 536 !!

Но согласно tcpdump MSS должно быть 1440 (у меня MSS 1460, stackoverflow'MSS - 1440).

$ sudo tcpdump -n host 151.101.193.69
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
18:39:52.690772 IP 10.101.25.77.14947 > 151.101.193.69.80: Flags [S], seq 548910783, win 29200, options [mss 1460,sackOK,TS val 3459919655 ecr 0,nop,wscale 8], length 0
18:39:52.797959 IP 151.101.193.69.80 > 10.101.25.77.14947: Flags [S.], seq 577830562, ack 548910784, win 28800, options [mss 1440,nop,nop,sackOK,nop,wscale 9], length 0
18:39:52.798000 IP 10.101.25.77.14947 > 151.101.193.69.80: Flags [.], ack 1, win 115, length 0
18:39:52.798333 IP 10.101.25.77.14947 > 151.101.193.69.80: Flags [F.], seq 1, ack 1, win 115, length 0
18:39:53.160527 IP 10.101.25.77.14947 > 151.101.193.69.80: Flags [F.], seq 1, ack 1, win 115, length 0
18:39:53.241597 IP 151.101.193.69.80 > 10.101.25.77.14947: Flags [F.], seq 1, ack 2, win 57, length 0
18:39:53.241657 IP 10.101.25.77.14947 > 151.101.193.69.80: Flags [.], ack 2, win 115, length 0

Итак, у меня есть два вопроса:

  1. Что означает tcpi_rcv_mss?
  2. Почему в моем эксперименте tcpi_rcv_mss 536?

1 Ответ

0 голосов
/ 02 июля 2019

Receive MSS - это максимальный размер сегмента, который вы объявляете другому пиру, которого вы можете принять, а Transmit MSS - это значение, объявленное вашим пером, и обозначает максимальный размер сегмента, который вы можете отправить ему.Конечно, есть два, ваш не обязательно должен быть равен вашему партнеру.

...