Проблема распаковки липких пакетов является проблемой относительно низкого уровня в сети и может возникать на канальном, сетевом и транспортном уровнях. Большая часть нашей повседневной разработки сетевых приложений выполняется на транспортном уровне.Поскольку UDP имеет границу защиты сообщений, проблема приклеивания и распаковки не возникает.Поэтому проблема прилипания и распаковки возникает только в протоколе TCP.
Что клеится и распаковывается?
Предполагая, что клиент непрерывно отправляет на сервер два пакета данных, представленных пакетом1 и пакетом2, данные, полученные сервером, можно разделить на три типа, которые перечислены ниже:
**Первый случай: **Принимающая сторона нормально принимает два пакета данных, то есть распаковки и залипания пакетов нет, что не входит в рамки данной статьи.
**Второй случай:** Принимающая сторона получает только один пакет данных. Поскольку TCP не теряет пакеты, этот пакет данных содержит информацию о двух пакетах данных, отправленных отправляющей стороной. Это явление представляет собой липкий пакет. Получателю трудно справиться с этой ситуацией, потому что получатель не знает границ двух пакетов.
**Третья ситуация:** Эта ситуация имеет два проявления, как показано на рисунке ниже. Принимающая сторона получает два пакета данных, но эти два пакета данных либо неполные, либо имеют лишний кусок, в этом случае происходит распаковка и залипание. Если к этим двум случаям не применяется особый подход, принимающей стороне также будет трудно справиться с ними.
Почему происходит залипание и распаковка TCP?
Возникновение залипания и распаковки TCP в основном связано со следующими причинами:
-
Данные, записанные приложением, превышают размер буфера сокета, что приведет к распаковке.
-
Данные, записанные приложением, меньше размера буфера сокета, и сетевая карта несколько раз отправляет данные, записанные приложением, в сеть, что приведет к залипанию пакетов.
-
Выполнить сегментацию TCP по размеру MSS (максимальная длина пакета).Если длина пакета TCP - длина заголовка TCP > MSS, произойдет распаковка пакета.
-
Метод получения не считывает данные буфера сокета вовремя, что приводит к залипанию пакетов.
Приклеивание и распаковка растворов
TCP сам по себе ориентирован на потоки Как сетевому серверу разделить или объединить значимую информацию из этого непрерывного потока данных? Обычно используются следующие общепринятые методы:
-
1. Отправитель добавляет к каждому пакету данных заголовок пакета.Заголовок должен содержать как минимум длину пакета данных, чтобы получатель мог узнать фактическую длину каждого пакета данных, прочитав поле длины заголовка пакета после получения данные. .
-
2. Отправитель инкапсулирует каждый пакет данных в фиксированную длину (если этого недостаточно, его можно заполнить нулями), чтобы принимающая сторона естественным образом разделяла каждый пакет данных каждый раз, когда считывает данные фиксированной длины из принимающего буфера. , Приходите.
-
3. Между пакетами данных может быть установлена граница, например добавление специальных символов, чтобы принимающая сторона могла разделить разные пакеты данных через эту границу.
Справочный адрес
Если вам нравятся мои статьи, вы можете подписаться на мой личный номер подписки. Добро пожаловать, чтобы оставить сообщение и общаться в любое время. Если вы хотите присоединиться к группе WeChat для совместного обсуждения, добавьте, пожалуйста, администратора Jane Stack Culture-Little Assistant (lastpass4u), он притянет вас в группу.