Может TCP и UDP пакеты будут разбиты на части?

Может TCP-пакеты прибывают к получателю по частям?

Например, если я отправлю 20 байтов, используя TCP протокол, могу ли я быть на 100% уверены, что я буду получать ровно 20 байт за раз, а не 10 байт, потом еще 10 байт или так?

И тот же вопрос для протокола UDP. Я знаю, что UDP является ненадежным и пакеты не могут приехать вовсе или приехать в разном порядке, но как насчет одного пакета? Если он приезжает, я могу быть уверен, что это полный пакет, а не часть?

Комментарии к вопросу (1)

может TCP-пакеты прибывают к получателю по частям?

Да. IP поддерживает фрагментацию, хотя протокол TCP, как правило, пытается определить пути MTU и сохранить свои пакеты меньше, чем для повышения производительности. Фрагментация увеличивается катастрофически коэффициент потери датаграмм. Если путь имеет 10% коэффициент потерь пакетов, фрагментация дейтаграммы в два пакета делает коэффициент потери датаграмм почти на 20%. (Если пакет потерян, датаграмма потерял.)

Вы Don'т придется беспокоиться об этом, так же как и TCP слой. IP-уровень снова собирает пакеты в целой дейтаграммы.

напр.: если я отправить 20 байт, используя протокол TCP, я могу быть на 100% уверены, что я буду получать ровно 20 байт за один раз, а не 10 байт, потом еще 10 байт или так?

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

И такой же вопрос для протокола UDP. Я знаю, что UDP является ненадежным и пакеты не могут приехать вовсе или приехать в ином порядке,

То же верно и для TCP. Пакеты пакеты. Разница в том, что TCP имеет повторов и переупорядочение в протокол, а UDP не.

но насчет 1 пакет? Если он приезжает, я могу быть уверен, что это полный пакет, а не часть?

Нет, но это's не ваша проблема. Протокол UDP датаграммы сборка ручек. Что's частью его работы. (На самом деле протокол IP это для протокола UDP, UDP не так это просто быть размещены в верхней части ИС.) Если дейтаграмма получает раскол из-за двух пакетов, протокол IP будет собрать его для протокола UDP, поэтому вы увидите полные данные.

Комментарии (1)

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

Но независимо от того, если данные поступают в один пакет или несколько пакетов на приемнике. ОС должна реферат конкатенации этих пакетов, так что для вашего приложения, похоже, все, приехали сразу. Так что, если вы хакер ядра, в большинстве случаев, вы не'т нужно беспокоиться, если эти данные передаются в один или несколько пакетов.

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

Комментарии (5)

Примеры. Блоки смежных символов соответствуют послать() вызовы:

Протокол TCP:

Send: AA BBBB CCC DDDDDD E         Recv: A ABB B BCC CDDD DDDE

Все отправляемые данные, полученные в порядке, но не обязательно в тех же кусков.

УДП:

Send: AA BBBB CCC DDDDDD E         Recv: CCC AA E

Данные не обязательно в том же порядке, и не обязательно получен вообще, но сообщения сохраняются в полном объеме.

Комментарии (0)

напр.: если я отправить 20 байт, используя протокол TCP, я могу быть на 100% уверены, что я получите ровно 20 байт за раз, а не 10 байт, потом еще 10 байт или так?

Нет, TCP-это потоковый протокол, он сохраняет данные в порядке, но это не'т группы это сообщение. С другой стороны УДП сообщение-ориентированной, но ненадежный. Высокий имеет лучшее из обоих миров, но это'т изначально Ховер нац сломать интернет.

Комментарии (0)

Есть какие-то гарантии, что если вы отправите 20 байт в самом начале TCP-поток, он не приедет, как два байта 10 штук. Это происходит потому, что стек TCP не будет отправлять такие небольшие сегменты: существует минимальный размер MTU. Однако, если отправить в любом месте в середине потока, все ставки выключены. Это может быть, что ваш стек протокола занимает 10 байт данных для заполнения сегмента и отправить его, а затем следующие десять байт перейти в другой сегмент.

Ваш стек протокола разбивает данные на блоки и помещает их в очередь. Размеры блока в зависимости от пути МТУ. При выполнении операции отправки, а там еще в очереди ожидающих передачи данных, стек протоколов, как правило, взглянуть на тот сегмент, который в хвосте очереди и посмотреть, есть ли место в этом сегменте, чтобы добавить больше данных. Номер может быть как малые, как один байт, так что даже два байта послать можно было бы разбить на два.

На другом конце, сегментацию данных означает, что там может быть частичным читает. Операции получения потенциально могут проснуться и получить данные, когда один сегмент прибывает. В широко внедрен API сокетов, а принимать звонки можно задать по 20 байт, но он может вернуться с 10. Конечно, слой буферизации может быть построен на нем, который будет блокировать до 20 байт или разрывы связи. В POSIX мира, что API может быть стандартных потоков ввода/вывода: вы можете fdopen сокет-дескриптор, чтобы получить файл * поток, и вы можете использовать `fread операционной его для заполнения буфера такие, что полностью удовлетворен как много "читать" звонки, сколько потребуется.

UDP-датаграмм фрейма данных. Каждый вызов создает датаграмму (но см. ниже об укупорке). Другая сторона получает датаграмму (и, в API сокетов, то он должен указывать на буфер, достаточно большой, чтобы удержать его, иначе дейтаграмма будет усечено). Большие датаграммы вам фрагментируется фрагментации IP, и повторно собран прозрачно для приложений. Если какой-либо фрагмент отсутствует, вся датаграмма теряется; нет никакого способа, чтобы прочитать часть данных в этой ситуации.

Существуют расширения интерфейс, позволяющий несколько операций, чтобы указать одну датаграмму. В Linux, сокет может быть "пробкой" и (не смогла отправить). Пока он закупоривается, записанные данные собираются в единый блок. Потом, когда гнездо есть "открыла" и, одной дейтаграммы могут быть отправлены.

Комментарии (2)