Twisted Python: максимальный размер пакета? Флеш розетка? - PullRequest
2 голосов
/ 21 октября 2011

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

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

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

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

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

1 голос
/ 21 октября 2011

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

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

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

...