[インデックス 17579] ファイルの概要
このコミットは、Go 1.2 リリースノートのドキュメントファイル doc/go1.2.html
に対する変更です。具体的には、net
パッケージにおける「Happy Eyeballs」のサポートに関する記述の追加と、既存の記述における軽微な修正(nit fixes)が含まれています。
コミット
commit 28a8e9ba2f27326efcef7a1f5085ac19120f7216
Author: Mikio Hara <mikioh.mikioh@gmail.com>
Date: Thu Sep 12 15:12:40 2013 +0900
doc/go1.2.html: happy eyeballs on net
Also fix trivial nits.
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/13532046
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/28a8e9ba2f27326efcef7a1f5085ac19120f7216
元コミット内容
doc/go1.2.html: happy eyeballs on net
Also fix trivial nits.
変更の背景
このコミットは、Go 1.2 のリリースノートに、net
パッケージにおける重要な新機能である「Happy Eyeballs」のサポートに関する情報を追加することを目的としています。
「Happy Eyeballs」は、IPv4とIPv6の両方が利用可能なネットワーク環境において、接続確立の遅延を最小限に抑えるためのメカニズムです。デュアルスタック環境では、クライアントがIPv4アドレスとIPv6アドレスの両方を持つサーバーに接続しようとする際、どちらか一方のプロトコルが利用できない、あるいは応答が遅い場合に、接続試行がタイムアウトするまで待機してしまうという問題がありました。この問題は、ユーザー体験の低下に直結します。
Goのnet
パッケージがこのメカニズムをサポートすることで、アプリケーションはより堅牢で高速なネットワーク接続を提供できるようになります。このコミットは、その変更がGo 1.2で導入されたことを公式ドキュメントに反映させるためのものです。また、既存のドキュメント内の軽微な誤字脱字や書式設定の修正も同時に行われています。
前提知識の解説
Happy Eyeballs (RFC 6555)
「Happy Eyeballs」は、IETF (Internet Engineering Task Force) によってRFC 6555として標準化されたアルゴリズムです。その主な目的は、デュアルスタック(IPv4とIPv6の両方をサポートする)環境において、ネットワーク接続の確立を高速化し、ユーザー体験を向上させることです。
従来の接続試行では、クライアントは通常、DNSルックアップで得られた最初のアドレス(例えばIPv6アドレス)に対して接続を試みます。もしその接続が失敗したり、タイムアウトしたりした場合、次のアドレス(例えばIPv4アドレス)にフォールバックして再試行します。このシーケンシャルな試行は、最初の接続が遅延したり失敗したりすると、ユーザーが体感する接続確立までの時間が長くなる原因となります。
Happy Eyeballsアルゴリズムは、この問題を解決するために、IPv4とIPv6の両方のアドレスに対して並行して接続試行を開始します。ただし、完全に同時に開始するのではなく、わずかな遅延(例えば数十ミリ秒)を設けてIPv6の接続試行を開始し、その後にIPv4の接続試行を開始します。これにより、IPv6が利用可能で高速な場合はIPv6接続が優先され、IPv6に問題がある場合でもIPv4接続がすぐに開始されるため、ユーザーは接続の遅延を感じにくくなります。最初に成功した接続が採用され、他の接続試行はキャンセルされます。
デュアルスタック
デュアルスタックとは、ネットワークデバイスやホストがIPv4とIPv6の両方のプロトコルスタックを同時にサポートし、両方のプロトコルで通信できる能力を指します。インターネットがIPv4からIPv6へ移行する過渡期において、多くのシステムがデュアルスタック構成を採用しており、これによりIPv4のみのサービスとIPv6のみのサービスの両方にアクセスすることが可能になります。
net
パッケージと Dialer
Go言語の標準ライブラリである net
パッケージは、ネットワークI/Oのプリミティブ機能を提供します。TCP/IP、UDP、IP、Unixドメインソケットなどのネットワークプロトコルを扱うための型や関数が含まれています。
net.Dialer
構造体は、ネットワーク接続を確立するための設定をカプセル化します。これには、タイムアウト、ローカルアドレス、キープアライブ設定などが含まれます。Dialer
の DialContext
や Dial
メソッドを使用して、指定されたネットワークアドレスへの接続を試みます。
技術的詳細
このコミット自体はGoのコード変更ではなく、Go 1.2のリリースノート (doc/go1.2.html
) のドキュメント変更です。しかし、その内容はGoのnet
パッケージにおける重要な機能追加を反映しています。
具体的には、net
パッケージのDialer
構造体にDualStack
という新しいフィールドが追加されたことをドキュメントに記述しています。このDualStack
フィールドは、TCP接続の確立時にRFC 6555で記述されている「Happy Eyeballs」アルゴリズムを有効にするためのものです。
Dialer
構造体にDualStack
フィールドが追加されることで、開発者は明示的にこの動作を制御できるようになります。通常、このフィールドがtrue
に設定されると、Dialer
はDNSルックアップで得られたIPv4とIPv6のアドレスリストに対して、Happy Eyeballsアルゴリズムに従って並行して接続を試み、最初に成功した接続を使用します。これにより、ネットワーク環境の変動や特定のプロトコルの遅延に起因する接続確立の遅延を効果的に軽減できます。
この機能は、特にモバイル環境や、IPv4とIPv6の混在する複雑なネットワーク環境において、アプリケーションの応答性と信頼性を向上させる上で非常に重要です。
コアとなるコードの変更箇所
このコミットはドキュメントファイル doc/go1.2.html
のみを変更しています。Goのソースコード自体(net
パッケージの実装)は変更していません。
変更された箇所は以下の通りです。
--- a/doc/go1.2.html
+++ b/doc/go1.2.html
@@ -633,11 +633,11 @@ if it is <code>nil</code>, Floyd-Steinberg error diffusion is used.\n </li>\n \n <li>\n-The<a href=\"/pkg/io/#Copy\"><code>Copy</code></a> method of the\n+The <a href=\"/pkg/io/#Copy\"><code>Copy</code></a> method of the\n <a href=\"/pkg/io/\"><code>io</code></a> package now prioritizes its\n arguments differently.\n If one argument implements <a href=\"/pkg/io/#WriterTo\"><code>WriterTo</code></a>\n-and the other implements i<a href=\"/pkg/o/#ReaderFrom\"><code>ReaderFrom</code></a>,\n+and the other implements <a href=\"/pkg/io/#ReaderFrom\"><code>ReaderFrom</code></a>,\n <a href=\"/pkg/io/#Copy\"><code>Copy</code></a> will now invoke\n <a href=\"/pkg/io/#WriterTo\"><code>WriterTo</code></a> to do the work,\n so that less intermediate buffering is required in general.\n@@ -647,6 +647,13 @@ so that less intermediate buffering is required in general.\n net: TODO new build tag netgo for building a pure Go net package (CL 7100050).\n </li>\n \n+<li>\n+The <a href=\"/pkg/net/\"><code>net</code></a> package adds a new field\n+<code>DualStack</code> to the <a href=\"/pkg/net/#Dialer\"><code>Dialer</code></a>\n+struct for TCP connection setup using a dual IP stack as described in\n+<a href=\"http://tools.ietf.org/html/rfc6555\">RFC 6555</a>.\n+</li>\n+\n <li>\n net/http: TODO don\'t allow sending invalid cookie lines (CL 12204043).\n </li>\n```
## コアとなるコードの解説
このコミットで追加されたHTMLスニペットは、Go 1.2のリリースノートに以下の情報を追加しています。
```html
<li>
The <a href="/pkg/net/"><code>net</code></a> package adds a new field
<code>DualStack</code> to the <a href="/pkg/net/#Dialer"><code>Dialer</code></a>
struct for TCP connection setup using a dual IP stack as described in
<a href="http://tools.ietf.org/html/rfc6555">RFC 6555</a>.
</li>
この記述は、net
パッケージがDialer
構造体にDualStack
という新しいフィールドを追加したことを明確に述べています。このフィールドは、RFC 6555で定義されているデュアルIPスタック(Happy Eyeballs)を使用したTCP接続の確立を可能にするものです。
これにより、Go 1.2を使用する開発者は、net.Dialer
のインスタンスを作成する際にDualStack
フィールドをtrue
に設定することで、自動的にHappy Eyeballsアルゴリズムを利用した接続試行を行うことができるようになります。これは、特にIPv4とIPv6が混在する環境でのネットワーク接続の信頼性とパフォーマンスを向上させる上で非常に有用です。
また、このコミットでは、io.Copy
メソッドに関する既存の記述において、リンクの修正(i<a href=\"/pkg/o/#ReaderFrom\">
から<a href=\"/pkg/io/#ReaderFrom\">
へ)といった軽微な修正も行われています。これはドキュメントの正確性と可読性を高めるための「nit fixes」に該当します。
関連リンク
- Go 1.2 Release Notes: https://go.dev/doc/go1.2 (このコミットが変更したドキュメントの最終版)
- Go
net
package documentation: https://pkg.go.dev/net - Go
io
package documentation: https://pkg.go.dev/io
参考にした情報源リンク
- RFC 6555 - Happy Eyeballs: Success with Dual-Stack Hosts: https://datatracker.ietf.org/doc/html/rfc6555
- Go issue for Happy Eyeballs: https://github.com/golang/go/issues/5012 (関連するGoのIssue)
- Go CL 13532046: https://golang.org/cl/13532046 (このコミットに対応するGerritの変更リスト)
- Go CL 7100050: https://golang.org/cl/7100050 (netgo build tagに関する言及があるCL)
- Go CL 12204043: https://golang.org/cl/12204043 (net/httpのcookieに関する言及があるCL)
- Go 1.2 Release Notes (archive): https://go.dev/doc/go1.2.html (このコミットが変更した当時のドキュメントのURL)
- Mikio Hara's contributions to Go: https://github.com/golang/go/commits?author=mikioh.mikioh%40gmail.com