Если я отправлю два TCP-сообщения, нужно ли обрабатывать случай, когда последнее приходит раньше первого? Или он гарантированно прибудет в том порядке, в котором я его отправлю? Я предполагаю, что это не специфичный для Twisted пример, потому что он должен соответствовать стандарту TCP, но если кто-нибудь, знакомый с Twisted, может дать ответ, специфичный для Twisted, для моего собственного спокойствия, это будет оценено по достоинству :-)
Гарантировано ли, что TCP прибудет в порядке?
Ответы (4)
Пока два сообщения были отправлены по одному и тому же TCP-соединению, порядок сохраняется. Если между одной и той же парой процессов открыто несколько соединений, у вас могут возникнуть проблемы.
Что касается Twisted или любой другой асинхронной системы событий: я ожидаю, что вы получите сообщения dataReceived
в порядке получения байтов. Однако, если вы начнете перекладывать работу на отложенные вызовы, вы можете, эм... "исказить" свой поток управления до неузнаваемости.
TCP ориентирован на соединение и предлагает своим клиентам доставку по порядку. Конечно, это относится к уровню соединения: отдельные соединения независимы.
Обратите внимание, что обычно мы имеем в виду «потоки TCP» и «сообщения UDP».
Какую бы клиентскую библиотеку вы ни использовали (например, Twisted), базовое TCP-соединение не зависит от нее. TCP будет доставлять «протокольные сообщения» вашему клиенту. Под «протокольным сообщением» я, конечно же, подразумеваю протокол, который вы используете на уровне TCP.
Кроме того, обратите внимание, что операции ввода-вывода являются асинхронными по своей природе и очень зависят от загрузки системы, а также усугубляют задержки и потери в сети, вы не можете полагаться на порядок сообщений между соединениями TCP.
TCP «гарантирует», что получатель получит восстановленный поток байтов в том виде, в каком он был первоначально отправлен отправителем. Однако между конечными точками отправки/получения TCP (т. е. физической сетью) данные могут быть получены не по порядку, фрагментированы, повреждены и даже потеряны. TCP учитывает эти проблемы, используя механизм рукопожатия, который вызывает повторную передачу плохих пакетов. Стек TCP на приемнике помещает эти пакеты в том порядке, в котором они были переданы, поэтому при чтении из сокета TCP вы получаете данные в том виде, в котором они были отправлены изначально.
При вызове метода doRead в Подкрутил, данные читаются из сокета до размера буфера. Эти данные могут представлять собой одно сообщение, частичное сообщение или несколько сообщений. Извлечение сообщений из буфера зависит от вас, но вам гарантируется, что в этот момент байты находятся в том порядке, в котором они были переданы.
Извините, что мутил воду своим предыдущим сообщением...
TCP — это поток, UDP — это сообщение. Вы путаете термины. Для TCP верно то, что поток будет поступать в том же порядке, в котором он был отправлен. В TCP нет отдельных сообщений, байты появляются по мере их поступления, интерпретация их как сообщений зависит от вас.