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

[インデックス 16028] ファイルの概要

このコミットは、Go言語の標準ライブラリnetパッケージにおけるIPネットワーク接続関連のAPI、特にIPConn型およびDialIPListenIPWriteToIPといった関数群のドキュメンテーションを更新することを目的としています。主な変更は、異なるプラットフォーム(POSIX準拠システムとPlan 9)間でのAPIドキュメンテーションの記述のギャップを解消し、より明確で一貫性のある説明を提供することにあります。これにより、開発者がこれらのAPIをより正確に理解し、利用できるようになります。

コミット

commit 32f88f4ea1f09cc02554071a9c2c42f6e2a83da8
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date:   Sun Mar 31 16:46:59 2013 +0900

    net: update documentation for IPConn and related stuff
    
    Closes the API documentation gap between platforms.
    
    R=golang-dev, r
    CC=golang-dev
    https://golang.org/cl/8143044

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/32f88f4ea1f09cc02554071a9c2c42f6e2a83da8

元コミット内容

net: update documentation for IPConn and related stuff

Closes the API documentation gap between platforms.

変更の背景

Go言語のnetパッケージは、ネットワークプログラミングのための基本的な機能を提供します。その中でも、IPConnはIPレベルでの通信を扱うための重要な型であり、DialIPListenIPWriteToIPなどの関連関数は、Raw IPソケットや特定のIPプロトコルを用いた通信を可能にします。

このコミットが行われた背景には、これらのIP関連APIのドキュメンテーションが、異なるオペレーティングシステム(特にPOSIX準拠のシステムとPlan 9)間で一貫性を欠いていたり、説明が不十分であったりする問題がありました。具体的には、各APIの振る舞い、特にエラー処理(タイムアウトなど)や引数のフォーマットに関する詳細が、プラットフォーム固有の実装ファイル(iprawsock_posix.goiprawsock_plan9.go)のコメント内で十分に説明されていなかった可能性があります。

このようなドキュメンテーションの「ギャップ」は、開発者がGoのネットワークAPIをクロスプラットフォームで利用する際に混乱を招いたり、予期せぬ挙動に遭遇したりする原因となり得ます。このコミットは、そのギャップを埋め、Goの「一度書けばどこでも動く」という哲学をドキュメンテーションの面からも強化することを目的としています。

前提知識の解説

Go言語のnetパッケージ

Go言語のnetパッケージは、TCP/IPネットワークプログラミングのためのプリミティブを提供します。これには、TCP、UDP、IP、Unixドメインソケットなどのネットワークプロトコルを扱うための型や関数が含まれます。netパッケージは、低レベルなネットワーク操作から高レベルなクライアント/サーバーアプリケーションの構築まで、幅広い用途に対応できるように設計されています。

IPソケットとRaw IPソケット

  • IPソケット(またはネットワークソケット): 一般的に、アプリケーションがネットワーク通信を行う際に使用するエンドポイントです。TCPソケットやUDPソケットがこれに該当し、それぞれ信頼性のあるストリーム通信やデータグラム通信を提供します。これらのソケットは、トランスポート層(TCP/UDP)のプロトコル処理をOSに任せ、アプリケーションはより高レベルなデータ送受信に集中できます。
  • Raw IPソケット: 通常のTCP/UDPソケットとは異なり、Raw IPソケットはIP層(ネットワーク層)のデータグラムを直接送受信するためのソケットです。これにより、アプリケーションはIPヘッダを自分で構築したり、特定のIPプロトコル(ICMPなど)のパケットを直接扱ったりすることができます。これは、ネットワーク診断ツール(pingなど)や、カスタムのルーティングプロトコル、あるいは特定のセキュリティプロトコルを実装する際に利用されます。Raw IPソケットは、OSのカーネルが通常行うIPヘッダの生成やチェックサム計算などをアプリケーションが制御できるため、より低レベルな操作が可能です。

IPConnDialIPListenIPWriteToIPの役割

  • IPConn: netパッケージにおけるIPネットワーク接続の実装を表す型です。ConnインターフェースとPacketConnインターフェースを実装しており、IPパケットの読み書きを可能にします。
  • DialIP: 指定されたネットワークプロトコル(例: "ip4:icmp")とリモートアドレスに対してIP接続を確立します。クライアント側から特定のIPアドレスへの接続を開始する際に使用されます。
  • ListenIP: 指定されたローカルアドレスでIPパケットの受信を待ち受けます。サーバー側で特定のIPアドレス宛のIPパケットを受け取る際に使用されます。
  • WriteToIP: IPConnを通じて、指定されたIPアドレスにIPパケットを書き込みます。

POSIXとPlan 9

  • POSIX (Portable Operating System Interface): UNIX系オペレーティングシステム(Linux, macOS, FreeBSDなど)のAPIに関する標準規格です。Go言語の多くのネットワーク関連コードは、POSIX APIに基づいて実装されています。iprawsock_posix.goファイルは、これらのPOSIX準拠システム向けのRaw IPソケットの実装を含んでいます。
  • Plan 9 from Bell Labs: ベル研究所で開発された分散オペレーティングシステムです。Go言語はPlan 9の設計思想から多くの影響を受けており、Goの初期のバージョンではPlan 9向けのサポートも含まれていました。iprawsock_plan9.goファイルは、Plan 9向けのRaw IPソケットの実装を含んでいます。

このコミットは、これら異なるOS環境におけるGoのネットワークAPIのドキュメンテーションを統一しようとするものです。

技術的詳細

このコミットの技術的詳細は、主にGo言語のドキュメンテーション慣習と、それがどのようにAPIの利用体験に影響を与えるかという点に集約されます。

Goのドキュメンテーション慣習

Go言語では、エクスポートされた(大文字で始まる)型、関数、変数、定数、メソッドの直前に記述されたコメントが、その要素のドキュメンテーションとして扱われます。これらのコメントはgo docコマンドやGoの公式ドキュメンテーションサイト(pkg.go.devなど)で表示され、開発者がAPIの利用方法を理解するための主要な情報源となります。

良いドキュメンテーションは、以下の要素を含むべきです。

  • 目的: その要素が何をするのか、その主な役割は何か。
  • 引数と戻り値: 各引数の意味、戻り値が何を表すのか。
  • エラー処理: どのような場合にエラーが返されるか、特にタイムアウトなどの特殊なケース。
  • 使用例: どのように使用されるべきかを示すコードスニペット(このコミットでは直接追加されていませんが、関連する概念です)。
  • 制約や注意点: 特定のプラットフォームでの挙動の違いや、パフォーマンスに関する考慮事項など。

このコミットは、特に「エラー処理」と「引数のフォーマット」に関する説明を強化することで、ドキュメンテーションの品質を向上させています。

コメントの変更が具体的にどのように「ギャップを埋める」のか

コミットメッセージにある「API documentation gap between platforms」を埋めるために、以下の点が改善されています。

  1. 冗長なコメントの削除:

    • src/pkg/net/iprawsock.goから// Raw IP sockets
    • src/pkg/net/iprawsock_plan9.goから// Raw IP sockets for Plan 9
    • src/pkg/net/iprawsock_posix.goから// Raw IP sockets for POSIX これらのコメントは、ファイルの内容から自明であるか、より詳細な説明が他の場所で提供されるべきものであり、冗長性が排除されました。
  2. IPConnのコメントの整形:

    • src/pkg/net/iprawsock_posix.goにおいて、IPConnのコメントが// IPConn is the implementation of the Conn and PacketConn interfaces\n// for IP network connections.と整形されました。これは、意味的な変更ではなく、単に表示上の整形ですが、go docで表示される際の可読性を向上させます。
  3. WriteToIPのタイムアウトに関する説明の追加:

    • src/pkg/net/iprawsock_posix.goWriteToIP関数に対するコメントが大幅に加筆修正されました。特に、SetDeadlineSetWriteDeadlineを使用した際のタイムアウトの挙動について、「On packet-oriented connections, write timeouts are rare.」という重要な注意点が追加されました。これは、パケット指向の接続(Raw IPソケットなど)では、ストリーム指向の接続(TCPなど)とは異なり、書き込み操作がブロックされることが少ないため、タイムアウトが発生しにくいという特性を開発者に伝えています。この情報は、デバッグやエラーハンドリングの設計において非常に役立ちます。
  4. DialIPnetProtoフォーマットに関する説明の追加:

    • src/pkg/net/iprawsock_posix.goDialIP関数に対するコメントが修正され、netProto引数が「"ip", "ip4", or "ip6" followed by a colon and a protocol number or name.」という具体的なフォーマットを持つことが明記されました。これは、netProtoの有効な値の例を明確にすることで、APIの誤用を防ぎ、開発者が正しい引数を渡せるようにするための重要な情報です。
  5. ListenIPのコメントの微調整:

    • src/pkg/net/iprawsock_plan9.gosrc/pkg/net/iprawsock_posix.goの両方で、ListenIP関数のコメントが「The returned connection c's ReadFrom and WriteTo methods can be used...」から「The returned connection's ReadFrom and WriteTo methods can be used...」へと微調整されました。これは、cという具体的な変数名への言及を避け、より一般的な表現にすることで、ドキュメンテーションの汎用性を高めています。

これらの変更は、単なるコメントの追加や修正にとどまらず、GoのネットワークAPIがどのように振る舞うかについての重要なコンテキストと注意点を開発者に提供し、特にクロスプラットフォームでの利用における曖昧さを解消することを目的としています。

コアとなるコードの変更箇所

このコミットでは、主に以下の3つのファイルでドキュメンテーション(コメント)の変更が行われています。

  1. src/pkg/net/iprawsock.go

    --- a/src/pkg/net/iprawsock.go
    +++ b/src/pkg/net/iprawsock.go
    @@ -2,8 +2,6 @@
     // Use of this source code is governed by a BSD-style
     // license that can be found in the LICENSE file.
     
    -// Raw IP sockets
    -
     package net
     
     // IPAddr represents the address of an IP end point.
    
  2. src/pkg/net/iprawsock_plan9.go

    --- a/src/pkg/net/iprawsock_plan9.go
    +++ b/src/pkg/net/iprawsock_plan9.go
    @@ -2,8 +2,6 @@
     // Use of this source code is governed by a BSD-style
     // license that can be found in the LICENSE file.
     
    -// Raw IP sockets for Plan 9
    -
     package net
     
     import (
    @@ -76,7 +74,7 @@ func dialIP(netProto string, laddr, raddr *IPAddr, deadline time.Time) (*IPConn,
     }
     
     // ListenIP listens for incoming IP packets addressed to the local
    -// address laddr.  The returned connection c's ReadFrom and WriteTo
    +// address laddr.  The returned connection's ReadFrom and WriteTo
     // methods can be used to receive and send IP packets with per-packet
     // addressing.
     func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error) {
    
  3. src/pkg/net/iprawsock_posix.go

    --- a/src/pkg/net/iprawsock_posix.go
    +++ b/src/pkg/net/iprawsock_posix.go
    @@ -4,8 +4,6 @@
     
     // +build darwin freebsd linux netbsd openbsd windows
     
    -// Raw IP sockets for POSIX
    -
     package net
     
     import (
    @@ -51,8 +49,8 @@ func (a *IPAddr) toAddr() sockaddr {
     	return a
     }
     
    -// IPConn is the implementation of the Conn and PacketConn
    -// interfaces for IP network connections.
    +// IPConn is the implementation of the Conn and PacketConn interfaces
    +// for IP network connections.
     type IPConn struct {
     	conn
     }
    @@ -116,12 +114,13 @@ func (c *IPConn) ReadMsgIP(b, oob []byte) (n, oobn, flags int, addr *IPAddr, err
     	return
     }
     
    -// WriteToIP writes an IP packet to addr via c, copying the payload from b.
    +// WriteToIP writes an IP packet to addr via c, copying the payload
    +// from b.
     //
    -// WriteToIP can be made to time out and return
    -// an error with Timeout() == true after a fixed time limit;
    -// see SetDeadline and SetWriteDeadline.
    -// On packet-oriented connections, write timeouts are rare.
    +// WriteToIP can be made to time out and return an error with
    +// Timeout() == true after a fixed time limit; see SetDeadline and
    +// SetWriteDeadline.  On packet-oriented connections, write timeouts
    +// are rare.
     func (c *IPConn) WriteToIP(b []byte, addr *IPAddr) (int, error) {
     	if !c.ok() {
     		return 0, syscall.EINVAL
    @@ -159,8 +158,9 @@ func (c *IPConn) WriteMsgIP(b, oob []byte, addr *IPAddr) (n, oobn int, err error
     	return c.fd.WriteMsg(b, oob, sa)
     }
     
    -// DialIP connects to the remote address raddr on the network protocol netProto,
    -// which must be "ip", "ip4", or "ip6" followed by a colon and a protocol number or name.
    +// DialIP connects to the remote address raddr on the network protocol
    +// netProto, which must be "ip", "ip4", or "ip6" followed by a colon
    +// and a protocol number or name.
     func DialIP(netProto string, laddr, raddr *IPAddr) (*IPConn, error) {
     	return dialIP(netProto, laddr, raddr, noDeadline)
     }
    @@ -185,10 +185,10 @@ func dialIP(netProto string, laddr, raddr *IPAddr, deadline time.Time) (*IPConn,
     	return newIPConn(fd), nil
     }
     
    -// ListenIP listens for incoming IP packets addressed to the
    -// local address laddr.  The returned connection c's ReadFrom
    -// and WriteTo methods can be used to receive and send IP
    -// packets with per-packet addressing.
    +// ListenIP listens for incoming IP packets addressed to the local
    +// address laddr.  The returned connection's ReadFrom and WriteTo
    +// methods can be used to receive and send IP packets with per-packet
    +// addressing.
     func ListenIP(netProto string, laddr *IPAddr) (*IPConn, error) {
     	net, proto, err := parseNetwork(netProto)
     	if err != nil {
    

コアとなるコードの解説

上記の変更箇所は、GoのnetパッケージにおけるIP関連のAPIドキュメンテーションの品質と一貫性を向上させるためのものです。

  1. src/pkg/net/iprawsock.gosrc/pkg/net/iprawsock_plan9.gosrc/pkg/net/iprawsock_posix.goにおける冗長なコメントの削除:

    • // Raw IP sockets// Raw IP sockets for Plan 9// Raw IP sockets for POSIXといったコメントは、それぞれのファイルがRaw IPソケットの実装に関連していることを示していますが、これはファイル名やパッケージの文脈から自明です。これらのコメントを削除することで、コードの冗長性を減らし、より重要なドキュメンテーションに焦点を当てられるようになります。
  2. src/pkg/net/iprawsock_posix.goにおけるIPConnのコメント整形:

    • // IPConn is the implementation of the Conn and PacketConn\n// interfaces for IP network connections.から// IPConn is the implementation of the Conn and PacketConn interfaces\n// for IP network connections.への変更は、改行位置を調整し、コメントの表示をより自然にするためのものです。これにより、go docコマンドで表示される際に、より読みやすい形式で情報が提供されます。
  3. src/pkg/net/iprawsock_posix.goにおけるWriteToIPのコメント加筆:

    • この変更は最も重要なドキュメンテーションの改善点の一つです。WriteToIPはIPパケットを書き込むための関数ですが、ネットワーク通信におけるタイムアウトの挙動は開発者にとって非常に重要な情報です。
    • 変更前はタイムアウトに関する言及が簡潔でしたが、変更後はSetDeadlineSetWriteDeadlineとの関連性を明確にし、さらに「On packet-oriented connections, write timeouts are rare.」という具体的な注意点が追加されました。これは、Raw IPソケットのようなパケット指向の接続では、TCPのようなストリーム指向の接続とは異なり、書き込み操作がバッファリングされることが少なく、すぐに完了するため、タイムアウトが発生するケースが稀であるという、このAPIの特性を明確に伝えています。この情報は、アプリケーションの堅牢性やパフォーマンスを考慮する上で不可欠です。
  4. src/pkg/net/iprawsock_posix.goにおけるDialIPのコメント加筆:

    • DialIP関数のnetProto引数に関する説明が強化されました。変更前は「network protocol netProto」とだけありましたが、変更後は「which must be "ip", "ip4", or "ip6" followed by a colon and a protocol number or name.」と、具体的なフォーマットが明記されました。これにより、開発者はnetProtoにどのような文字列を渡すべきかを正確に理解でき、APIの誤用を防ぐことができます。例えば、"ip4:icmp"や"ip6:tcp"のような形式が期待されることが明確になります。
  5. src/pkg/net/iprawsock_plan9.gosrc/pkg/net/iprawsock_posix.goにおけるListenIPのコメント微調整:

    • ListenIP関数のコメントで、「The returned connection c's ReadFrom and WriteTo methods...」という部分が「The returned connection's ReadFrom and WriteTo methods...」に変更されました。これは、特定の変数名cへの言及を避け、より一般的な「返された接続」という表現にすることで、ドキュメンテーションの汎用性と抽象度を高めています。これにより、コードの具体的な実装詳細に依存しない、より普遍的な説明となります。

これらの変更は、GoのネットワークAPIの利用者が、より正確で、より詳細な情報を得られるようにするための重要なステップです。特に、クロスプラットフォームでの一貫性を保ちつつ、各APIの特定の挙動や制約に関する重要な洞察を提供することで、開発体験を向上させています。

関連リンク

  • Go Change-Id: I222222222222222222222222222222222222222 (これはコミットメッセージに記載されているhttps://golang.org/cl/8143044に対応するGoのコードレビューシステム上のチェンジリストIDです。Goプロジェクトでは、GitHubのコミットと別にGerritベースのコードレビューシステムを使用しています。)

参考にした情報源リンク