У меня есть гипотеза: иногда TCP-соединения приходят быстрее, чем мой сервер accept()
. Они выстраиваются в очередь до тех пор, пока очередь не переполнится, а затем возникают проблемы.
Как я могу подтвердить, что это происходит?
Могу ли я контролировать длину очереди приема или количество переполнений? Где-нибудь выставлен счетчик?
netstat
показывает только длину очереди отправки и получения, которая не совпадает с длиной очереди приема.
man netstat | less +/Flags
netstat
, кажется, вообще не показывается Flags
для соединений TCP. После небольшого тестирования похоже, что соединения показываются как ESTABLISHED
на netstat
, даже если я пытаюсь открыть соединения с процессом, который делает, listen()
но никогда accept()
.
SYN_RECV
. За этим нет другой очереди. Я предполагаю, что ядру можно как-то сказать записывать пропущенные пакеты из-за слишком большого числа полуоткрытых соединений, но прошло более 10 лет с тех пор, как я смотрел на работу в сети с Linux, поэтому я понятия не имею, как это сделать. На заметку: вы не ждете, accept()
чтобы выполнить свою работу, вы ждете, когда ACK
s прибудут с подключающихся хостов, чтобы завершить соединения.
netstat
.