Всем привет, мы снова встретились, я ваш друг Цюаньчжаньцзюнь.
При перепечатке просьба указывать источник оригинального текста! ! !
В программировании сети сокетов вся связь является сквозной. Пятерка, состоящая из порта клиента + порта сервера + IP-адреса клиента + IP-адреса сервера + протокола передачи, может четко идентифицировать соединение. При программировании сокетов TCP и отправитель, и получатель имеют парные сокеты. Чтобы более эффективно отправлять несколько пакетов на принимающую сторону, отправитель использует алгоритм оптимизации (алгоритм Нэгла) для объединения нескольких данных с небольшими интервалами и небольшим объемом данных в один объем данных. Затем большие блоки данных пакетируются. В этом случае принимающая сторона должна использовать эффективный и научный механизм распаковки, чтобы различить эти данные.
Липкие пакеты TCP означают, что несколько пакетов данных, отправленных отправителем, при поступлении к получателю объединяются в один пакет. С точки зрения принимающего буфера заголовок следующего пакета данных следует сразу за концом предыдущего пакета. Причиной липких пакетов может быть отправитель или получатель.
(1) Причины отправителя
TCP по умолчанию использует алгоритм Нэгла (основная роль: уменьшение количества сегментов сообщений в сети), а алгоритм Нэгла в основном делает две вещи:
Алгоритм Нэгла вызывает у отправителя проблемы с застреванием пакетов.
(2) Причины получателя
Когда TCP получает пакет данных, он не будет немедленно передан на уровень приложения для обработки, или уровень приложения не обработает его немедленно. Фактически TCP сохраняет полученные пакеты данных в кэше приема, а затем приложение активно считывает полученные пакеты из кэша. Таким образом, если скорость, с которой TCP получает пакеты данных в кэш, превышает скорость, с которой приложение считывает пакеты данных из кэша, несколько пакетов будут кэшироваться, и приложение сможет читать несколько пакетов, связанных друг с другом. упаковка.
(1) Отправитель
Проблему прилипания пакетов, вызванную отправителем, можно решить, отключив алгоритм Нэгла. Используйте параметр TCP_NODELAY, чтобы отключить алгоритм.
(2) Получатель
Получатель не имеет возможности справиться с явлением липкости и может только передать проблему на прикладной уровень.
(2) Прикладной уровень
Решение прикладного уровня простое и осуществимое. Оно может не только решить липкую проблему получателя, но и решить липкую проблему отправителя.
Решение: циклическая обработка. Когда приложение считывает пакет из приемного буфера, после прочтения одного фрагмента данных оно должно читать следующий фрагмент данных в цикле, пока все данные не будут обработаны. Но как определить длину каждого фрагмента. данных?
Чтобы обеспечить надежную передачу и снизить дополнительные издержки (каждый пакет должен быть проверен), TCP использует потоковую передачу. Потоковая передача не рассматривает сообщения по одному и не имеет защищенных границ сообщений (защищенные границы сообщений: относится к The). протокол передачи рассматривает данные как независимое сообщение для передачи через Интернет, и принимающая сторона может принимать только одно независимое сообщение одновременно).
UDP ориентирован на передачу сообщений и защищает границы сообщений. Получатель одновременно принимает только одно независимое сообщение, поэтому проблем с застреванием не возникает.
Например: есть три пакета данных, размеры которых составляют 2 КБ, 4 КБ и 6 КБ соответственно. Если для их отправки используется UDP, независимо от того, насколько велик приемный буфер получателя, мы должны отправить как минимум три раза, чтобы завершить передачу. отправка пакетов данных, но если мы используем протокол TCP для отправки, нам нужно, чтобы размер буфера приема получателя был только 12 КБ, и мы можем отправить все три пакета данных одновременно.
Издатель: Лидер стека программистов полного стека, укажите источник для перепечатки: https://javaforall.cn/169702.html Исходная ссылка: https://javaforall.cn