Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Сети > listen и размер очереди


Автор: moloto4ek 5.10.2010, 00:21
Здравствуйте, объясните зачем вообще эта очередь и как она влияет на производительность. listen - 2 аргумент.
Когда начинается эта самая очередь.

Как я понимаю:
Если 5 клиентов одноврмн. или почти одноврмн. шлют пакет (SYN) и в это время 6-ой пытается сделать тоже самое, сервер ему отвечает RST.  (если в аргументе стоит 5) Или все не так ?
спасибо.  Для наглядности

1 client --------SYN----------->     <------SYN, ACK-|
2 client--------SYN------------>     <-----SYN, ACK- |
3 client --------SYN------------>     <-----SYN, ACK-| SERVER
4 client--------SYN------------>      <----SYN, ACK- | 
5 client--------SYN------------>       <----SYN, ACK-|
6 client--------SYN------------>      <----RST-------- |

Правильно я понимаю, спасибо.

Автор: icecrashldr 5.10.2010, 16:30

[MSDN]
    The maximum length of the queue of pending connections. If set to SOMAXCONN, the underlying service provider responsible for socket s will set the backlog to a maximum reasonable value. There is no standard provision to obtain the actual backlog value.

POSIX Linux
The behaviour of the backlog parameter on TCP sockets changed with Linux 2.2. Now it specifies the queue length for completely established sockets waiting to be accepted, instead of the number of incomplete connection requests. The maximum length of the queue for incomplete sockets can be set using the tcp_max_syn_backlog sysctl. When syncookies are enabled there is no logical maximum length and this sysctl setting is ignored. See tcp(7) for more information. 


Цитата

Здравствуйте, объясните зачем вообще эта очередь и как она влияет на производительность.

На производительность не влияет, но серсер должен успевать делать accept для клиентов.
Но следует понимать, если очередь будет бесконечной , то клиент может провоцировать сервер на выделения память что может привести в dDos -атаки. Отказ от обслуживании.

Автор: moloto4ek 5.10.2010, 18:52
Подскажите как это всё будет на уровне TCP.

Автор: Олег2005 5.10.2010, 23:48
Не все так непонятно....
int listen(int sd, int backlog);
Для истинной картины в большинстве юниксовых стеков имеется формула

backlog * 3 / 2 + 1

Те для
listen(sd, 0); будет 1

для
listen(sd, 5); будет 8

Для TCP-сервера функция listen() формирует в ядре системы два вида буферов:
·    Буфер-очередь не полностью установленных соединений (т.е. тех, для которых идет и еще полностью не завершен трехсторонний handshake);
·    Буфер-очередь полностью установленных соединений (т.е. тех, для которых трехсторонний handshake успешно завершен и сервер принимает конкретный запрос на обслуживание).
·    Сумма длин обеих очередей не может превышать значение backlog

Если же очередь переполняется - то тогда и может быть RST - или просто игнорирование - и то и другое  плохо для клиентов.
Надо ставить больше backlog - скажем 10-20
Может и больше - для мощных серверов.....

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)