listen () игнорирует аргумент backlog? - PullRequest
25 голосов
/ 25 февраля 2011

У меня следующая проблема:

У меня есть sockfd = socket(AF_INET, SOCK_STREAM, 0)

После того, как я установил и связал сокет (скажем, с sockfd.sin_port = htons(666)), я сразу же сделал:

listen(sockfd, 3);

sleep(50); // for test purposes

Я сплю в течение 50 секунд, чтобы проверить аргумент backlog, который, кажется, игнорируется, потому что я могу установить соединение * более 3 раз на порт 666.

*: Я имею в виду, что я получаю syn / ack для каждого N-го SYN (n> 3), отправленного клиентом и помещенного в очередь прослушивания, вместо того, чтобы быть отброшенным. Что может быть не так? Я прочитал страницы руководства по listen (2) и tcp (7) и обнаружил:

Поведение аргумента backlog на TCP-сокетах изменилось в Linux 2.2. Теперь он указывает длину очереди для полностью установленных сокетов, ожидающих принятия, вместо количества незавершенных запросов на подключение. Максимальная длина очереди для неполных сокетов может быть установлен с помощью / Труды / системы / нетто / ipv4 / tcp_max_syn_backlog. Когда синхронизированы включены нет логической максимальной длины, и это настройка игнорируется. Смотрите tcp (7) для Больше информация.

, но даже с sysctl -w sys.net.ipv4.tcp_max_syn_backlog=2 и sysctl -w net.ipv4.tcp_syncookies=0 я все равно получаю те же результаты! Должно быть, я что-то упустил или совершенно неправильно понял цель отставания listen().

Ответы [ 2 ]

38 голосов
/ 25 февраля 2011

Аргумент backlog для listen() носит рекомендательный характер.

POSIX говорит :

Аргумент backlog предоставляет подсказку к реализации которого реализация должна использовать для ограничения количество выдающихся соединений в очередь прослушивания сокета.

Текущие версии ядра Linux округляют его до следующей максимальной степени двух, с минимумом 16. Проникающий код находится в reqsk_queue_alloc () .

3 голосов
/ 25 февраля 2011

Разные операционные системы предоставляют разное количество подключений в очереди с разными номерами невыполненных работ.Похоже, что FreeBSD является одной из немногих ОС, которые на самом деле имеют отображение 1: 1.(источник: http://books.google.com/books?id=ptSC4LpwGA0C&lpg=PA108&ots=Kq9FQogkTr&dq=berkeley%20listen%20backlog%20ack&pg=PA108#v=onepage&q=berkeley%20listen%20backlog%20ack&f=false)

...