vova_php
11.10.2012 - 19:42
Здравствуйте. Столкнулся с проблемой, а именно - MTU.
Есть скрипт, который слушает udp порт и получает-отправляет данные.
Для отправки данных клиенту используется функция stream_socket_sendto, все данные отправляются сразу, 1-м выовом stream_socket_sendto. Иногда доходят не все данные (человек сказал, что это связанно с ограничение MTU, у нас пакет весит ~3700 байт) .
Когда отправляешь данные порциями (вызов stream_socket_sendto идёт несколько раз), то опять не всем данные доходят.
Пожалуйста, подскажите как обойти?
killer8080
11.10.2012 - 20:50
vova_php
MTU определяется настройками драйвера операционной системы. Ваш скрипт никак на это влиять не может.
Цитата (vova_php @ 11.10.2012 - 18:42) |
Иногда доходят не все данные |
Протокол UDP не гарантирует доставку данных, это не TCP. Потери скорее всего связаны с перебоями в сети.
vova_php
11.10.2012 - 21:27
Цитата (killer8080 @ 11.10.2012 - 19:50) |
vova_php MTU определяется настройками драйвера операционной системы. Ваш скрипт никак на это влиять не может.
Цитата (vova_php @ 11.10.2012 - 18:42) | Иногда доходят не все данные |
Протокол UDP не гарантирует доставку данных, это не TCP. Потери скорее всего связаны с перебоями в сети.
|
Вы меня не поняли.Как можно скриптом делить пакеты?
Я делаю вот так
Вариант 1
$packet = "\xff\xff\xff\xff\x66\x0a";
foreach($lmonitor as $f) $packet .= format_ip($f['server_ip'], $f['server_port']);
$packet .= format_ip("0.0.0.0", 0);
stream_socket_sendto($socket, $packet, 0, $peer);
Вариант 2
stream_socket_sendto($socket, "\xff\xff\xff\xff\x66\x0a", 0, $peer);
$packet = '';
foreach($lmonitor as $f) $packet .= format_ip($f['server_ip'], $f['server_port']);
stream_socket_sendto($socket, $packet, 0, $peer);
stream_socket_sendto($socket, format_ip("0.0.0.0", 0), 0, $peer);
killer8080
11.10.2012 - 22:15
Цитата (vova_php @ 11.10.2012 - 20:27) |
Вы меня не поняли.Как можно скриптом делить пакеты? |
Никак. Сокетные функции - это всего лишь апи к ядру операционной системы, деление потока данных на пакеты - это функция транспортного протокола, который реализован в ядре, или драйверах ОС. То что вы по крамсаете данные на куски ничего не значит. ОС сама раскидает данные по пакетам как ей надо. Если нужна гарантированная доставка данных, используйте сеансовый протокол (tcp), иначе придется производить верификацию данных на прикладном уровне. Собственно UDP и используется там, где допустима частичная потеря данных. Возможно вы ошиблись с выбором транспортного протокола?
vova_php
12.10.2012 - 16:20
Цитата (killer8080 @ 11.10.2012 - 21:15) |
Цитата (vova_php @ 11.10.2012 - 20:27) | Вы меня не поняли.Как можно скриптом делить пакеты? |
Никак. Сокетные функции - это всего лишь апи к ядру операционной системы, деление потока данных на пакеты - это функция транспортного протокола, который реализован в ядре, или драйверах ОС. То что вы по крамсаете данные на куски ничего не значит. ОС сама раскидает данные по пакетам как ей надо. Если нужна гарантированная доставка данных, используйте сеансовый протокол (tcp), иначе придется производить верификацию данных на прикладном уровне. Собственно UDP и используется там, где допустима частичная потеря данных. Возможно вы ошиблись с выбором транспортного протокола?
|
А какой посоветуете способ для вывода 417 ip адресов из базы sql ?
В одном пакете должно быть 200ip<как реализовать что бы отпровлялись чначало 200 и потом 200.
Я не верю что нету выхода у меня!
killer8080
12.10.2012 - 17:31
vova_php
если очень нужно поменять mtu, есть только один способ, через сетевые настройки ОС сервера. Но я очень сомневаюсь, что потери пакетов связанны с этим параметром.
vova_php
13.10.2012 - 00:05
Цитата (killer8080 @ 12.10.2012 - 16:31) |
vova_php если очень нужно поменять mtu, есть только один способ, через сетевые настройки ОС сервера. Но я очень сомневаюсь, что потери пакетов связанны с этим параметром. |
Вы меня не поняли) скрипт запущен на VPS, к скрипту оброщаються через программу люди, скрипт им отвечает,щас скрипт работает на 200 ip адресов.А у нас база расширилась, и нужно людям отдовать всю базу. Как нам это сделать)?
Если отдовать 417 ip адресов в одном пакете,то пакет весит больше 1500байт и его не пропускает MTU.
Нужно как то кидать 2 пакета людям.
killer8080
13.10.2012 - 14:10
Цитата (vova_php @ 12.10.2012 - 23:05) |
Вы меня не поняли) скрипт запущен на VPS, к скрипту оброщаються через программу люди, скрипт им отвечает,щас скрипт работает на 200 ip адресов.А у нас база расширилась, и нужно людям отдовать всю базу. Как нам это сделать)? Если отдовать 417 ip адресов в одном пакете,то пакет весит больше 1500байт и его не пропускает MTU. |
Да с чего вы взяли, что объем данных, которые вы передаете в сокет, определяет размер UDP пакетов? Прочитайте про
сетевую модель OSI. UDP - это четвертый, транспортный уровень модели, ваш скрипт это седьмой уровень - прикладной. Никакого отношения ни к MTU, ни к сегментации ip пакетов, ни к каким другим опциям нижележащих протоколов, он отношения не имеет. Эти параметры определятся только настройками TCP/IP операционной системы.
killer8080
13.10.2012 - 16:22
vova_php
попробуйте вместо stream_socket_sendto обычный fwrite.
Быстрый ответ:
Powered by dgreen
Здесь расположена полная версия этой страницы.