LINUX.ORG.RU

Регулировать размер отправляемого TCP/UDP-пакета, Linux, сокеты


0

0

Здравствуйте. Есть задачка: при передаче больших объемов данных через сокеты, изменять длину отсылаемого пакета, и смотреть, как это сказывается на производительности. Проблем с самой передачей данных нет (делаю все согласно статье http://www.rsdn.ru/article/unix/sockets.xml), а вот как регулировать длину длину пакета - не нашел.

Листал Стивенса... есть MTU, MSS, буфер сокета... но как регулировать размер самого пакета?

Слишком шустро листат, видимо :)

О каких пакетах речь? IP? Их толком регулировать не получится. В принципе, каждая UDP-дейтаграмма бьётся на IP-пакеты так, чтобы влезало в PMTU.

С TCP всё гораздо сложнее. В нулевом приближении можно считать, что поток пересылается пакетами, влезающими в MSS, который в свою очередь автоматически выбирается так, чтобы влезал в PMTU.

Если всё происходит в LAN, построенной на ethernet, то наверное PMTU=MTU=1500. Уменьшая MTU интерфейса, можно заставить пакеты дробиться мельче. Но это всё на воде вилами писано...

Если надо точнее, то можно использовать RAW-сокеты.

const86 ★★★★★
()

возможно, tcp_nodelay, tcp_cork помогут в случае с tcp.

true_admin ★★★★★
()

> Листал Стивенса...

По UDP - 2.9 "Отправка по UDP"

По TCP - 7.9 "Параметр сокета TCP_NODELAY"

О raw-сокетах забудь, они не для этого.

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

> Вы не могли бы пояснить, как регулировать размер пакета с помощью RAW сокетов?

Открываем IP RAW сокет с каким-нибудь не используемым системой номером протокола. И шлём туда пакеты - как скажешь, так в сеть и улетит. Ну не больше MTU, разумеется. Работать будет только от рута и писать муторно. Зато никакая гадкая операционная система не помешает контролировать размеры пакета. Если маршрутизация не нужна: оба конца на одном свиче живут - можно вообще без IP обойтись (а то он, бяка, может фрагментировать пакеты, если MTU отличается в разных сегментах).

Но обычно всё же для скорости юзают UDP, у него и так накладные расходы минимальные. Смотрим MTU, отнимаем длину заголовков UDP и пересылаем пакетами такого размера. Извращаться с RAW стоит, только если прям ну очень хочется управлять всем, чем только можно.

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

> как это сказывается на производительности

учите матчасть:
http://www.29west.com/docs/THPM/index.html

Вопрос - о какой производительности идёт речь?
с возможностью потерь данных или a la TCP

Вобщем,в предыдущем посте, const86 прав, но это целая наука ...

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

> так на каком уровне/ях происходит фрагментация?

UDP и IP (если разрешить)

> или, может ли длина RAW пакета превышать MTU?

IP RAW - может, но тогда он будет фрагментироваться и теряется весь смысл выпендрёжа. Для AF_PACKET точно не скажу, но видимо, там уже нельзя больше MTU.

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

я предполагал (никогда не работал с RAW),
что фрагментация ,а именно , деление отсылаемого пакета на фрагменты
размером равным MTU, происходит на уровне IP ("ядра"), и 
потом на свитчах/рутерах, если это дело как-то удалось обойти 
с помощью RAW packets.

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

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

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

> у меня всегда было представление, что размер MTU искуственный

Он определяется протоколами ниже IP. Для ethernet он обычно 1500, может доходить до 9000 (вроде бы, 7200 точно). Сам по себе пакет IP не может быть длиннее 64K, поэтому в "светлом будущем" можно надеяться на MTU=65536.

const86 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.