Несоответствие MTU между netsh и NetworkInterface.GetIPProperties () - PullRequest
0 голосов
/ 22 ноября 2018

Относится к Как получить текущий MTU интерфейса в C #
Но это решение (установите оба размера mtu на одно и то же значение) не поможет в моем случае.

Существует проблема в GetIPv4Properties(), если размеры mtu для ipv4 и ipv6 установлены по-разному, тогда ...

Если ipv6 включен, оба (GetIPv4Properties / GetIPv6Properties) возвращают размер mtuipv6!
Значение Mtu корректно, только если протокол ipv6 отключен.

using System.Net.NetworkInformation;
foreach (NetworkInterface ni in NetworkInterface.GetAllNetworkInterfaces())
{
    if (ni.Name == "Local Area Connection")
    {
        Console.WriteLine(ni.GetIPProperties().GetIPv4Properties().Mtu);
        Console.WriteLine(ni.GetIPProperties().GetIPv6Properties().Mtu);
    }
}

Но правильные значения отображаются с помощью netsh

netsh interface ipv4 show subinterface "Local Area Connection"
netsh interface ipv6 show subinterface "Local Area Connection"

Без версии протокола значениедля ipv4 показывается.

netsh interface ip show subinterface "Local Area Connection"

В моем случае мне нужно проверить размер mtu для ipv4 независимо от того, включен или отключен протокол ipv6.
Поскольку мой SW работает только, если размер mtu установлен на 1500 иВ противном случае я хочу предупредить пользователя.

Возможно ли это с помощью класса NetworkInterface или я должен использовать мерзкий взлом, например

Process process = Process.Start(new ProcessStartInfo("netsh.exe", "interface ipv4 show subinterface \"Local Area Connection\"") {
                UseShellExecute = false,
                RedirectStandardOutput = true
            });
string output = process.StandardOutput.ReadToEnd();
process.WaitForExit();
Console.WriteLine(output);

@ EDIT:
После комментариев @RonMaupin

Нет никакой разницы в MTU для IPv4 или IPv6, которые являются протоколами уровня 3.MTU - это максимальный размер полезной нагрузки протокола уровня 2, например ethernet

Это правильно, но для windows каждый протокол использует свой размер и фрагментацию mtu.
Протестировано с mtu ipv4 =1300 против ipv6 = 1500 и пинг 1400 байт:

netsh interface ipv4 set subinterface "Local Area Connection" mtu=1300 store=persistent
netsh interface ipv6 set subinterface "Local Area Connection" mtu=1500 store=persistent

ping6 -c 5 ff02::1:3 -s 1400

112 28.860467 fe80 :: 64aa: 56e9: fb1e: 2081 ff02 :: 1: 3 ICMPv6 1462 Идентификатор эхо-запроса (ping) =0x3160, seq = 2, предел перехода = 1 (многоадресная передача)

ping 192.168.101.11 -s 1400 

152 102.027390 192.168.101.223 192.168.101.11 IPv4 1314 Фрагментированный IP-протокол (proto = ICMP 1, off = 0, ID = 2712)
153 102.027409 192.168.101.223 192.168.101.11 ICMP 162 Идентификатор эхо-запроса (ping) = 0x3450, seq = 0/0, ttl = 128 (ответ не найден!)

...