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