что такое отставание
Backlog — это параметр прослушивания функции сокета в Linux.Когда приложение вызывает системный вызов listen, чтобы перевести сокет в состояние LISTEN, необходимо указать параметр backlog. Этот параметр часто называют ограничением длины новой очереди соединений.
Поскольку TCP требует трех рукопожатий для установления соединения, новое соединение должно пройти через промежуточное состояние SYN RECEIVED, прежде чем достигнет состояния ESTABLISHED, и может быть возвращено приложению с помощью системного вызова accept. Это означает, что в стеке TCP/IP есть два разных варианта реализации очередей невыполненных работ:
Используется только одна очередь, а размер очереди определяется параметром невыполненной работы системного вызова listen. Когда стек протоколов получает пакет SYN, он отвечает на пакет SYN/ACK и добавляет соединение в очередь. Когда соответствующий ответный пакет ACK получен, соединение становится УСТАНОВЛЕННЫМ и может быть возвращено приложению. Это означает, что соединения в очереди могут иметь два различных состояния: SEND RECEIVED и ESTABLISHED. Только последнее соединение может быть возвращено приложению с помощью системного вызова accept.
--SYN две очереди, использующие очередь (очередь, ожидающая подключения) и приемную очередь (подключение очереди завершено). Состояние подключения RECEIVED в очередь SYN SYN, при перемещении в последующую очередь состояния изменяется на ESTABLISHED accept queue (т. е. последний получен пакет ACK трехэтапного рукопожатия). Как следует из названия, системный вызов accept просто принимает новое подключение потребителя из очереди. В этом случае параметр listen system call backlog определяет максимальный размер принимаемой очереди.
Для операционной системы Linux после версии ядра 2.2 протокол tcp/ip реализует вторую схему, то есть очередь на синхронизацию и очередь на прием, длина очереди на синхронизацию задается на системном уровне, а длина очередь принятия может быть задана на уровне приложения, процесс взаимодействия при установлении tcp соединения показан на следующем рисунке:
Клиентская сторона использует connect() для инициирования запроса на соединение (отправляет синхропакет) на серверную сторону.В это время TCP-статус клиентской стороны — SYN_SENT.
После того, как серверная сторона получает пакет синхронизации, она помещает информацию, относящуюся к TCP, в очередь синхронизации (полуподключенная очередь) и одновременно отправляет синхронизацию + подтверждение клиенту, а состояние TCP на стороне сервера SYN_RCVD.
После того, как клиентская сторона получает syn+ack от серверной стороны, она отправляет ack на серверную сторону.В это время TCP-статус клиентской стороны ESTABLISHED. После того, как серверная сторона получает подтверждение подтверждения, она извлекает информацию TCP из очереди синхронизации и помещает ее в очередь принятия (полная очередь соединений).В это время состояние TCP стороны сервера УСТАНОВЛЕНО.
Как установить отставание
Системный уровень: параметр somaxconn, который можно установить, отредактировав значение /proc/sys/net/core/somaxconn.
Уровень приложения: для сервера netty он устанавливается с помощью опции serverbootstrap, то есть option((ChannelOption.SO_BACKLOG,number), число — это устанавливаемый размер, а тип — int
Окончательное значение отставания — минимальное из двух, а именно min(backlog, somaxconn).После запуска сервиса мы можем просмотреть его через ss -tnlp, как показано на следующем рисунке:
стандарт настройки отставания
анализ использования резерва
Для использования очереди невыполненных работ мы можем запросить ее через netstat, как показано на следующем рисунке:
Когда tcp_abort_on_overflow=0, ACK отбрасывается напрямую, и следующий процесс взаимодействия можно увидеть, перехватив пакеты через tcpdump
Когда tcp_abort_on_overflow = 1, клиент отправляет RST-уведомление, клиент будет сообщен при сбросе соединения узлом.
Процесс захвата пакетов и их просмотра выглядит следующим образом:
Используйте ss -tnlp, чтобы запросить использование очереди полных соединений порта прослушивания.
Через netstat мы можем узнать соединение, состояние соединения которого установлено, но не связано с номером процесса.Это соединение соответствует порту-источнику и порту-получателю.Порт-источник этого соединения - это порт, который слушает наше приложение, то есть номер порта, на котором очередь невыполненных работ переполняется.