23.2. Сервер типа «один-ко-многим» с автоматическим закрытием

23.2. Сервер типа «один-ко-многим» с автоматическим закрытием

Вспомните программу-сервер, которую мы написали в главе 10. Эта программа не отслеживала ассоциации. Сервер рассчитывал, что клиент самостоятельно закроет ассоциацию, удалив тем самым данные о ее состоянии. Однако такой подход делает сервер уязвимым: что если клиент откроет ассоциацию, но никаких данных не пришлет? Для такого клиента будут выделены ресурсы, которые он не использует. Неудачное стечение обстоятельств может привести к DoS-атаке на нашу реализацию SCTP со стороны неактивных клиентов. Для предотвращения подобных ситуаций в SCTP была добавлена функция автоматического закрытия ассоциаций (autoclose).

Автоматическое закрытие позволяет конечной точке SCTP задавать максимальную длительность бездействия ассоциации. Ассоциация считается бездействующей, если по ней не передаются никакие данные (ни в одном направлении). Если длительность бездействия превышает установленное ограничение, ассоциация автоматически закрывается реализацией SCTP.

Особое внимание следует уделить выбору ограничения на время бездействия. Значение не должно быть слишком маленьким, иначе сервер может в какой-то момент обнаружить, что ему требуется передать данные по уже закрытой ассоциации. На повторное открытие ассоциации будут затрачены ресурсы, да и вообще маловероятно, что клиент будет готов принять входящую ассоциацию. В листинге 23.1[1] приведена новая версия кода нашего сервера, в которую добавлены вызовы, защищающие этот сервер от неактивных клиентов. Как отмечалось в разделе 7.10, функция автоматического закрытия по умолчанию отключена и должна быть включена явным образом при помощи параметра сокета SCTP_AUTOCLOSE.

Листинг 23.1. Включение автоматического закрытия сокета на сервере

//sctp/sctpserv04.c

14 if (argc == 2)

15  stream_increment = atoi(argv[1]);

16 sock_fd = Socket(AF_INET, SOCK_SEQPACKET, IPPROTO_SCTP);

17 close_time = 120;

18 Setsockopt(sock_fd, IPPROTO_SCTP, SCTP_AUTOCLOSE,

19  &close_time, sizeof(close_time));

20 bzero(&servaddr, sizeof(servaddr));

21 servaddr.sin_family = AF_INET;

22 servaddr.sin_addr.s_addr = htonl(INADDR_ANY);

23 servaddr.sin_report = htons(SERV_PORT);

Установка автоматического закрытия

17-19 Сервер устанавливает ограничение на простой ассоциаций равным 120 с и помещает это значение в переменную close_time. Затем сервер вызывает функцию setsockopt с параметром SCTP_AUTOCLOSE, устанавливающим выбранное ограничение. В остальном код сервера остается прежним.

Теперь SCTP будет автоматически закрывать ассоциации, простаивающие более двух минут. Автоматическое закрытие ассоциаций уменьшает расходы ресурсов сервера на неактивных клиентов.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Отношения типа один-к-одному

Из книги Обработка баз данных на Visual Basic®.NET автора Мак-Манус Джеффри П

Отношения типа один-к-одному Предположим, в вашей базе данных есть таблицы, в которых хранится информация о сотрудниках и видах работ. Если каждому служащему назначается один вид работы, то отношение между сотрудниками и видами работ можно определить типом один-к-одному,


Отношения типа один-ко-многим

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Отношения типа один-ко-многим Гораздо чаще, чем отношения типа один-к-одному, в базах данных используются отношения типа один-ко-многим, в которых каждая запись таблицы связана с одной или несколькими записями в другой таблице (или вообще не связана ни с какими записями). В


Отношения типа многие-ко-многим

Из книги Scrum и XP: заметки с передовой автора Книберг Хенрик

Отношения типа многие-ко-многим Отношение типа многие-ко-многим по сравнению с отношением один-ко-многим идет еще дальше. В качестве классического примера отношения типа многие-ко-многим можно привести отношение между студентами и классами. Каждый студент может иметь


4.2. Приложение типа клиент-сервер

Из книги Linux: Полное руководство автора Колисниченко Денис Николаевич

4.2. Приложение типа клиент-сервер Пример приложения модели клиент-сервер приведен на рис. 4.1. Именно на него мы будем ссылаться в тексте этой главы и главы 6 при необходимости проиллюстрировать использование программных каналов, FIFO и очередей сообщений System V.Клиент


18.10.4. Dante — еще один сервер SOCKS5

Из книги Цифровой журнал «Компьютерра» № 200 автора Журнал «Компьютерра»

18.10.4. Dante — еще один сервер SOCKS5 Этот сервер считается более простым в настройке. Он использует файл конфигурации /etc/sockd.conf (листинг 18.2).Листинг 18.2. Примерный файл /etc/sockd.confinternal: 192.168.0.1 port = 1080external: 111.111.111.111client pass { from: 192.168.0.0/16 to: 0.0.0.0/0}pass { from: 0.0.0.0/0 to: 192.168.0.0/16 command: bindreply udpreply log:


Отношение многие-ко-многим

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

Отношение многие-ко-многим В этом интересном случае, показанном на рис. 17.2, наша модель данных показывает, что каждая строка в таблице TableA может иметь отношения со множеством строк таблицы TableB, и в то же время каждая строка в TableB может иметь множественные отношения со


7. Предложение коучинга в мини-группе или один на один

Из книги автора

7. Предложение коучинга в мини-группе или один на один Если человек оплатил товар и даже купил у вас что-то еще, это не повод останавливаться. Вы можете позвонить всем клиентам по телефону и предложить бесплатную 15-минутную личную консультацию и продать коучинг один на


PS4 стартовала, Xbox One на подходе: один на один или двое против всех? Евгений Золотов

Из книги автора

PS4 стартовала, Xbox One на подходе: один на один или двое против всех? Евгений Золотов Опубликовано 18 ноября 2013 Затянувшееся перемирие в войне игровых консолей окончено: в пятницу в США стартовали продажи Sony PlayStation 4, а её основной соперник, Xbox One от


Сокет типа «один-к-одному»

Из книги автора

Сокет типа «один-к-одному» Данный тип сокета был разработан специально для облегчения переноса существующих приложений с TCP на SCTP. Его модель практически идентична описанной в главе 4. Существуют, конечно, некоторые отличия, о которых следует помнить (в особенности, при


Сокет типа «один-ко-многим»

Из книги автора

Сокет типа «один-ко-многим» Сокет типа «один-ко-многим» дает разработчику приложения возможность написать сервер, не использующий большого количества дескрипторов сокетов. Один дескриптор для такого сервера будет представлять несколько ассоциаций, подобно сокету UDP,


10.2. Потоковый эхо-сервер SCTP типа «один-ко-многим»: функция main

Из книги автора

10.2. Потоковый эхо-сервер SCTP типа «один-ко-многим»: функция main Наши клиент и сервер SCTP вызывают функции в последовательности, представленной на рис. 9.2. Код последовательного сервера представлен в листинге 10.1[1].Листинг 10.1. Потоковый эхо-сервер SCTP//sctp/sctpserv01.c 1 #include "unp.h" 2 int 3


30.5. Параллельный сервер TCP: один дочерний процесс для каждого клиента

Из книги автора

30.5. Параллельный сервер TCP: один дочерний процесс для каждого клиента Традиционно параллельный сервер TCP вызывает функцию fork для порождения нового дочернего процесса, который будет выполнять обработку очередного клиентского запроса. Это позволяет серверу обрабатывать


30.10. Параллельный сервер TCP: один поток для каждого клиента

Из книги автора

30.10. Параллельный сервер TCP: один поток для каждого клиента Предыдущие пять разделов были посвящены рассмотрению серверов, в которых для обработки клиентских запросов используются дочерние процессы, либо заранее порождаемые с помощью функции fork, либо требующие вызова