Подтвердить что ты не робот

Гарантируется ли TCP в порядке?

Если я отправляю два сообщения TCP, нужно ли мне обрабатывать случай, когда последний приходит до первого? Или это гарантирует, что вы прибудете в том порядке, который я пришлю? Я предполагаю, что это не пример, связанный с Twisted, потому что он должен соответствовать стандарту TCP, но если кто-нибудь, кто знаком с Twisted, может дать ответ на Twisted для моего собственного душевного спокойствия, это было бы оценено: -)

4b9b3361

Ответ 1

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

Относительно Twisted или любой другой асинхронной системы событий: я ожидаю, что вы получите сообщения dataReceived в порядке получения байтов. Однако, если вы начнете отталкивать работу от отложенных вызовов, вы можете, erm... "перевернуть" свой поток управления до неузнаваемости.

Ответ 2

TCP ориентирован на соединение и предлагает доставку в клиентов . Конечно, это относится к уровню соединения: индивидуальные соединения независимы.

Следует заметить, что мы обычно называем "TCP-потоки" и "UDP-сообщения".

Независимо от используемой вами клиентской библиотеки (например, Twisted) базовое TCP-соединение не зависит от нее. TCP будет предоставлять "сообщения протокола" для вашего клиента. По "сообщению протокола" я, конечно, ссылаюсь на протокол, который вы используете на уровне TCP.

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

Ответ 3

TCP "гарантирует", что получатель получит восстановленный поток байтов, поскольку он был первоначально отправлен отправителем. Однако между конечными точками отправки/приема TCP (т.е. Физической сетью) данные могут быть получены не в порядке, они могут быть фрагментированы, могут быть повреждены и даже могут быть потеряны. TCP учитывает эти проблемы, используя механизм рукопожатия, который приводит к повторной передаче плохих пакетов. Стек TCP в приемнике помещает эти пакеты в том порядке, в котором они были переданы, так что, когда вы читаете из своего сокета TCP, вы получаете данные, поскольку они были первоначально отправлены.

Когда вы вызываете метод doRead в Twisted, данные считываются из сокета до размера буфера. Эти данные могут представлять собой одно сообщение, частичное сообщение или несколько сообщений. Вам нужно извлечь сообщения из буфера, но вам гарантировано, что байты находятся в их переданном порядке в этот момент.

Извините за загрязнение вод моим предыдущим сообщением...

Ответ 4

TCP - это поток, UDP - это сообщение. Вы смешиваете условия. Для TCP верно, что поток поступит в том же порядке, в каком он был отправлен. В TCP не существует сообщений об ограничении, появляются байты по мере их поступления, интерпретируя их как сообщения до вас.