Совместное использование портов Net.TCP
Windows Communication Foundation (WCF) предоставляет новый сетевой протокол на основе TCP (net.tcp://) для высокопроизводительного взаимодействия. WCF также представляет новый системный компонент, службу общего доступа к портам Net.TCP, которая позволяет использовать порты net.tcp для нескольких пользовательских процессов.
Предыстория и мотивация
Когда протокол TCP/IP появился впервые, он использовался лишь в небольшим числе протоколов приложений. В TCP/IP для разграничения приложений использовались номера портов: каждому протоколу приложения присваивался уникальный 16-разрядный номер порта. Например, для HTTP-трафика сегодня стандартным считается TCP-порт 80, для SMTP используется TCP-порт 25, а для FTP - TCP-порты 20 и 21. Другие приложения, использующие в качестве транспорта протокол TCP, могут выбирать другие доступные номера портов - по традиции либо в соответствии с формальными стандартами.
Использование для различения приложений номеров портов влекло за собой проблемы с безопасностью. Брандмауэры обычно настраиваются на блокирование TCP-трафика на всех портах, за исключением нескольких широко известных точек входа, поэтому развертывание приложения, использующего нестандартный порт, зачастую сопряжено с трудностями или вообще невозможно в связи с присутствием корпоративных и персональных брандмауэров. Приложения, которые способны обмениваться данными через стандартные, широко известные уже разрешенные порты, уменьшают внешнюю площадь атаки. Многие сетевые приложения используют протокол HTTP, поскольку большинство брандмауэров по умолчанию пропускают трафик на TCP-порту 80.
Модель HTTP.SYS, в которой трафик для множества различных HTTP-приложений мультиплексируется в один TCP-порт, стала стандартной на платформе Windows. Это обеспечивает общую контрольную точку для администраторов брандмауэров и в то же время позволяет разработчикам приложений минимизировать стоимость развертывания при построении новых приложений, работа которых предусматривает использование сети.
Возможность совместного использования портов несколькими HTTP-приложениями в течение долгого времени была характерна для служб Internet Information Services (IIS). Однако это было только с введением HTTP.SYS (прослушиватель протокола HTTP в режиме ядра) с IIS 6.0, что эта инфраструктура была полностью обобщена. По сути HTTP.SYS позволяет произвольным пользовательским процессам совместно использовать TCP-порты, выделенные под HTTP-трафик. Эта возможность позволяет нескольким HTTP-приложениям сосуществовать на одном физическом компьютере в отдельных изолированных процессах и в то же время совместно использовать сетевую инфраструктуру, необходимую для отправки и получения трафика через TCP-порт 80. Служба совместного использования портов Net.TCP делает возможным такое же совместное использование портов для приложений net.tcp.
Архитектура совместного использования портов
Архитектура общего доступа к портам в WCF имеет три основных компонента:
Рабочий процесс: любой процесс, обменивающийся данными по протоколу net.tcp:// через совместно используемые порты.
Транспорт TCP WCF: реализует протокол net.tcp://.
Служба совместного использования портов Net.TCP: позволяет множеству рабочих процессов использовать один и тот же TCP-порт.
Служба совместного использования портов Net.TCP представляет собой службу Windows пользовательского режима, принимающую подключения по net.tcp:// от имени рабочих процессов, которые соединяются через нее. При поступлении подключения через сокет служба совместного использования портов анализирует входящий поток сообщения, чтобы получить его адрес назначения. Располагая этим адресом, служба совместного использования портов может направить поток данных приложению, которое в конечном итоге его обрабатывает.
Когда откроется служба WCF, использующая общий доступ к портам net.tcp://, инфраструктура транспорта WCF TCP не открывает непосредственно сокет TCP в процессе приложения. Вместо этого транспортная инфраструктура регистрирует универсальный код ресурса (URI) базового адреса службы в службе совместного использования портов Net.TCP и ожидает, чтобы служба совместного использования портов прослушивала сообщения от ее имени. Служба совместного использования портов отправляет сообщения, адресованные службе приложения, по мере их поступления.
Установка совместного использования портов
Служба общего доступа к портам Net.TCP доступна во всех операционных системах, поддерживающих WinFX, но служба по умолчанию не включена. Из соображений безопасности администратор должен вручную включить службу совместного использования Net.TCP перед первым использованием. Служба совместного использования портов Net.TCP предоставляет параметры конфигурации, которые позволяют манипулировать некоторыми характеристиками сетевых сокетов, принадлежащих службе совместного использования портов. Дополнительные сведения см. в разделе "Практическое руководство. Включение службы общего доступа к tcp-портам Net.TCP".
Включение совместного использования портов Net.TCP в приложении
Самый простой способ использовать общий доступ к портам net.tcp:// в приложении WCF — предоставить службу с помощью NetTcpBinding службы, а затем включить службу общего доступа к tcp-портам Net.TCP с помощью PortSharingEnabled свойства.
Дополнительные сведения о том, как это сделать, см. в разделе "Практическое руководство. Настройка службы WCF для использования общего доступа к портам".
Проблемы безопасности, связанные с совместным использованием портов
Хотя служба совместного использования портов Net.TCP предусматривает уровень обработки между приложениями и сетью, приложения, совместно использующие порты, все равно необходимо защищать так, как если бы они непосредственно прослушивали сеть. В частности, в приложениях, совместно использующих порты, необходимо оценивать привилегии процессов, в которых они выполняются. Имеет смысл рассмотреть возможность выполнения приложения от имени встроенной учетной записи Network Service, которая выполняется с минимально необходимым для обмена данными по сети набором привилегий.