Почему максимальный размер сегмента UDP намного больше, чем максимальный размер сегмента TCP в этих выходных данных? - PullRequest
1 голос
/ 15 августа 2011

Я попробовал следующий код, чтобы узнать максимальный размер сегмента в сокетах TCP и UDP. Я могу ошибаться, потому что я использую IPPROTO_TCP и TCP_MAXSEG для SOCK_DGRAM, но я получаю значение и хочу знать причину.

if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    perror("cant create socket");

aopt = sizeof(optval);
getsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, (char *)&optval, &aopt);
printf("tcp max segment size is=%d\n", optval);

Выход:

tcp max segment size is=536

тогда я попробовал то же самое с сокетом UDP:

if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
    perror("cant create socket");

aopt = sizeof(optval);
getsockopt(sockfd, IPPROTO_TCP, TCP_MAXSEG, (char *)&optval, &aopt);
printf("udp max segment size is=%d\n", optval);

выход:

udp max segment size is=134514139

Ответы [ 3 ]

3 голосов
/ 15 августа 2011

TCP имеет сегменты, UDP имеет датаграммы. Длина дейтаграммы UDP ограничена размером поля заголовка длины дейтаграммы UDP (16 бит).

Из википедии:

A field that specifies the length in bytes of the entire datagram: header and data.
The minimum length is 8 bytes since that's the length of the header.
The field size sets a theoretical limit of 65,535 bytes
(8 byte header + 65,527 bytes of data) for a UDP datagram.
The practical limit for the data length which is imposed by the underlying
IPv4 protocol is 65,507 bytes (65,535 − 8 byte UDP header − 20 byte IP header).

проверьте возвращаемое значение getsockopt, UDP не имеет сегментов tcp, поэтому он обязательно должен вернуться с ошибкой.

2 голосов
/ 15 августа 2011

Не существует такого понятия, как «максимальный размер сегмента UDP», потому что UDP не имеет сегментов или MSS. Максимально возможный размер полезной нагрузки UDP-дейтаграммы составляет 65535-28 = 65507 согласно ответу yi_H. На практике он дополнительно ограничивается MTU сетевого адаптера и промежуточными маршрутизаторами точно таким же образом, как MSS TCP, однако он не согласован по всей длине пути, как TCP MSS; поэтому он не известен стеком UDP; поэтому он не доступен для вас через какой-либо API.

2 голосов
/ 15 августа 2011

Я уверен, что getsockopt на самом деле дает сбой (и возвращает ненулевой статус, который вы игнорируете), поэтому вы печатаете мусор (скорее всего, вы не инициализировали optval).

РЕДАКТИРОВАТЬ

UDP не имеет MSS.Максимальный размер дейтаграммы ограничен многими факторами (насколько готов ОС отправлять большие дейтаграммы).Жесткий предел - размер, который IP может нести.IP имеет поле 16b Total Length.Поэтому я предполагаю, что если ОС позволяет вам, 65535 - iphdr - это максимальный размер дейтаграммы.

...