В SCTP имеется механизм проверки пульса (heartbeat), аналогичный механизму проверочных сообщений (keep-alive) TCP. Этот механизм настраивается при помощи элементов параметра сокета SCTP_SET_PEER_ADDR_PARAMS, который будет описан далее, а не при помощи параметра SO_KEEPALIVE. Последний полностью игнорируется сокетом SCTP и не мешает работе механизма проверки пульса.
В табл. 7.3 суммируются различные методы, применяемые для обнаружения того, что происходит на другом конце соединения TCP. Когда мы говорим «использование функции
select
для проверки готовности к чтению», мы имеем в виду вызов функции
select
для проверки, готов ли сокет для чтения.
Таблица 7.3. Методы определения различных условий TCP
Сценарий | Процесс собеседника выходит из строя | Узел собеседника выходит из строя | Узел собеседника недоступен |
---|---|---|---|
Наш TCP активно посылает данные | TCP собеседника посылает сегмент FIN, что мы можем сразу же обнаружить, используя функцию select для проверки готовности к чтению. Если TCP посылает второй сегмент, TCP собеседника посылает в ответ сегмент RST. Если TCP посылает еще один сегмент, наш TCP посылает сигнал SIGPIPE | По истечении времени ожидания TCP возвращается ошибка ETIMEDOUT | По истечении времени ожидания TCP возвращается ошибка ETIMEDOUT |
Наш TCP активно принимает данные | TCP собеседника посылает сегмент FIN, который мы прочитаем как признак конца файла (возможно, преждевременный) | Мы больше не получаем никаких данных | Мы больше не получаем никаких данных |
Соединение неактивно, посылается пробный пакет | TCP собеседника посылает сегмент FIN, который мы можем сразу же обнаружить, используя функцию select для проверки готовности к чтению | По истечении двух часов отсутствия активности отсылается 9 сообщений для проверки наличия связи с собеседником, а затем возвращается ошибка ETIMEDOUT | По истечении двух часов отсутствия активности отсылается 9 сообщений для проверки наличия связи с собеседником, а затем возвращается ошибка ETIMEDOUT |
Соединение неактивно, не посылается проверочное сообщение | TCP собеседника посылает сегмент FIN, который мы можем сразу же обнаружить, используя функцию select для проверки готовности к чтению | Ничего не происходит | Ничего не происходит |
Параметр сокета SO_LINGER
Этот параметр определяет, как работает функция
close
для протоколов, ориентированных на установление соединения (например, TCP и SCTP, но не UDP). По умолчанию функция
close
возвращает управление немедленно, но если в отправляющем буфере сокета остаются какие-либо данные, система попытается доставить данные собеседнику.
Параметр сокета
SO_LINGER
позволяет нам изменять поведение по умолчанию. Для этого необходимо, чтобы между пользовательским процессом и ядром была передана следующая структура, определяемая в заголовочном файле
:
struct linger {
int l_onoff; /* 0=off, ненулевое значение=on */ int l_linger;
/* время ожидания, в POSIX измеряется в секундах */
};