[インデックス 19605] ファイルの概要
このコミットは、Go言語のsyscall
パッケージにおいて、Darwin(macOS)環境向けにソース固有マルチキャスト(Source-Specific Multicast, SSM)ソケットオプションのサポートを追加するものです。具体的には、SSMに関連する新しいデータ構造と定数を定義し、GoプログラムがmacOS上でSSMを利用できるようにするための基盤を提供します。
コミット
commit 0c7ddfaab61e40b5f6a9344cc30aaa0e36a9ad82
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date: Wed Jun 25 05:01:09 2014 +0900
syscall: add source-specific multicast socket options for Darwin
Update #8266
LGTM=iant
R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/101460043
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/0c7ddfaab61e40b5f6a9344cc30aaa0e36a9ad82
元コミット内容
syscall: add source-specific multicast socket options for Darwin
Update #8266
LGTM=iant
R=golang-codereviews, iant
CC=golang-codereviews
https://golang.org/cl/101460043
変更の背景
この変更の背景には、Go言語のsyscall
パッケージが、基盤となるオペレーティングシステムのシステムコールをGoプログラムから直接呼び出すためのインターフェースを提供しているという事実があります。マルチキャスト通信において、従来のAny-Source Multicast (ASM)では、特定のマルチキャストグループに送信されたすべてのトラフィックを受信しますが、Source-Specific Multicast (SSM)では、特定の送信元からのトラフィックのみを受信するように制限できます。これにより、ネットワークの効率性が向上し、不要なトラフィックの受信を防ぐことができます。
macOS(Darwin)は、SSMをサポートするための特定のソケットオプションとデータ構造を提供しています。GoプログラムがこれらのOSネイティブな機能を利用するためには、syscall
パッケージがそれらをGoの型として公開する必要があります。このコミットは、Goの標準ライブラリがmacOS上でのSSM通信をサポートするための不足していたピースを追加することを目的としています。具体的には、Issue #8266で報告された機能追加に対応しています。
前提知識の解説
マルチキャスト通信
マルチキャスト通信は、単一の送信元から複数の特定の受信者に対してデータを送信するネットワーク通信方式です。ユニキャスト(1対1)やブロードキャスト(1対全員)とは異なり、マルチキャストは「1対多」の効率的な通信を実現します。これは、ビデオストリーミング、オンラインゲーム、株価情報配信など、複数のクライアントに同じデータを同時に配信する必要があるアプリケーションで広く利用されます。
Any-Source Multicast (ASM) と Source-Specific Multicast (SSM)
- Any-Source Multicast (ASM): 従来のマルチキャストモデルで、受信者は特定のマルチキャストグループアドレス(G)に参加します。このグループに送信されたデータは、どの送信元(S)からであっても受信者に届けられます。受信者はグループに参加するだけでよく、送信元を意識する必要がありません。
- Source-Specific Multicast (SSM): ASMの拡張であり、より洗練されたマルチキャストモデルです。受信者は、特定のマルチキャストグループアドレス(G)だけでなく、特定の送信元アドレス(S)も指定して参加します。これにより、受信者は
(S, G)
チャネル、つまり「特定の送信元Sから特定のグループGへのトラフィック」のみを受信します。SSMは、不要なトラフィックを削減し、ネットワークリソースをより効率的に利用できるという利点があります。SSMは通常、IGMPv3(IPv4の場合)やMLDv2(IPv6の場合)といったプロトコルによってサポートされます。
ソケットオプション
ソケットオプションは、ネットワークソケットの動作を制御するための設定です。setsockopt
関数(Goではsyscall.Setsockopt
)を使用して設定され、getsockopt
関数(Goではsyscall.Getsockopt
)で取得されます。これらは、ソケットのバッファサイズ、タイムアウト、再利用設定、そしてマルチキャスト関連の動作など、多岐にわたる設定を可能にします。マルチキャスト通信においては、グループへの参加/脱退、送信元フィルタリングなどのために特定のソケットオプションが使用されます。
Darwin (macOS) のシステムコールとsyscall
パッケージ
DarwinはAppleのmacOSの基盤となるオペレーティングシステムです。Go言語のsyscall
パッケージは、GoプログラムがOSの低レベルな機能、特にシステムコールにアクセスするためのインターフェースを提供します。これにより、GoプログラムはOS固有のネットワーク機能やファイルシステム操作などを直接利用できます。このコミットでは、macOSが提供するSSM関連のソケットオプションやデータ構造をGoのsyscall
パッケージにマッピングし、Goプログラムから利用可能にしています。
技術的詳細
このコミットは、macOSにおけるSSMのサポートをGoのsyscall
パッケージに統合するために、主に以下の要素を追加しています。
-
新しいデータ構造の定義:
RawSockaddrStorage
: ソケットアドレスを格納するための汎用的なバッファ構造体です。様々な種類のアドレス(IPv4, IPv6など)を統一的に扱えるように設計されています。SSM関連のソケットオプションでは、グループアドレスや送信元アドレスをこの形式で渡す必要があります。GroupReq
: 特定のマルチキャストグループに参加または脱退するための要求を表現する構造体です。インターフェースIDとグループアドレス(RawSockaddrStorage
型)を含みます。これは、ASMにおけるIPMreq
やIPv6Mreq
に相当しますが、SSMでは送信元を含まないグループ操作に使用されます。GroupSourceReq
: ソース固有マルチキャストグループに参加または脱退するための要求を表現する構造体です。インターフェースID、グループアドレス、そして送信元アドレス(いずれもRawSockaddrStorage
型)を含みます。これがSSMの核心となるデータ構造であり、特定の送信元からのマルチキャストトラフィックをフィルタリングするために使用されます。
-
新しい定数の追加:
MCAST_BLOCK_SOURCE
,MCAST_EXCLUDE
,MCAST_INCLUDE
,MCAST_JOIN_GROUP
,MCAST_JOIN_SOURCE_GROUP
,MCAST_LEAVE_GROUP
,MCAST_LEAVE_SOURCE_GROUP
,MCAST_UNBLOCK_SOURCE
,MCAST_UNDEFINED
: これらは、SSMに関連するソケットオプションの操作コードを表す定数です。例えば、MCAST_JOIN_SOURCE_GROUP
は特定の送信元からのマルチキャストグループに参加するために使用され、MCAST_BLOCK_SOURCE
は特定の送信元からのトラフィックをブロックするために使用されます。これらの定数は、setsockopt
関数に渡され、ソケットのマルチキャスト動作を制御します。SizeofSockaddrStorage
,SizeofGroupReq
,SizeofGroupSourceReq
: これらの定数は、新しく追加されたデータ構造のサイズをバイト単位で定義します。これは、setsockopt
などのシステムコールに構造体を渡す際に、そのサイズを正確に指定するために必要です。
これらの追加により、Go開発者はmacOS上でsyscall.Setsockopt
関数とこれらの新しい定数および構造体を組み合わせて使用することで、ソース固有マルチキャストの機能(特定の送信元からのマルチキャストトラフィックの受信、特定の送信元のブロック/アンブロックなど)をGoプログラムから直接利用できるようになります。
コアとなるコードの変更箇所
このコミットでは、主に以下のファイルが変更されています。
src/pkg/syscall/types_darwin.go
: Darwin固有のシステムコール関連の型定義が含まれるファイルです。RawSockaddrStorage
,GroupReq
,GroupSourceReq
の各型が追加されました。- これらの型のサイズを示す定数(
SizeofSockaddrStorage
,SizeofGroupReq
,SizeofGroupSourceReq
)が追加されました。
src/pkg/syscall/zerrors_darwin_386.go
およびsrc/pkg/syscall/zerrors_darwin_amd64.go
: Darwinの32ビットおよび64ビットアーキテクチャ向けのシステムコールエラーコードや定数が自動生成されるファイルです。MCAST_BLOCK_SOURCE
からMCAST_UNDEFINED
までのSSM関連の定数が追加されました。
src/pkg/syscall/ztypes_darwin_386.go
およびsrc/pkg/syscall/ztypes_darwin_amd64.go
: Darwinの32ビットおよび64ビットアーキテクチャ向けのシステムコール関連の型定義が自動生成されるファイルです。RawSockaddrStorage
,GroupReq
,GroupSourceReq
の各構造体の具体的なフィールド定義が追加されました。これらのファイルは、C言語のヘッダファイルからGoの型定義を自動生成するツールによって生成されるため、手動で編集されることは稀です。
コアとなるコードの解説
src/pkg/syscall/types_darwin.go
の変更
type RawSockaddrStorage C.struct_sockaddr_storage
type GroupReq C.struct_group_req
type GroupSourceReq C.struct_group_source_req
// ...
const (
// ...
SizeofSockaddrStorage = C.sizeof_struct_sockaddr_storage
// ...
SizeofGroupReq = C.sizeof_struct_group_req
SizeofGroupSourceReq = C.sizeof_struct_group_source_req
// ...
)
この部分では、C言語の構造体(C.struct_sockaddr_storage
など)に対応するGoの型が定義されています。これにより、GoプログラムからCの構造体を直接扱うことができるようになります。Sizeof...
定数は、これらの構造体のメモリ上でのサイズを示しており、システムコールに引数を渡す際に必要となります。
src/pkg/syscall/zerrors_darwin_386.go
および src/pkg/syscall/zerrors_darwin_amd64.go
の変更
const (
// ...
MCAST_BLOCK_SOURCE = 0x54
MCAST_EXCLUDE = 0x2
MCAST_INCLUDE = 0x1
MCAST_JOIN_GROUP = 0x50
MCAST_JOIN_SOURCE_GROUP = 0x52
MCAST_LEAVE_GROUP = 0x51
MCAST_LEAVE_SOURCE_GROUP = 0x53
MCAST_UNBLOCK_SOURCE = 0x55
MCAST_UNDEFINED = 0x0
// ...
)
これらの定数は、macOSのネットワークスタックがSSM操作のために使用するマジックナンバーです。Goプログラムがsetsockopt
関数を呼び出す際に、これらの定数をオプション名として使用することで、特定のSSM動作(例: MCAST_JOIN_SOURCE_GROUP
でソース固有グループに参加)をOSに指示します。
src/pkg/syscall/ztypes_darwin_386.go
および src/pkg/syscall/ztypes_darwin_amd64.go
の変更
type RawSockaddrStorage struct {
Len uint8
Family uint8
X__ss_pad1 [6]int8
X__ss_align int64
X__ss_pad2 [112]int8
}
type GroupReq struct {
Interface uint32
Group RawSockaddrStorage
}
type GroupSourceReq struct {
Interface uint32
Group RawSockaddrStorage
Source RawSockaddrStorage
}
これらの構造体は、C言語の対応する構造体(struct sockaddr_storage
, struct group_req
, struct group_source_req
)のGoにおける表現です。RawSockaddrStorage
は、様々なソケットアドレス型を格納できる汎用的なバッファとして機能します。GroupReq
は、インターフェースとグループアドレスを含み、GroupSourceReq
はさらに送信元アドレスを含みます。これらの構造体は、SSM関連のソケットオプションを設定する際に、引数としてsetsockopt
に渡されます。特にGroupSourceReq
は、SSMの「送信元とグループ」という概念を直接的に表現しています。
これらの変更により、Go開発者はmacOS上で、C言語で利用可能なSSMの機能をGoの慣用的な方法で利用できるようになります。
関連リンク
- Go Issue #8266: https://github.com/golang/go/issues/8266 (このコミットが解決したIssue)
- Go CL 101460043: https://golang.org/cl/101460043 (このコミットのコードレビューページ)
参考にした情報源リンク
- Source-Specific Multicast (SSM) - Wikipedia: https://ja.wikipedia.org/wiki/Source-Specific_Multicast
- IP_ADD_SOURCE_MEMBERSHIP - IBM Knowledge Center: https://www.ibm.com/docs/en/aix/7.2?topic=s-ip-add-source-membership-socket-option
setsockopt
man page (Linux/Unix系OS): https://man7.org/linux/man-pages/man2/setsockopt.2.html- macOSにおけるマルチキャストプログラミングに関する情報(一般的な概念理解のため)
- Go言語の
syscall
パッケージのドキュメント(一般的な理解のため) - Web検索: "source-specific multicast socket options Darwin"
- Web検索: "Go syscall package multicast"
- Web検索: "macOS network programming multicast"
- Web検索: "IGMPv3 MLDv2"
- Web検索: "struct sockaddr_storage"
- Web検索: "struct group_req"
- Web検索: "struct group_source_req"