Закрытие соединений

Опубликовано в Технологии > Серверные технологии

После вывода ответа происходит возврат управления из процедуры TCPdaytimed. Вслед за этим в главной процедуре происходит явное закрытие сокета, через который проходил обмен данными с клиентом.

Вызов функции close представляет собой требование выполнить корректное закрытие соединения. Для всех. Широкий выбор подарков предлагает магазин сувениров на сайте http://podarki-market.ru/. В частности, при выполнении этой функции программное обеспечение протокола TCP гарантирует, что все данные будут надежно доставлены клиенту и подтверждены, прежде чем соединение будет разорвано. Поэтому программист может вызвать функцию close, не беспокоясь о том, будут ли доставлены данные.

Безусловно, принцип корректного останова, реализованный в протоколе TCP, означает, что вызов функции close может не быть выполнен немедленно: этот вызов блокируется до тех пор, пока программное обеспечение TCP сервера не получит ответ от программного обеспечения TCP клиента. Как только клиент подтвердит и получение всех данных, и поступление запроса на закрытие соединения, будет выполнен возврат после вызова функции close.

10.7. Закрытие соединения и уязвимость сервера

Прикладной протокол определяет применяемый в сервере способ управления соединениями TCP. В частности, прикладной протокол обычно регламентирует выбор способа завершения соединения. Например, вариант, предусматривающий закрытие соединения сервером, вполне может применяться в случае протокола DAYTIME, поскольку сервер имеет информацию о том, закончилась ли передача данных. В приложениях, предусматривающих более сложные сценарии взаимодействия между сервером и клиентом, нельзя допускать закрытия соединения с сервером сразу после обработки одного запроса, поскольку в процессе работы приходится ждать, не будет ли клиентом принято решение о передаче дополнительных сообщений с запросами. Например, рассмотрим сервер службы ECHO. В этом случае работой сервера управляет клиент, поскольку он определяет объем данных, для которого должен быть выполнен эхо-повтор. В связи с тем, что сервер должен обрабатывать произвольные объемы данных, он не может закрыть соединение после приема и передачи только одного запроса и ответа. Поэтому сигнал о завершении должен передать клиент, чтобы сервер имел информацию о том, когда нужно закрыть соединение.

Предоставление клиентам возможности устанавливать продолжительность соединения может оказаться опасным, поскольку позволяет им управлять использованием ресурсов сервера. В частности, клиенты, выполняющие недопустимые действия, могут заставить сервер впустую расходовать такие ресурсы, как дескрипторы сокетов и соединения TCP. Может показаться, что сервер, приведенный в рассматриваемом примере, никогда не исчерпает ресурсы, поскольку он явно закрывает соединения. Но даже такая простая стратегия закрытия соединения может оказаться уязвимой по отношению к недопустимым действиям клиентов. Чтобы угонять, с чем это связано, напомним, что протокол TCP определяет продолжительность тайм-аута поддержания соединения, равную удвоенному значению максимального времени жизни сегмента (MSL — Maximum Segment Lifetime) после закрытия соединения. В течение этого тайм-аута программное обеспечение TCP проводит регистрацию всех пакетов, передаваемых через соединение, чтобы можно было безошибочно отбросить устаревшие пакеты, которые поступают с задержкой. Поэтому, если клиенты выполняют повторные запросы к серверу в быстрой последовательности, они могут исчерпать ресурсы сервера. Хотя программисты почти не имеют возможности вмешиваться в работу протоколов, они должны понимать, под влиянием каких особенностей протоколов распределенное программное обеспечение может стать уязвимым к нарушениям в работе сети, и попытаться уменьшить такую уязвимость при проектировании серверов.

Похожие статьи