Получение информации о сетевой конфигурации и сетевом трафике

Последнее обновление: 11.12.2022

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

NetworkInterface и сетевые устройства

Для получения информации о сетевых устройствах/интерфейсах на текущей машине можно использовать абстрактный класс NetworkInterface из пространства имен System.Net.NetworkInformation. Собственно класс NetworkInterface и представляет отдельный сетевой интерефейс компьютера.

Основная информация о сетевом интерфейсе хранится в свойствах объекта NetworkInterface:

  • Description: возвращает описание сетевого интерфейса

  • Id: возвращает идентификатор сетевого адаптера

  • Name: возвращает название сетевого адаптера

  • NetworkInterfaceType: тип сетевого интерефейса в виде константы перечисления System.Net.NetworkInformation.NetworkInterfaceType

  • OperationalStatus: возвращает текущий статус операций в виде

  • Speed: возвращает скорость сетевого адаптера в виде количества битов в секунду

Также информацию по сетевым интерефейсам можно получить с помощью следующих методов класса NetworkInterface:

  • GetAllNetworkInterfaces(): возвращает массив объектов NetworkInterface, где каждый элемент представляет сетевой интерфейс на локальной машине (статический метод)

  • GetIPProperties(): возвращает объект IPInterfaceProperties, который представляет все свойства сетевого интерфейса

  • GetIPStatistics(): возвращает статистику для текущего сетевого интерфейса в виде объекта , который хранит статистику в свойствах:

    • BytesReceived: возвращает количество байтов, полученных интерфейсом.

    • BytesSent: возвращает количество байтов, отправленных интерфейсом.

    • IncomingPacketsDiscarded: возвращает количество входящих пакетов, которые были удалены.

    • IncomingPacketsWithErrors: возвращает количество входящих пакетов с ошибками.

    • IncomingUnknownProtocolPackets: возвращает количество входящих пакетов с неизвестным протоколом, которые были получены в интерфейсе.

    • NonUnicastPacketsReceived: возвращает количество неодноадресных пакетов, полученных интерфейсом.

    • NonUnicastPacketsSent: возвращает количество неодноадресных пакетов, отправленных интерфейсом.

    • OutgoingPacketsDiscarded: возвращает количество исходящих пакетов, которые были удалены.

    • OutgoingPacketsWithErrors: возвращает количество исходящих пакетов с ошибками.

    • OutputQueueLength: возвращает длину очереди вывода.

    • UnicastPacketsReceived: возвращает количество одноадресных пакетов, полученных интерфейсом.

    • UnicastPacketsSent: возвращает количество одноадресных пакетов, отправленных интерфейсом.

  • GetIsNetworkAvailable(): возвращает true, если доступно какое-либо сетевое подключение (статический метод)

  • GetPhysicalAddresss(): возвращает физический адрес сетевого интерфейса

Например, получим информацию о всех сетевых интерефейсах на текущей машине:

using System.Net.NetworkInformation;

var adapters = NetworkInterface.GetAllNetworkInterfaces();
Console.WriteLine($"Обнаружено {adapters.Length} устройств");
foreach (NetworkInterface adapter in adapters)
{
    Console.WriteLine("=====================================================================");
    Console.WriteLine();
    Console.WriteLine($"ID устройства: ------------- {adapter.Id}");
    Console.WriteLine($"Имя устройства: ------------ {adapter.Name}");
    Console.WriteLine($"Описание: ------------------ {adapter.Description}");
    Console.WriteLine($"Тип интерфейса: ------------ {adapter.NetworkInterfaceType}");
    Console.WriteLine($"Физический адрес: ---------- {adapter.GetPhysicalAddress()}");
    Console.WriteLine($"Статус: -------------------- {adapter.OperationalStatus}");
    Console.WriteLine($"Скорость: ------------------ {adapter.Speed}");

    IPInterfaceStatistics stats = adapter.GetIPStatistics();
    Console.WriteLine($"Получено: ----------------- {stats.BytesReceived}");
    Console.WriteLine($"Отправлено: --------------- {stats.BytesSent}");
}

Мы получим что-то вроде следующего:

Обнаружено 6 устройств
=====================================================================

ID устройства: ------------- {D5CA0C59-7CDF-4B7C-9502-A7296BCF0158}
Имя устройства: ------------ vEthernet (WSL)
Описание: ------------------ Hyper-V Virtual Ethernet Adapter
Тип интерфейса: ------------ Ethernet
Физический адрес: ---------- 0D135B218A94
Статус: -------------------- Up
Скорость: ------------------ 10000000000
Получено: ----------------- 8403404
Отправлено: --------------- 515439337
=====================================================================

ID устройства: ------------- {E5786DCA-6A1D-15A1-B418-E19DA6C04076}
Имя устройства: ------------ Подключение по локальной сети* 1
Описание: ------------------ Microsoft Wi-Fi Direct Virtual Adapter
Тип интерфейса: ------------ Wireless80211
Физический адрес: ---------- 0ACC270A7951
Статус: -------------------- Down
Скорость: ------------------ -1
Получено: ----------------- 0
Отправлено: --------------- 0

Получение информации о всех подключениях

Еще один класс - IPGlobalProperties позволяет получить детальную информацию по сетевому трафику и его конфигурации с помощью ряда методов:

  • GetActiveTcpConnections(): возвращает сведения о TCP-подключениях (массив TcpConnectionInformation[])

  • GetActiveTcpListeners(): возвращает массив адресов TCP-слушателей (массив IPEndPoint[])

  • GetActiveUdpListeners(): возвращает массив адресов UDP-слушателей (массив IPEndPoint[]).

  • GetIcmpV4Statistics(): возвращает статистику протокола ICMPv4 (объект IcmpV4Statistics)

  • GetIcmpV6Statistics(): возвращает статистику протокола ICMPv6 (объект IcmpV6Statistics)

  • GetIPv4GlobalStatistics(): возвращает статистику протокола IPv4 (объект IPGlobalStatistics)

  • GetIPv6GlobalStatistics(): возвращает статистику протокола IPv6 (объект IPGlobalStatistics)

  • GetIPGlobalProperties(): возвращает объект IPGlobalProperties, который предоставляет информацию по сетевой конфигурации и статистику трафика (статический метод)

  • GetUnicastAddresses() / GetUnicastAddressesAsync(): возвращает таблицу IP-адресов одноадресной рассылки (объект UnicastIPAddressInformationCollection)

Например, получим информацию по активным TCP-подключениям:

using System.Net.NetworkInformation;

var ipProps = IPGlobalProperties.GetIPGlobalProperties();
var tcpConnections = ipProps.GetActiveTcpConnections();

Console.WriteLine($"Всего {tcpConnections.Length} активных TCP-подключений");
Console.WriteLine();
foreach (var connection in tcpConnections)
{
    Console.WriteLine("=============================================");
    Console.WriteLine($"Локальный адрес: {connection.LocalEndPoint.Address}:{connection.LocalEndPoint.Port}");
    Console.WriteLine($"Адрес удаленного хоста: {connection.RemoteEndPoint.Address}:{connection.RemoteEndPoint.Port}");
    Console.WriteLine($"Состояние подключения: {connection.State}");
}

Вызов GetActiveTcpConnections() возвращает массив объектов TcpConnectionInformation, которые имеют три свойства:

  • LocalEndPoint: локальная конечная точка, через которую текущий компьютер установил TCP-подключение с удаленным хостом

  • RemoteEndPoint: адрес удаленного хоста, с которым установлено TCP-подключение

  • State: состояние TCP-подключения в виде одной из констант перечисления TcpState:

    • Closed: TCP-подключение закрыто

    • CloseWait: локальная конечная точка ТСР-подключения ожидает от локального пользователя запрос на разрыв подключения

    • Closing: локальная конечная точка ТСР-подключения ожидает подтверждение ранее отправленного запроса на разрыв подключения

    • DeleteTcb: удаляется буфер управления передачей (TCB) для ТСР-подключения

    • Established: TCP-подключение установлено.

    • FinWait1: локальная конечная точка ТСР-подключения ожидает от удаленной конечной точки запрос на разрыв подключения или подтверждение ранее отправленного запроса на разрыв подключения.

    • FinWait2: локальная конечная точка ТСР-подключения ожидает от удаленной конечной точки запрос на разрыв подключения.

    • LastAck: локальная конечная точка ТСР-подключения ожидает окончательное подтверждение ранее отправленного запроса на разрыв подключения.

    • Listen: локальная конечная точка ТСР-подключения прослушивает запросы на подключение

    • SynReceived: локальная конечная точка ТСР-подключения отправила и получила запрос на подключение, и ожидает подтверждения.

    • SynSent: локальная конечная точка ТСР-подключения отправила удаленной конечной точке заголовок сегмента с установленным управляющим битом синхронизации (SYN) и ожидает соответствующий запрос на подключение.

    • TimeWait: локальная конечная точка ТСР-подключения ожидает в течение достаточного времени, чтобы обеспечить получение удаленной точкой подтверждения ее запроса на разрыв подключения.

    • Unknown: неизвестное состояние ТСР-подключения .

Результат программы в моем случае:

Всего 4 активных TCP-подключений

=============================================
Локальный адрес: 192.168.0.112:52308
Адрес удаленного хоста: 13.69.68.64:443
Состояние подключения: TimeWait
=============================================
Локальный адрес: 192.168.0.112:52310
Адрес удаленного хоста: 23.96.225.71:443
Состояние подключения: Established
=============================================
Локальный адрес: 192.168.0.112:58623
Адрес удаленного хоста: 20.54.37.64:443
Состояние подключения: Established
=============================================
Локальный адрес: 192.168.0.112:58631
Адрес удаленного хоста: 52.166.127.37:9354
Состояние подключения: Established

Мониторинг трафика

Методы GetIPv4GlobalStatistics() и GetIPv6GlobalStatistics() класса IPGlobalProperties возвращают объект IPGlobalStatistics, который предоставляет доступ к статистике сетевого трафика с помощью следующих свойств:

  • DefaultTtl: возвращает срок жизни (TTL) IP-пакетов.

  • ForwardingEnabled: возвращает значение bool, которое указывает, разрешена ли переадресация IP-пакетов.

  • NumberOfInterfaces: возвращает количество сетевых интерфейсов.

  • NumberOfIPAddresses: возвращает количество IP-адресов, назначенных локальному компьютеру.

  • NumberOfRoutes: возвращает количество маршрутов в таблице IP-маршрутизации.

  • OutputPacketRequests: возвращает количество исходящих IP-пакетов.

  • OutputPacketRoutingDiscards: возвращает количество маршрутов, удаленных из таблицы маршрутизации.

  • OutputPacketsDiscarded: возвращает количество отправленных отброшенных IP-пакетов

  • OutputPacketsWithNoRoute: возвращает количество IP-пакетов, для которых локальному компьютеру не удалось определить маршрут к адресу назначения.

  • PacketFragmentFailures: возвращает количество IP-пакетов, которые не удалось фрагментировать.

  • PacketReassembliesRequired: возвращает количество IP-пакетов, для которых требовалась восстановление.

  • PacketReassemblyFailures: возвращает количество IP-пакетов, которые не были успешно восстановлены.

  • PacketReassemblyTimeout: возвращает максимальное время, в течение которого должны поступить все фрагменты IP-пакета.

  • PacketsFragmented: возвращает количество фрагментированных IP-пакетов.

  • PacketsReassembled: возвращает количество собранных IP-пакетов.

  • ReceivedPackets: возвращает количество полученных IP-пакетов.

  • ReceivedPacketsDelivered: возвращает количество доставленных IP-пакетов.

  • ReceivedPacketsDiscarded: возвращает количество отброшенных полученных IP-пакетов, которые были удалены.

  • ReceivedPacketsForwarded: возвращает количество переадресованных IP-пакетов.

  • ReceivedPacketsWithAddressErrors: возвращает количество полученных IP-пакетов с ошибками в адресе.

  • ReceivedPacketsWithHeadersErrors: возвращает количество полученных IP-пакетов с ошибками в заголовке.

  • ReceivedPacketsWithUnknownProtocol: возвращает количество IP-пакетов с неизвестным протоколом в заголовке, полученных локальным компьютером.

Применим некоторые из этих свойств для получения статистики:

using System.Net.NetworkInformation;

var ipProps = IPGlobalProperties.GetIPGlobalProperties();
var ipStats = ipProps.GetIPv4GlobalStatistics();
Console.WriteLine($"Входящие пакеты: {ipStats.ReceivedPackets}");
Console.WriteLine($"Исходящие пакеты: {ipStats.OutputPacketRequests}");
Console.WriteLine($"Отброшено входящих пакетов: {ipStats.ReceivedPacketsDiscarded}");
Console.WriteLine($"Отброшено исходящих пакетов: {ipStats.OutputPacketsDiscarded}");
Console.WriteLine($"Ошибки фрагментации: {ipStats.PacketFragmentFailures}");
Console.WriteLine($"Ошибки восстановления пакетов: {ipStats.PacketReassemblyFailures}");

Консольный вывод в моем случае:

Входящие пакеты: 10428590
Исходящие пакеты: 6745275
Отброшено входящих пакетов: 43737
Отброшено исходящих пакетов: 2
Ошибки фрагментации: 0
Ошибки восстановления пакетов: 0
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850