TCP, как гарантируют, прибудет в порядок?

Он еще не существовал, когда был задан вопрос. Но теперь это так: miniz - общественное достояние, один файл C, явно вдохновленный подобными stb_image.

35
задан Smashery 6 November 2009 в 23:16
поделиться

4 ответа

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

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

49
ответ дан 27 November 2019 в 06:36
поделиться

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

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

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

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

24
ответ дан 27 November 2019 в 06:36
поделиться

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

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

18
ответ дан 27 November 2019 в 06:36
поделиться

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

7
ответ дан 27 November 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: