Java — почему нужно бороться с фрагментацией сообщений

фрагментация сообщений выполняется по IP, поэтому мне приходится иметь дело с этим на уровне приложений. такие как мина или нетти?

фрагментация сообщений будет в правильном порядке, верно?

так что любой декодер не должен иметь дело с любым вопросом заказа, верно?

1

Решение

Повторная сборка IP-пакетов полностью выполняется на IP-уровне (до того, как UDP или TCP когда-либо увидит пакет), поэтому вам не придется иметь дело с «дефрагментацией» на прикладном уровне.

Конечно, это относится только к UDP, так как пакет в то время как TCP является поток и, следовательно, не имеет строгой концепции пакетов с точки зрения пользователя.

TCP может свободно передавать исходящие байты в любой группе, которую сочтет нужной, и принимающая сторона может передавать полученные байты приложению в любой группе, которую сочтет нужной. Это обеспечивает большую гибкость реализации TCP в том смысле, что он может группировать исходящие send() призывает к более эффективной передаче или разбить их, если они слишком велики для некоторой точки на пути.

Вы должен Подумайте о TCP как о потоке байтов (например, поступающем из последовательного порта) при получении данных; Вы можете получить любое количество байтов в любое время. Заказ гарантирован, но не группировка.

На практике группировка часто делает соответствует тому, как были отправлены данные, что оставляет приложения, которые работают большую часть времени, но не все время.

2

Другие решения

Вы правы насчет части заказа. Часть 2 сообщения будет видна не ранее, чем часть 1, даже если оно физически поступило раньше. Но вполне возможно, что часть 2 сообщения видна потом чем часть 1 сообщения. А поскольку TCP не имеет представления о границах сообщений (он работает с байтами), вы просто получаете половину сообщения.

0

По вопросам рекламы [email protected]