Сообщение о присоединении IGMP дает неверную контрольную сумму
Я пытаюсь подключиться к многоадресной группе для получения некоторых пакетов UDP. Код, который я использую, работает хорошо, я получаю пакеты, и у меня не было проблем с этим раньше. Но только сейчас есть новое требование, которое требует, чтобы пакеты проходили через коммутатор, который должен видеть сообщение о присоединении к многоадресной рассылке. Раньше это были просто тупые переключатели, и это не было проблемой.
Чтобы присоединиться к многоадресной группе, я использую этот код:
var LocalAddress = "228.12.12.27";
var LocalPort = 46715;
var LocalEndPoint = new IPEndPoint(IPAddress.Parse(LocalAddress), LocalPort);
var RxSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
RxSocket.Blocking = false;
RxSocket.ReceiveBufferSize = UInt16.MaxValue;
RxSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1);
RxSocket.Bind(new IPEndPoint(IPAddress.Any, LocalEndPoint.Port));
RxSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(LocalEndPoint.Address));
RxSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.MulticastTimeToLive, 50);
RxSocket.Close();
Строка, которая генерирует сообщение о присоединении IGMP:
RxSocket.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.AddMembership, new MulticastOption(LocalEndPoint.Address));
И сообщение о присоединении IGMP отправлено.
Однако, когда я слежу за сетью с помощью Wireshark, я вижу, что сообщение IGMP имеет неверную контрольную сумму;
Это проблема с моим кодом или вводом? Или есть что-то еще?
2 ответа
Это проблема с моим кодом
Нет, потому что ваш код не генерирует контрольную сумму IP. Это либо генерируется сетевым стеком ОС, либо, как отметил в своем ответе Николай Фетиссов, сетевым адаптером.
Если ваш сетевой анализатор работает на машине, которая отправила пакет, и контрольная сумма генерируется сетевым адаптером, а не сетевым стеком, то, поскольку захват ваших собственных пакетов выполняется сетевым стеком, "возвращая эти пакеты обратно" механизм захвата, а не сетевой адаптер, перехватывающий пакеты, которые он передает (которых мало, если какие-либо адаптеры будут), захваченные пакеты не будут иметь вычисленную контрольную сумму IP и, таким образом, почти наверняка будут иметь неверную контрольную сумму IP.
Обратите внимание, что "может быть вызвано" разгрузкой контрольной суммы IP "?" на дисплее Wireshark. Вот о чем говорит Wireshark.
Это ожидается с современными сетевыми картами, которые выполняют контрольные суммы аппаратно. Не беспокойся об этом.