Macが応答しないリモートサイトがあります IGMPメンバーシップクエリ が、Windowsボックスは応答します。その結果、約10分後、IGMP対応ネットワークスイッチはMacへのマルチキャストストリームを遮断します。
問題を示すWiresharkのスクリーンショットを次に示します。
最初のパケットは、ネットワークが239.255.20.1からMacへのIGMPパケットの許可を開始することを要求するアプリです。その後、約125秒ごとに、IGMPクエリア(10.1.254.254)として構成されたネットワークスイッチが、そのストリームにまだ関心があるかどうかを尋ねます。目立った反応の欠如に注意してください。
比較のために、ここでローカルネットワーク上で何が起こるかを次に示します。
ここでは、約95秒ごとにIGMPクエリア(172.20.0.2)がそのストリームが必要かどうかを尋ね、問題のMac(172.20.0.144)は「はい、送信し続けます」と言います。
GUIで問題のあるMacのファイアウォールがオフになっているので、コマンドラインで確認しました。
$/usr/libexec/ApplicationFirewall/socketfilterfw --getglobalstate ファイアウォールが無効になっています。 (状態= 0) $/usr/libexec/ApplicationFirewall/socketfilterfw --getblockall すべての無効化をブロックします! $/usr/libexec/ApplicationFirewall/socketfilterfw --getstealthmode ステルスモードが無効 $/usr/libexec/ApplicationFirewall/socketfilterfw --getappblocked/Applications/mumblemutter.app /。 .. アプリケーションはファイアウォールの一部ではありません
グループが参加した後、スタックがIGMPクエリを処理するため、アプリは重要ではありません。
問題のあるMacは10.11.5を実行していますが、最新のものにアップグレードすることで問題が修正されるとは信じられません。これは、BSDベースのOSが2016年にネットワークスタックの重大なバグを修正することを意味するためです。可能ですが、非常に確率が低い。
この問題は最初のパケットキャプチャに示されています。IGMPグループ参加パケットはIGMPv2パケットですが、IGMPクエリアからの応答はすべてv3です。
MacOSは非常に長い間IGMPv3をサポートしているので、これは問題ないように思われるかもしれませんが、 DarwinオープンソースカーネルでのIGMP実装 を掘り下げると、igmp_input_v3_query()
でこの啓発的なコードを見つけてください:
_/*
* Discard the v3 query if we're in Compatibility Mode.
* The RFC is not obviously worded that hosts need to stay in
* compatibility mode until the Old Version Querier Present
* timer expires.
*/
if (igi->igi_version != IGMP_VERSION_3) {
...etc...
_
これが意味するのは、macOSが IGMPv3仕様 に従い、IGMPv2パケットを確認したネットワークインターフェイスを「互換モード」にすることです。つまり、そのネットワークインターフェイスでIGMPv3パケットを確認したり、IGMPv3を話したりすることはありません。 。上記のコードに関しては、インターフェイスを_igi_version = 2
_としてマークしているため、このテストを実行し、このネットワークでv3を話すことは安全ではないという理論に基づいて、v3グループメンバーシップクエリを無視します。何が起こっているのか理解できません。
私は3つの実行可能な救済策を見ます:
ネットワークの担当者にスイッチを再構成して、IGMPv2グループへの参加を要求したクライアントにIGMPv2クエリを返送してもらいます。
IGMPv2メンバーシップクエリのみを送信するように、IGMP対応ネットワークスイッチでIGMPv3サポートを完全にオフにします。
ネットワークでIGMPv2パケットを監視し、それらの送信元を見つけて、修正、アップグレード、または削除します。ネットワークでv3をスルーアンドスルーで話すことができない場合は、#1または#2を使用してください。
これは、アプリケーションコードの変更で修正できるものではありません。 _IP_ADD_MEMBERSHIP
_オプション から setsockopt()
にはバージョン番号が含まれていないため、アプリはIGMPv3を要求する立場にありません。その決定はスタック次第です。
これに影響を与えるOS設定がある可能性はありますが、それは、macOSのIGMP実装が上記の_igmp.c
_に表示されているものと異なる場合にのみ当てはまります。
WindowsボックスでIGMPのネットワークをスニッフィングすると、ネットワーク上にv2が存在するにもかかわらず、v3応答でIGMPv3メンバーシップクエリに応答することがわかります。したがって、RFCに違反しています。 「まあ、それは機能しますね」と言うネットワーク管理者もいますが、macOSにRFCも無視させることはできないため、解決策はネットワークを修正することに変わりはありません。