Назад | Перейти на главную страницу

Как определить, почему порт передает статус «ZeroWindow»

У меня есть два сервера CentOS (один - сервер приложений, другой - БД), которые обмениваются данными через порт. Время от времени сервер приложений начинает широковещательную рассылку о том, что порт, подключенный к БД, имеет статус «ZeroWindow» (нулевой размер окна) (как видно через tcpdumps).

Когда это происходит, порт на сервере БД заполняет свой Send Q байтами, поскольку ничто на стороне сервера приложений не читает их.

Как я могу узнать, что заставляет мой сервер приложений отправлять порт в это состояние «ZeroWindow», когда это происходит?

Порт не «транслирует» нулевое окно. Окно приема TCP (RWIN) является атрибутом TCP-соединения. С помощью RWIN получатель сообщает отправителю, сколько байтов он может принять в свой буфер. Отправитель отправит столько байтов, сколько находится в этом окне, прежде чем ждать ACK. Если RWIN установлен на 0, отправитель больше не будет отправлять пакеты, пока RWIN снова не увеличится.

RWIN с размером 0 обычно означает, что у получателя больше нет доступного буфера для приема данных из TCP-соединения, возможно, потому, что данные не собираются приложением или потому что они собираются недостаточно быстро.

Таким образом, вам придется отлаживать приложение на стороне получателя (сервера приложений), чтобы понять, почему оно устанавливает значение RWIN равным нулю.

Для начала посмотрите на вывод netstat -tpn и посмотрите, увеличивается ли Recv-Q соединения или остается на высоком уровне. Это будет означать, что данные не собираются приложением (или не собираются достаточно быстро). После этого все зависит от приложения.