Справочник по сетевым протоколам

       

Команда получения


Формат

RECEIVE (местное имя соединения, адрес буфера, счетчик байт) -> счетчик байт, флаг срочности, флаг проталкивания

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

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

Более сложная реализация могла бы позволить за раз выдвигать несколько команд RECEIVE. Эти запросы будут выполняться по мере поступления сегментов с данными. Такая стратегия позволяет увеличить пропускную способность за счет применения более развитой схемы (возможно, асинхронной), а также оповещения программы о том, что получен сигнал проталкивания PUSH или заполнен буфер.

Если получено достаточное количество данных, чтобы заполнить буфер до того, как получен сигнал проталкивания PUSH, то в ответ на RECEIVE не будет установлен флаг PUSH. Буфер будет со держать столько данных, насколько позволяет его емкость. Если сигнал PUSH обнаружен до того, как буфер заполнился, то буфер будет возвращен заполненным частично и с сигналом PUSH.

Если обнаружены срочные данные, то сразу же по их прибытии клиент будет оповещен сигналом от программы протокола TCP. Клиент, получающий данные, должен по этому сигналу перейти в "срочный режим". Если флаг срочности URGENT установлен, то дополнительные срочные данные останутся неполученными. Если флаг URGENT сброшен, то данный запрос на получение RECEIVE возвратит все срочные данные и клиент может освободиться от "срочного режима". Заметим, что данные, следующие за указателем срочности (несрочные данные) не могут быть доставлены к клиенту в одном и том же буфере с предыдущими срочными данными, если сам клиент не определил четко границу.

Чтобы проводить различие между несколькими сделанными командами на получение RECEIVED и следить за заполнением буферов, код, возвращаемый клиенту сопровождается как указателем на буфер, так и количеством действительно полученных данных.

Другие реализации команды RECEIVE могут сами выделять буфер для размещения получаемых данных или же программа протокола TCP может одновременно с клиентом пользоваться циклическим буфером.



Содержание раздела