Что такое липкий пакет TCP? Как решить эту проблему [легко понять]
Что такое липкий пакет TCP? Как решить эту проблему [легко понять]

Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.

При перепечатке просьба указывать источник оригинального текста! ! !

В программировании сети сокетов вся связь является сквозной. Пятерка, состоящая из порта клиента + порта сервера + IP-адреса клиента + IP-адреса сервера + протокола передачи, может четко идентифицировать соединение. При программировании сокетов TCP и отправитель, и получатель имеют парные сокеты. Чтобы более эффективно отправлять несколько пакетов на принимающую сторону, отправитель использует алгоритм оптимизации (алгоритм Нэгла) для объединения нескольких данных с небольшими интервалами и небольшим объемом данных в один объем данных. Затем большие блоки данных пакетируются. В этом случае принимающая сторона должна использовать эффективный и научный механизм распаковки, чтобы различить эти данные.

1. Вопрос: Что такое проблема с липким TCP?

Липкие пакеты TCP означают, что несколько пакетов данных, отправленных отправителем, при поступлении к получателю объединяются в один пакет. С точки зрения принимающего буфера заголовок следующего пакета данных следует сразу за концом предыдущего пакета. Причиной липких пакетов может быть отправитель или получатель.

2. Вопрос: Что вызывает зависание TCP-пакетов?

(1) Причины отправителя

TCP по умолчанию использует алгоритм Нэгла (основная роль: уменьшение количества сегментов сообщений в сети), а алгоритм Нэгла в основном делает две вещи:

  1. Следующий пакет будет отправлен только в том случае, если предыдущий пакет будет подтвержден.
  2. Соберите несколько небольших пакетов и отправьте их вместе, когда придет подтверждение.

Алгоритм Нэгла вызывает у отправителя проблемы с застреванием пакетов.

(2) Причины получателя

Когда TCP получает пакет данных, он не будет немедленно передан на уровень приложения для обработки, или уровень приложения не обработает его немедленно. Фактически TCP сохраняет полученные пакеты данных в кэше приема, а затем приложение активно считывает полученные пакеты из кэша. Таким образом, если скорость, с которой TCP получает пакеты данных в кэш, превышает скорость, с которой приложение считывает пакеты данных из кэша, несколько пакетов будут кэшироваться, и приложение сможет читать несколько пакетов, связанных друг с другом. упаковка.

3. Вопрос: Когда вам нужно иметь дело с явлением липкой сумки?

  1. Если несколько наборов данных, отправленных отправителем, изначально представляют собой разные части одного и того же фрагмента данных, например, файл разделен на несколько частей и отправлен, то, конечно, нет необходимости иметь дело с явлением липкости.
  2. Если несколько групп не связаны между собой или даже параллельны, то на этом этапе необходимо решить проблему липкости.

4. Вопрос: Как бороться с явлением прилипания?

(1) Отправитель

Проблему прилипания пакетов, вызванную отправителем, можно решить, отключив алгоритм Нэгла. Используйте параметр TCP_NODELAY, чтобы отключить алгоритм.

(2) Получатель

Получатель не имеет возможности справиться с явлением липкости и может только передать проблему на прикладной уровень.

(2) Прикладной уровень

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

Решение: циклическая обработка. Когда приложение считывает пакет из приемного буфера, после прочтения одного фрагмента данных оно должно читать следующий фрагмент данных в цикле, пока все данные не будут обработаны. Но как определить длину каждого фрагмента. данных?

  1. Форматирование данных: каждая часть данных имеет фиксированный формат (начальный символ, конечный символ). Этот метод прост и удобен в реализации, но при выборе начального и конечного символа убедитесь, что каждый фрагмент данных не совпадает. содержать начальный и конечный символы.
  2. Длина отправки: при отправке каждого фрагмента данных отправляйте длину данных вместе. Например, указано, что первые 4 бита данных представляют собой длину данных. Прикладной уровень может определять начальную и конечную позицию. каждый пакет в зависимости от длины во время обработки.

5. Вопрос: Будет ли UDP вызывать проблемы с зависанием пакетов?

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

UDP ориентирован на передачу сообщений и защищает границы сообщений. Получатель одновременно принимает только одно независимое сообщение, поэтому проблем с застреванием не возникает.

Например: есть три пакета данных, размеры которых составляют 2 КБ, 4 КБ и 6 КБ соответственно. Если для их отправки используется UDP, независимо от того, насколько велик приемный буфер получателя, мы должны отправить как минимум три раза, чтобы завершить передачу. отправка пакетов данных, но если мы используем протокол TCP для отправки, нам нужно, чтобы размер буфера приема получателя был только 12 КБ, и мы можем отправить все три пакета данных одновременно.

Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/169702.html Исходная ссылка: https://javaforall.cn

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose