Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 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パッケージに統合するために、主に以下の要素を追加しています。

  1. 新しいデータ構造の定義:

    • RawSockaddrStorage: ソケットアドレスを格納するための汎用的なバッファ構造体です。様々な種類のアドレス(IPv4, IPv6など)を統一的に扱えるように設計されています。SSM関連のソケットオプションでは、グループアドレスや送信元アドレスをこの形式で渡す必要があります。
    • GroupReq: 特定のマルチキャストグループに参加または脱退するための要求を表現する構造体です。インターフェースIDとグループアドレス(RawSockaddrStorage型)を含みます。これは、ASMにおけるIPMreqIPv6Mreqに相当しますが、SSMでは送信元を含まないグループ操作に使用されます。
    • GroupSourceReq: ソース固有マルチキャストグループに参加または脱退するための要求を表現する構造体です。インターフェースID、グループアドレス、そして送信元アドレス(いずれもRawSockaddrStorage型)を含みます。これがSSMの核心となるデータ構造であり、特定の送信元からのマルチキャストトラフィックをフィルタリングするために使用されます。
  2. 新しい定数の追加:

    • 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の慣用的な方法で利用できるようになります。

関連リンク

参考にした情報源リンク