Выделенный сокет может быть передан потоку или дочернему процессу для обработки запросов клиента. Листинг 23.15 демонстрирует новую модифицированную версию сервера, который обрабатывает первое сообщение клиента, выделяет ассоциацию при помощи
sctp_peeloffstr_echosrisinfo_assoc_idЛистинг 23.15. Параллельный сервер SCTP
//sctp/sctpserv_fork.c23 for (;;) {24 len = sizeof(struct sockaddr_in);25 rd_sz = Sctp_recvmsg(sock_fd, readbuf, sizeof(readbuf),26 (SA*)&cliaddr, &len, &sri, &msg_flags);27 Sctp_sendmsg(sock_fd, readbuf, rd_sz,28 (SA*)&cliaddr, len,29 sri.sinfo_ppid,30 sri.sinfo_flags, sn.sinfo_stream, 0, 0);31 assoc = sctp_address_to_associd(sock_fd, (SA*)&cliaddr, len);32 if ((int)assoc == 0) {33 err_ret("Can't get association id");34 continue;35 }36 connfd = sctp_peeloff(sock_fd, assoc);37 if (connfd == -1) {38 err_ret("sctp_peeloff fails");39 continue;40 }41 if ((childpid = fork()) == 0) {42 Close(sock_fd);43 str_echo(connfd);44 exit(0);45 } else {46 Close(connfd);47 }48 }26-3031-3536-40sctp_peeloffstr_echo41-4723.11. Управление таймерами
Протокол SCTP имеет множество численных пользовательских параметров. Все они устанавливаются через параметры сокетов, рассмотренные в разделе 7.10. Далее мы займемся рассмотрением нескольких параметров, определяющих задержку перед объявлением об отказе ассоциации или адреса собеседника.
Время обнаружения отказа в SCTP определяется семью переменными (табл. 23.1).
Таблица 23.1. Поля таймеров SCTP
| Поле | Описание | По умолчанию | Единицы |
|---|---|---|---|
| srto_min | Минимальный тайм-аут повторной передачи | 1000 | Мс |
| srto_max | Максимальный тайм-аут повторной передачи | 60000 | Мс |
| srto_initial | Начальный тайм-аут повторной передачи | 3000 | Мс |
| sinit_max_init_timeo | Максимальный тайм-аут повторной передачи сегмента INIT | 3000 | Мс |
| sinit_max_attempts | Максимальное количество повторных передач сегмента INIT | 8 | попыток |
| spp_pathmaxrxt | Максимальное количество повторных передач по адресу | 5 | попыток |
| sasoc_asocmaxrxt | Максимальное количество повторных передач на ассоциацию | 10 | попыток |
Эти параметры можно воспринимать как регуляторы, укорачивающие и удлиняющие время обнаружения отказа. Рассмотрим два сценария.
1. Конечная точка SCTP пытается открыть ассоциацию с собеседником, отключившимся от сети.
2. Две многоинтерфейсные конечные точки SCTP обмениваются данными. Одна из них отключается от сети питания в момент передачи данных. Сообщения ICMP фильтруются защитными экранами и потому не достигают второй конечной точки.
В сценарии 1 система, пытающаяся открыть соединение, устанавливает таймер RTO равным
srto_initialsinit_max_attemptssinit_max_init_timeoВращением нескольких «ручек» мы можем удлинять и укорачивать это время. Начнем с двух параметров, позволяющих уменьшить общую задержку. Сократим количество повторных передач, изменив переменную
sinit_max_attemptssrto_max_init_timeo