Twisted Python: максимальный размер пакета? Промывочная розетка?

Я реализую клиент-серверное решение на основе Twisted для серверной части и, например. и телефон Android для клиентской стороны. Поскольку эмулятор Andoird не принимает TCP-пакеты больше 1500 байт (или меньше?), мне нужно иметь возможность разбивать пакеты на части на стороне сервера. Без сброса сокета после каждого «transport.write» Twisted буферизует исходящие данные, поэтому разбиение на фрагменты было бы бесполезным без какой-либо ручной или автоматической функции сброса / maxpacketsize. Как это сделать в Twisted? Я знаком с функцией "reactor.doSelect(1)", но, поскольку я использую реактор EPoll (из соображений масштабируемости и производительности), я не могу использовать doSelect. Можно ли изменить maxPacketValue для определенных соединений в Twisted?

Надеясь, что кто-то может показать мне свет ...


person Dirk    schedule 21.10.2011    source источник
comment
Это слишком странно, проблема просто волшебным образом разрешилась сама собой... большой тестовый пакет, который не дошел до клиента, теперь снова работает, я понятия не имею, почему... Пока я бы сказал, что дело закрыто!   -  person Dirk    schedule 21.10.2011
comment
Вы никогда не должны вызывать doSelect. Это не то, что вы думаете.   -  person Jean-Paul Calderone    schedule 21.10.2011
comment
Проблема не разрешилась волшебным образом сама собой. Условия вашей сети изменились, поэтому она работает... пока. Но он изменится обратно и снова сломается. Смотрите мой ответ, который должен объяснить, как исправить ваш код на самом деле.   -  person Glyph    schedule 21.10.2011


Ответы (2)


TCP-пакеты автоматически разбиваются операционной системой, и все, что может сделать приложение, — это дать подсказки, когда сбрасывать. Кроме того, приложение может просто читать и писать в поток.

ОС двух взаимодействующих одноранговых узлов автоматически настраивают максимальные размеры пакетов на основе MTU для ссылок с обнаружение MTU пути< /а>. Убедитесь, что вы не блокируете пакеты ICMP, чтобы это работало.

Поскольку крайне маловероятно, что проблема связана с неправильным значением MTU (и в любом случае часто устанавливается значение MTU, равное 1500 или меньше), вам следует повторно диагностировать проблему, например, с помощью трассировщика пакетов, такого как wireshark.

person phihag    schedule 21.10.2011

TCP — это протокол, ориентированный на поток, а не протокол, ориентированный на пакеты. Когда вы вызываете transport.write, эти данные добавляются к потоку TCP и могут быть отправлены в любом количестве пакетов; он может быть разбит или склеен со следующим или предыдущим вызовом write. Это довольно часто задаваемый вопрос о Twisted, но все, кто его задает спрашивает немного по другому.

Вы хотите использовать набор для создания протоколов, например AMP, или в общем, LineReceiver, чтобы разграничить сообщения внутри вашего протокола, а не полагаться на случайный характер границ пакетов.

person Glyph    schedule 21.10.2011