![]() |
|
Модераторы: feodorv |
![]()
|
|
| moloto4ek |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 27.6.2010 Репутация: нет Всего: нет |
Здравствуйте, объясните зачем вообще эта очередь и как она влияет на производительность. 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 |
|
|||
![]() Developer ![]() Профиль Группа: Участник Сообщений: 122 Регистрация: 5.7.2010 Репутация: нет Всего: нет |
[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 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 27.6.2010 Репутация: нет Всего: нет |
Подскажите как это всё будет на уровне TCP.
|
|||
|
||||
| Олег2005 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 421 Регистрация: 26.5.2005 Где: Рига Латвия Репутация: 6 Всего: 11 |
Не все так непонятно....
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 Может и больше - для мощных серверов..... Это сообщение отредактировал(а) Олег2005 - 5.10.2010, 23:49 |
|||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Сети | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |