Поделиться через


Необработанные сокеты TCP/IP

Необработанный сокет — это тип сокета, который позволяет получить доступ к базовому поставщику транспорта. В этом разделе рассматриваются только необработанные сокеты и протоколы IPv4 и IPv6. Это связано с тем, что большинство других протоколов, за исключением ATM, не поддерживают необработанные сокеты. Чтобы использовать необработанные сокеты, приложение должно иметь подробные сведения об используемом базовом протоколе.

Поставщики услуг Winsock для ПРОТОКОЛА IP могут поддерживать тип сокета SOCK_RAW. Поставщик сокетов Windows 2 для TCP/IP, включенный в Windows, поддерживает этот тип сокета SOCK_RAW.

Существует два основных типа таких необработанных сокетов:

  • Первый тип использует известный тип протокола, написанный в заголовке IP- адреса, распознаваемом поставщиком услуг Winsock. Примером первого типа сокета является сокет для протокола ICMP (типа IP-протокола = 1) или протокола ICMPv6 (тип IP procotol = 58).
  • Второй тип позволяет указывать любой тип протокола. Примером второго типа будет экспериментальный протокол, который не поддерживается напрямую поставщиком услуг Winsock, таким как протокол передачи потока (SCTP).

Определение того, поддерживаются ли необработанные сокеты

Если поставщик услуг Winsock поддерживает SOCK_RAW сокеты для семейств адресов AF_INET или AF_INET6, то тип сокета SOCK_RAW должен быть включен в структуру WSAPROTOCOL_INFO, возвращаемую функцией WSAEnumProtocols для одного или нескольких доступных поставщиков транспорта.

Элемент iAddressFamily в структуре WSAPROTOCOL_INFO должен указывать AF_INET или AF_INET6, а элемент iSocketType структуры WSAPROTOCOL_INFO должен указывать SOCK_RAW для одного из поставщиков транспорта.

Для элемента iProtocol структуры WSAPROTOCOL_INFO может быть задано значение IPROTO_IP. Элемент iProtocol структуры WSAPROTOCOL_INFO также может иметь значение нулю, если поставщик услуг позволяет приложению использовать тип сокета SOCK_RAW для других сетевых протоколов, отличных от протокола Интернета для семейства адресов.

Другие члены в структуре WSAPROTOCOL_INFO указывают другие свойства поддержки протокола для SOCK_RAW и указывают, как следует обрабатывать сокет SOCK_RAW. Эти другие члены WSAPROTOCOL_INFO для SOCK_RAW обычно указывают, что протокол не подключен, ориентирован на сообщения, поддерживает широковещательную или многоадресную рассылку (XP1_CONNECTIONLESS, XP1_MESSAGE_ORIENTED, XP1_SUPPORT_BROADCAST и XP1_SUPPORT_MULTIPOINT биты задаются в члене dwServiceFlags1) и могут иметь максимальный размер сообщения 65 467 байт.

В Windows XP и более поздних версиях можно использовать команду NetSh.exe, чтобы определить, поддерживаются ли необработанные сокеты. Следующая команда, выполняемая из окна CMD, будет отображать данные из каталога Winsock в консоли:

netsh winsock show catalog

Выходные данные будут содержать список, содержащий некоторые данные из структур WSAPROTOCOL_INFO, поддерживаемых на локальном компьютере. Найдите термин RAW/IP или RAW/IPv6 в поле "Описание", чтобы найти эти протоколы, поддерживающие необработанные сокеты.

Создание необработанного сокета

Чтобы создать сокет типа SOCK_RAW, вызовите функциюсокетаили WSASocket с параметром af (семейство адресов), равным AF_INET или AF_INET6, параметру типу задано значение SOCK_RAW, а параметр протокола задан необходимому номеру протокола. Параметр протокола становится значением протокола в заголовке IP (SCTP — 132, например).

Заметка

Приложение может не указывать ноль (0) в качестве параметра протокола длясокета, WSASocketи функции WSPSocket, если параметр типа имеет значение SOCK_RAW.

 

Необработанные сокеты обеспечивают возможность управления базовым транспортом, поэтому их можно использовать для вредоносных целей, которые представляют угрозу безопасности. Поэтому только члены группы "Администраторы" могут создавать сокеты типа SOCK_RAW в Windows 2000 и более поздних версиях.

Операции отправки и получения

После создания сокета типа SOCK_RAWэтот сокет может использоваться для отправки и получения данных. Все пакеты, отправленные или полученные в сокете типа SOCK_RAW, обрабатываются как диаграммы данных в несоединяемом сокете.

Следующие правила применяются к операциям по SOCK_RAW сокетам:

  • Функция sendto или WSASendTo обычно используется для отправки данных в сокет типа SOCK_RAW. Целевой адрес может быть любым допустимым адресом в семействе адресов сокета, включая широковещательный или многоадресный адрес. Чтобы отправить на широковещательный адрес, приложение должно использовать setsockopt с включенным SO_BROADCAST. В противном случае sendto или WSASendTo завершится ошибкой WSAEACCES. Для IP-адреса приложение может отправляться на любой адрес многоадресной рассылки (не став членом группы).

  • При отправке данных IPv4 приложение может выбрать, следует ли указывать заголовок IPv4 перед исходящей диаграммой данных для пакета. Если параметр сокета IP_HDRINCL имеет значение true для сокета IPv4 (семейство адресов AF_INET), приложение должно предоставить заголовок IPv4 в исходящих данных для операций отправки. Если этот параметр сокета имеет значение false (параметр по умолчанию), то заголовок IPv4 не должен включать исходящие данные для операций отправки.

  • При отправке данных IPv6 приложение может выбрать, следует ли указывать заголовок IPv6 перед исходящей диаграммой данных для пакета. Если параметр сокета IPV6_HDRINCL имеет значение true для сокета IPv6 (семейство адресов AF_INET6), приложение должно указать заголовок IPv6 в исходящих данных для операций отправки. Значение по умолчанию для этого параметра равно false. Если этот параметр сокета имеет значение false (параметр по умолчанию), то заголовок IPv6 не должен быть включен в исходящие данные для операций отправки. Для IPv6 не нужно включать заголовок IPv6. Если информация доступна с помощью функций сокета, то заголовок IPv6 не должен быть включен, чтобы избежать проблем совместимости в будущем. Эти вопросы обсуждаются в RFC 3542, опубликованном IETF. Использование параметра сокета IPV6_HDRINCL не рекомендуется и может быть устарело в будущем.

  • Функция recvfrom или функции WSARecvF rom обычно используется для получения данных в сокете типа SOCK_RAW. Обе эти функции имеют возможность вернуть исходный IP-адрес, из которого был отправлен пакет. Полученные данные — это диаграмма данных из несоединяемого сокета.

  • Для IPv4 (семейство адресов AF_INET) приложение получает заголовок IP на передней части каждой полученной диаграммы данных независимо от параметра сокета IP_HDRINCL.

  • Для IPv6 (семейство адресов AF_INET6) приложение получает все после последнего заголовка IPv6 в каждой полученной диаграмме данных независимо от параметра сокета IPV6_HDRINCL. Приложение не получает заголовки IPv6 с помощью необработанного сокета.

  • Полученные диаграммы данных копируются во все сокеты SOCK_RAW, удовлетворяющие следующим условиям:

    • Номер протокола, указанный в параметре протокола при создании сокета, должен соответствовать номеру протокола в заголовке IP полученной диаграммы данных.
    • Если для сокета определен локальный IP-адрес, он должен соответствовать целевому адресу, как указано в заголовке IP полученной диаграммы данных. Приложение может указать локальный IP-адрес, вызвав функцию привязки. Если для сокета не указан локальный IP-адрес, диаграммы данных копируются в сокет независимо от целевого IP-адреса в заголовке IP полученной диаграммы данных.
    • Если внешний адрес определен для сокета, он должен соответствовать исходному адресу, как указано в заголовке IP полученной диаграммы данных. Приложение может указать внешний IP-адрес, вызвав функциюподключенияили WSAConnect. Если внешний IP-адрес не указан для сокета, диаграммы данных копируются в сокет независимо от исходного IP-адреса в заголовке IP полученной диаграммы данных.

Важно понимать, что некоторые сокеты типа SOCK_RAW могут получать множество непредвиденных диаграмм данных. Например, программа PING может создать сокет типа SOCK_RAW для отправки запросов эхо-уведомлений ICMP и получения ответов. Хотя приложение ожидает ответы на эхо-ответы ICMP, все остальные сообщения ICMP (например, ICMP HOST_UNREACHABLE) также могут быть доставлены в это приложение. Кроме того, если несколько SOCK_RAW сокетов открыты на компьютере одновременно, то одни и те же диаграммы данных могут быть доставлены всем открытым сокетам. Приложение должно иметь механизм для распознавания интересующих данных и пропускать все остальные. Для программы PING такой механизм может включать проверку полученного IP-заголовка для уникальных идентификаторов в заголовке ICMP (например, идентификатор процесса приложения).

Заметка

Для использования сокета типа SOCK_RAW требуются права администратора. Пользователи, использующие необработанные сокеты, должны быть членом группы "Администраторы" на локальном компьютере, в противном случае необработанные вызовы сокета завершаются ошибкой WSAEACCES. В Windows Vista и более поздних версиях доступ к необработанным сокетам применяется при создании сокета. В более ранних версиях Windows доступ к необработанным сокетам применяется во время других операций сокета.

 

Распространенные способы использования необработанных сокетов

Одним из распространенных вариантов использования необработанных сокетов является устранение неполадок приложений, которые должны подробно изучить IP-пакеты и заголовки. Например, необработанный сокет можно использовать с SIO_RCVALL IOCTL, чтобы разрешить сокету получать все пакеты IPv4 или IPv6, передаваемые через сетевой интерфейс. Дополнительные сведения см. в SIO_RCVALL справочнике.

Ограничения на необработанные сокеты

В Windows 7, Windows Vista, Windows XP с пакетом обновления 2 (SP2) и Windows XP с пакетом обновления 3 (SP3) возможность отправки трафика через необработанные сокеты была ограничена несколькими способами:

  • Tcp-данные нельзя отправлять по необработанным сокетам.

  • UDP-диаграммы данных с недопустимым исходным адресом нельзя отправлять через необработанные сокеты. IP-адрес источника для любой исходящей UDP-диаграммы данных должен существовать в сетевом интерфейсе или на диаграмме данных удаляется. Это изменение было сделано, чтобы ограничить способность вредоносного кода создавать распределенные атаки типа "отказ в обслуживании" и ограничивает возможность отправки спуфинированных пакетов (TCP/IP-пакетов с подделанным IP-адресом).

  • Вызов функции привязки с необработанным сокетом для протокола IPPROTO_TCP запрещен.

    Заметка

    Функция привязки с необработанным сокетом допускается для других протоколов (например, IPPROTO_IP, IPPROTO_UDP или IPPROTO_SCTP).

     

Эти указанные выше ограничения не применяются к Windows Server 2008 R2, Windows Server 2008, Windows Server 2003 или версиям операционной системы до Windows XP с пакетом обновления 2 (SP2).

Заметка

Реализация TCP/IP в Windows может открывать необработанный UDP или сокет TCP на основе указанных выше ограничений. Другие поставщики Winsock могут не поддерживать использование необработанных сокетов.

 

Существуют дополнительные ограничения для приложений, использующих сокет типа SOCK_RAW. Например, все приложения, прослушивающие определенный протокол, получат все пакеты, полученные для этого протокола. Это может быть не то, что нужно для нескольких приложений с помощью протокола. Это также не подходит для высокопроизводительных приложений. Чтобы обойти эти проблемы, может потребоваться написать драйвер сетевого протокола Windows (драйвер устройства) для конкретного сетевого протокола. В Windows Vista и более поздних версиях Winsock Kernel (WSK) можно использовать новый сетевой программный интерфейс сетевого программирования независимо от транспорта. В Windows Server 2003 и более ранних версиях поставщик интерфейса драйвера транспорта (TDI) и вспомогательный dll-файл Winsock можно записать для поддержки сетевого протокола. Затем сетевой протокол будет добавлен в каталог Winsock в качестве поддерживаемого протокола. Это позволяет нескольким приложениям открывать сокеты для этого конкретного протокола, и драйвер устройства может отслеживать, какой сокет получает определенные пакеты и ошибки. Сведения о написании поставщика сетевых протоколов см. в разделах WSK и TDI в комплекте драйверов Windows (WDK).

Приложения также должны учитывать влияние параметров брандмауэра на отправку и получение пакетов с помощью необработанных сокетов.