LINUX.ORG.RU

Почему не сходятся размеры пакетов?

 ,


2

2

Есть в Linux функция sendmsg. Я создал сокет с возможностью отправлять свой ip заголовок и udp. Я вызвал функцию с размером пакета 1500, возникает ошибка message too long и она не уходит пока я не понижаю размер до 1480. Но ведь максимальный mtu 1500? А в wireshark размер моих пакетов 1494, почему? Откуда ещё 14 байт?

1500 это mtu без учёта этих 14 байт.

Возможно sendmsg() считает размер пакета вместе с 20-байтовым ip-заголовком, который он потом не добавляет из-за твоих опций. То есть твоё 1480 + он думает что надо будет добавить ещё 20 байт - получается 1500.

Попробуй слать обычные пакеты и смотри какой там будет максимальный размер в wireshark, подозреваю 1514.

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)
Ответ на: комментарий от Ingvar2145

Я создал сокет с возможностью отправлять свой ip заголовок и udp

raw-сокет? У него есть куча особенностей.

sendmsg() использует достаточно хитрую структуру для посылки данных. Где ты там указал 1500 - никто гадать не будет.

vel ★★★★★
()
Ответ на: комментарий от vel

В структуре msghdr количество iovec = 1 в структуре iovec длина 1500. Кстати я ещё открыл сокет, тоже raw для icmp и ко мне приходят icmp type 3 code 4 fragmentation needed когда я отправляю пакет размером больше чем 1480 внутри (iphdr 24 байта + udphdr 8 байт + данные 1480-24-8) в iphdr df set.

Ingvar2145
() автор топика
Ответ на: комментарий от Ingvar2145

Гм. А ты посмотрел от кого приходит эти icmp?

iphdr 24 это значит, что в заголовке есть дополнительна опция. Минимальный и стандартный размер - 20 байт.

Посмотри tcpdump-ом твои исходящие пакеты.

vel ★★★★★
()
Ответ на: комментарий от vel

Я смотрю в wireshark. Дополнительную опцию поставил я и флаг df тоже. Icmp не отображаются в wireshark я подумал что из-за неправильного вызова(хотя он должен быть правильным) пакет не отправляется а icmp генерит ядро и поэтому его в wireshark нет.

Ingvar2145
() автор топика
Ответ на: комментарий от vel

Imgur я убрал дополнительные опции и отправил в sendmsg() 1486 то есть mtu без ethernet header. На картинке первые 2 строки это результат = получилось. Но роутер почемуто говорит что mtu=1480 тоесть 1466. Щас проверю… Да правильно…

Ingvar2145
() автор топика
Ответ на: комментарий от Ingvar2145

Короче когда я пытаюсь отправить 1486 тоесть с ethernet который я не трогаю 1500. функция возвращает -1 а мой комп мне отправляет ICMP снизить mtu до 1480 тоесь я должен отправить 1466. Да всё работает СПАСИБО ЧТО ПОМОГЛИ!!!

Ingvar2145
() автор топика
Ответ на: комментарий от Ingvar2145

Есть замечательная утилита - tcpdump. Она дает в виде текста информацию о трафике. Его можно мышкой выделить и вставить прямо сюда.

Запустить wireshark, сдампить трафик, сделать скриншот, залить на хостинг и вставить ссылку сюда - это очень трудоёмко.

У wireshark в комплекте есть tshark, но там проблема с выводом осмысленной информации. Там либо дофига подробно, либо нифига нет, либо командная строка безумной длины.

У tshark нет вменяемого аналога «tcpdump -ni ethХ -v»

vel ★★★★★
()
Ответ на: комментарий от Ingvar2145

Уж не WLAN ли это ?

Нет это wifi.

Беспроводная локальная сеть (англ. wireless local area network; wireless LAN; WLAN) — локальная сеть, построенная на основе беспроводных технологий.

i-rinat ★★★★★
()
Ответ на: комментарий от vel

Vel, чтобы новый вопрос не постить на форум, ответь ещё на один вопрос. На что влияет первый аргумент AF_INET или AF_INET6 в функции socket() если второй аргумент sock raw и теоретически я могу положить любой версии iphdr несмотря на флаг?

Ingvar2145
() автор топика
Ответ на: комментарий от Ingvar2145

raw-сокет может быть и на уровне пакета, а там нет понятия ip4/ip6.

Первый параметр выбирает api сокета.

IMHO socket(AF_INET, SOCK_RAW, 0) и socket(AF_INET6, SOCK_RAW, 0) ничем не отличаются.

А вот если указывать протокол, то разница будет.

vel ★★★★★
()
Ответ на: комментарий от vel

Спасибо, я убедился в том что флажок AF при rawsocket ни начто не влияет. Ещё один вопрос: почему размер ICMP ответа около 590 байт хотя в нём должно быть 2 iphdr 1 icmhdr и 8 байт недожедшего пакета

Ingvar2145
() автор топика