[インデックス 15601] ファイルの概要
このコミットは、Go言語の次期リリースで導入されるAPIの変更点を記録する api/next.txt
ファイルの更新です。具体的には、net/http
パッケージにリクエストキャンセル機能が追加され、net/http/cookiejar
パッケージが新設され、さらに syscall
パッケージに MSG_FASTOPEN
定数が追加されたことが示されています。
コミット
commit 1ca529c62cb478fff1aab4465dc467b72b57ee8c
Author: Brad Fitzpatrick <bradfitz@golang.org>
Date: Wed Mar 6 11:16:58 2013 -0800
api: update next.txt
R=golang-dev, r
CC=golang-dev
https://golang.org/cl/7518044
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/1ca529c62cb478fff1aab4465dc467b72b57ee8c
元コミット内容
api: update next.txt
このコミットメッセージは簡潔であり、api/next.txt
ファイルが更新されたことを示しています。api/next.txt
は、Go言語の次期バージョンで導入される予定の新しいAPIや変更されるAPIをリストアップするためのファイルです。このファイルへの変更は、Goの標準ライブラリに新たな機能が追加されることを意味します。
変更の背景
このコミットの背景には、Go言語の標準ライブラリ、特にネットワークおよびHTTP関連の機能強化と、Linuxシステムコールへの対応の拡充があります。
-
HTTPリクエストのキャンセル機能: 従来のGoの
net/http
パッケージでは、進行中のHTTPリクエストを外部からキャンセルする直接的なメカニズムが不足していました。特に、タイムアウトやユーザー操作による中断など、リクエストのライフサイクルをより細かく制御したいというニーズが高まっていました。CancelRequest
メソッドの追加は、この課題に対処し、より堅牢で応答性の高いネットワークアプリケーションを構築するための基盤を提供します。 -
Cookie管理の標準化: HTTP通信においてCookieの管理は不可欠ですが、Goの標準ライブラリには、Cookieの保存、取得、およびセッション管理を包括的に行うための専用パッケージがありませんでした。開発者は通常、サードパーティライブラリを使用するか、独自のCookie管理ロジックを実装する必要がありました。
net/http/cookiejar
パッケージの導入は、この共通のニーズに応え、Cookie管理を標準化し、開発者がより簡単にセキュアなWebクライアントを構築できるようにすることを目的としています。特に、Public Suffix Listのサポートは、セキュリティ上の重要な考慮事項です。 -
TCP Fast Open (TFO) のサポート:
MSG_FASTOPEN
は、Linuxカーネルが提供するTCP Fast Open (TFO) 機能に関連するソケットオプションです。TFOは、TCP接続の確立にかかる時間を短縮し、特にWebページ読み込みのような短命な接続において、ネットワークのレイテンシを削減する技術です。Goのsyscall
パッケージにこの定数が追加されることで、GoアプリケーションがTFO機能を直接利用できるようになり、ネットワークパフォーマンスの向上が期待されます。
これらの変更は、Go言語がより成熟したネットワークプログラミング環境を提供し、現代のWebアプリケーションや分散システム開発の要求に応えるための継続的な取り組みの一環です。
前提知識の解説
Go言語の api/next.txt
api/next.txt
は、Go言語の標準ライブラリのAPI変更を追跡するための特別なファイルです。Goプロジェクトでは、APIの互換性を非常に重視しており、既存のAPIを変更する際には厳格なプロセスを踏みます。api/next.txt
には、次のメジャーリリースで導入される予定の新しい関数、メソッド、型、定数などがリストアップされます。このファイルは、GoのAPIレビュープロセスの一部であり、変更がコミュニティによってレビューされ、承認された後にコミットされます。
net/http
パッケージ
net/http
パッケージは、Go言語でHTTPクライアントおよびサーバーを実装するための主要なパッケージです。HTTPリクエストの送信、HTTPレスポンスの処理、Webサーバーの構築など、HTTP通信に関する基本的な機能を提供します。
net/http/cookiejar
パッケージ
net/http/cookiejar
は、HTTPクライアントがCookieを管理するためのパッケージです。WebブラウザがCookieを保存し、後続のリクエストで自動的に送信するのと同様の機能を提供します。
Jar
: Cookieを保存および管理する主要な構造体です。Options
:Jar
の動作をカスタマイズするためのオプションを提供します。PublicSuffixList
: 公開サフィックスリスト(Public Suffix List, PSL)を実装するためのインターフェースです。PSLは、ドメイン名が登録可能なサフィックス(例:.com
,.co.jp
,.github.io
)のリストであり、Cookieのセキュリティを強化するために使用されます。これにより、悪意のあるサイトが上位ドメインのCookieを設定することを防ぎます。
syscall
パッケージ
syscall
パッケージは、オペレーティングシステムが提供する低レベルのシステムコールへのアクセスを提供します。ファイル操作、プロセス管理、ネットワーク通信など、OSの基本的な機能と直接やり取りするために使用されます。
TCP Fast Open (TFO)
TCP Fast Open (TFO) は、TCP接続の確立プロセスを高速化するための拡張機能です。通常のTCP接続では、データ送信を開始する前に3ウェイハンドシェイク(SYN, SYN-ACK, ACK)が必要です。TFOでは、クライアントが最初のSYNパケットに少量のデータを埋め込むことができ、サーバーがTFOをサポートしている場合、SYN-ACKパケットでそのデータに対する応答を返すことができます。これにより、1ラウンドトリップタイム(RTT)分の遅延を削減し、特に短命な接続や多数の小さなリクエストを処理する際に、Webページの読み込み速度やAPI応答時間を改善します。TFOを利用するには、クライアントとサーバーの両方がTFOをサポートしている必要があり、またOSレベルでの有効化も必要です。
技術的詳細
net/http.Transport.CancelRequest
net/http.Transport
は、HTTPリクエストの送信、接続の再利用、プロキシ設定などを管理する構造体です。CancelRequest
メソッドは、この Transport
が送信中の特定のリクエストをキャンセルする機能を提供します。
- 機能:
CancelRequest
は、指定された*http.Request
オブジェクトに関連付けられたHTTPリクエストを、それがまだ完了していない場合にキャンセルします。これにより、ネットワークI/Oが中断され、関連するリソースが解放されます。 - 実装の考慮事項: 内部的には、この機能は通常、リクエストに関連付けられたコンテキスト(
context.Context
)のキャンセルメカニズムを利用するか、基盤となるネットワーク接続をクローズすることで実現されます。これにより、長時間実行されるリクエストや、ユーザーが操作を中断した場合などに、リソースの無駄な消費を防ぎ、アプリケーションの応答性を向上させることができます。
net/http/cookiejar
パッケージの導入
このパッケージは、RFC 6265 (HTTP State Management Mechanism) に準拠したCookie管理機能を提供します。
New(*Options) (*Jar, error)
: 新しいJar
インスタンスを作成します。Options
を使用して、Jar
の動作(例: Public Suffix Listの利用)をカスタマイズできます。(*Jar) Cookies(*url.URL) []*http.Cookie
: 指定されたURLに対して送信すべきCookieのリストを返します。ドメイン、パス、有効期限などのCookie属性に基づいて適切なCookieを選択します。(*Jar) SetCookies(*url.URL, []*http.Cookie)
: 指定されたURLから受信したCookieをJar
に保存します。既存のCookieを更新したり、新しいCookieを追加したりします。PublicSuffixList
インターフェース:PublicSuffix(domain string) string
: 指定されたドメインの公開サフィックスを返します。例えば、"www.example.co.uk"
の場合、"co.uk"
を返します。String() string
: デバッグ目的などで、このリストの文字列表現を返します。 このインターフェースを実装することで、カスタムのPublic Suffix Listプロバイダを使用できます。
syscall
パッケージにおける MSG_FASTOPEN
定数
MSG_FASTOPEN
は、Linuxの sendmsg
や recvmsg
などのソケット操作関数で使用されるフラグです。
- 目的: このフラグは、TCP Fast Open (TFO) を利用して、TCP接続の確立と同時にデータを送信することを可能にします。
- 利用方法: クライアント側では、最初のSYNパケットにデータを埋め込むために
MSG_FASTOPEN
フラグをsendto
やsendmsg
に渡します。サーバー側では、TFOが有効になっている場合、受信したSYNパケットからデータを読み取ることができます。 - プラットフォーム固有性:
MSG_FASTOPEN
はLinux固有の機能であり、このコミットではlinux-386
,linux-386-cgo
,linux-amd64
,linux-amd64-cgo
,linux-arm
といった複数のLinuxアーキテクチャ向けに定数が追加されています。これは、Goがクロスプラットフォーム対応を重視しつつも、特定のOSの高度な機能を活用できるようにしていることを示しています。
コアとなるコードの変更箇所
このコミット自体は、Goのソースコードを直接変更するものではなく、GoのAPI変更を記録する api/next.txt
ファイルのみを変更しています。
--- a/api/next.txt
+++ b/api/next.txt
@@ -552,11 +552,21 @@ pkg net, var UDP DialOption
pkg net/http, func ParseTime(string) (time.Time, error)
pkg net/http, method (*Request) PostFormValue(string) string
pkg net/http, method (*ServeMux) Handler(*Request) (Handler, string)
+pkg net/http, method (*Transport) CancelRequest(*Request)
pkg net/http, type CloseNotifier interface { CloseNotify }
pkg net/http, type CloseNotifier interface, CloseNotify() <-chan bool
pkg net/http, type Request struct, PostForm url.Values
pkg net/http, type Server struct, TLSNextProto map[string]func(*Server, *tls.Conn, Handler)
pkg net/http, type Transport struct, ResponseHeaderTimeout time.Duration
+pkg net/http/cookiejar, func New(*Options) (*Jar, error)
+pkg net/http/cookiejar, method (*Jar) Cookies(*url.URL) []*http.Cookie
+pkg net/http/cookiejar, method (*Jar) SetCookies(*url.URL, []*http.Cookie)
+pkg net/http/cookiejar, type Jar struct
+pkg net/http/cookiejar, type Options struct
+pkg net/http/cookiejar, type Options struct, PublicSuffixList PublicSuffixList
+pkg net/http/cookiejar, type PublicSuffixList interface { PublicSuffix, String }
+pkg net/http/cookiejar, type PublicSuffixList interface, PublicSuffix(string) string
+pkg net/http/cookiejar, type PublicSuffixList interface, String() string
pkg net/mail, func ParseAddress(string) (*Address, error)
pkg net/mail, func ParseAddressList(string) ([]*Address, error)
pkg net/smtp, method (*Client) Hello(string) error
@@ -1058,6 +1068,7 @@ pkg syscall (freebsd-amd64), type IfAnnounceMsghdr struct, Version uint8
pkg syscall (freebsd-amd64), type IfAnnounceMsghdr struct, What uint16
pkg syscall (freebsd-amd64), type InterfaceAnnounceMessage struct
pkg syscall (freebsd-amd64), type InterfaceAnnounceMessage struct, Header IfAnnounceMsghdr
+pkg syscall (linux-386), const MSG_FASTOPEN ideal-int
pkg syscall (linux-386), const RTNLGRP_IPV4_IFADDR ideal-int
pkg syscall (linux-386), const RTNLGRP_IPV4_MROUTE ideal-int
pkg syscall (linux-386), const RTNLGRP_IPV4_ROUTE ideal-int
@@ -1117,6 +1128,7 @@ pkg syscall (linux-386), type TCPInfo struct, Snd_ssthresh uint32
pkg syscall (linux-386), type TCPInfo struct, State uint8
pkg syscall (linux-386), type TCPInfo struct, Total_retrans uint32
pkg syscall (linux-386), type TCPInfo struct, Unacked uint32
+pkg syscall (linux-386-cgo), const MSG_FASTOPEN ideal-int
pkg syscall (linux-386-cgo), const RTNLGRP_IPV4_IFADDR ideal-int
pkg syscall (linux-386-cgo), const RTNLGRP_IPV4_MROUTE ideal-int
pkg syscall (linux-386-cgo), const RTNLGRP_IPV4_ROUTE ideal-int
@@ -1176,6 +1188,7 @@ pkg syscall (linux-386-cgo), type TCPInfo struct, Snd_ssthresh uint32
pkg syscall (linux-386-cgo), type TCPInfo struct, State uint8
pkg syscall (linux-386-cgo), type TCPInfo struct, Total_retrans uint32
pkg syscall (linux-386-cgo), type TCPInfo struct, Unacked uint32
+pkg syscall (linux-amd64), const MSG_FASTOPEN ideal-int
pkg syscall (linux-amd64), const RTNLGRP_IPV4_IFADDR ideal-int
pkg syscall (linux-amd64), const RTNLGRP_IPV4_MROUTE ideal-int
pkg syscall (linux-amd64), const RTNLGRP_IPV4_ROUTE ideal-int
@@ -1235,6 +1248,7 @@ pkg syscall (linux-amd64), type TCPInfo struct, Snd_ssthresh uint32
pkg syscall (linux-amd64), type TCPInfo struct, State uint8
pkg syscall (linux-amd64), type TCPInfo struct, Total_retrans uint32
pkg syscall (linux-amd64), type TCPInfo struct, Unacked uint32
+pkg syscall (linux-amd64-cgo), const MSG_FASTOPEN ideal-int
pkg syscall (linux-amd64-cgo), const RTNLGRP_IPV4_IFADDR ideal-int
pkg syscall (linux-amd64-cgo), const RTNLGRP_IPV4_MROUTE ideal-int
pkg syscall (linux-amd64-cgo), const RTNLGRP_IPV4_ROUTE ideal-int
@@ -1294,6 +1308,7 @@ pkg syscall (linux-amd64-cgo), type TCPInfo struct, Snd_ssthresh uint32
pkg syscall (linux-amd64-cgo), type TCPInfo struct, State uint8
pkg syscall (linux-amd64-cgo), type TCPInfo struct, Total_retrans uint32
pkg syscall (linux-amd64-cgo), type TCPInfo struct, Unacked uint32
+pkg syscall (linux-arm), const MSG_FASTOPEN ideal-int
pkg syscall (linux-arm), const RTNLGRP_IPV4_IFADDR ideal-int
pkg syscall (linux-arm), const RTNLGRP_IPV4_MROUTE ideal-int
pkg syscall (linux-arm), const RTNLGRP_IPV4_ROUTE ideal-int
コアとなるコードの解説
このコミットは、Go言語の標準ライブラリに以下のAPIが追加されることを api/next.txt
に記録しています。
-
pkg net/http, method (*Transport) CancelRequest(*Request)
:- これは
net/http
パッケージのTransport
型にCancelRequest
という新しいメソッドが追加されることを示しています。 - このメソッドは、引数として
*http.Request
を受け取ります。 - これにより、開発者は
Transport
を介して送信された特定のリクエストを、そのリクエストが完了する前にプログラム的にキャンセルできるようになります。これは、タイムアウト処理やユーザーによる操作の中断など、リクエストのライフサイクルをより細かく制御するために非常に有用です。
- これは
-
pkg net/http/cookiejar
パッケージの新規追加:- このセクションは、
net/http/cookiejar
という新しいパッケージが導入されることを示しています。 - このパッケージには、以下の型、関数、メソッドが含まれます。
func New(*Options) (*Jar, error)
: Cookieジャー(Cookieを保存・管理するコンテナ)の新しいインスタンスを作成する関数。method (*Jar) Cookies(*url.URL) []*http.Cookie
: 指定されたURLに対して送信すべきCookieのリストを返すJar
のメソッド。method (*Jar) SetCookies(*url.URL, []*http.Cookie)
: 指定されたURLから受信したCookieをJar
に保存するJar
のメソッド。type Jar struct
: Cookieジャーの主要な構造体。type Options struct
:Jar
の動作をカスタマイズするためのオプション構造体。type Options struct, PublicSuffixList PublicSuffixList
:Options
構造体内にPublicSuffixList
というフィールドがあることを示しており、これにより公開サフィックスリストの利用を制御できます。type PublicSuffixList interface { PublicSuffix, String }
: 公開サフィックスリストのインターフェース。PublicSuffix
メソッドとString
メソッドを持つことを示しています。type PublicSuffixList interface, PublicSuffix(string) string
:PublicSuffixList
インターフェースのPublicSuffix
メソッドのシグネチャ。type PublicSuffixList interface, String() string
:PublicSuffixList
インターフェースのString
メソッドのシグネチャ。
- これらのAPIは、GoのHTTPクライアントがWebブラウザのようにCookieを自動的に管理するための標準的な方法を提供します。
- このセクションは、
-
pkg syscall (linux-*)
,const MSG_FASTOPEN ideal-int
:- これは
syscall
パッケージにMSG_FASTOPEN
という定数が追加されることを示しています。 ideal-int
は、Goの型システムにおける「型なし整数定数」を意味します。- この定数は、
linux-386
,linux-386-cgo
,linux-amd64
,linux-amd64-cgo
,linux-arm
といった複数のLinuxアーキテクチャ向けに定義されています。 MSG_FASTOPEN
は、LinuxのTCP Fast Open (TFO) 機能を利用するためのソケットオプションであり、これによりGoアプリケーションはTCP接続の確立と同時にデータを送信できるようになり、ネットワークのレイテンシを削減できます。
- これは
これらの変更は、Go言語がネットワークプログラミングの分野でより強力で柔軟な機能を提供し、現代のWebおよびシステムプログラミングの要求に応えるための進化を示しています。
関連リンク
- Go言語の公式ドキュメント: https://golang.org/doc/
- Go言語の
net/http
パッケージ: https://pkg.go.dev/net/http - Go言語の
syscall
パッケージ: https://pkg.go.dev/syscall - TCP Fast Open (Wikipedia): https://en.wikipedia.org/wiki/TCP_Fast_Open
- Public Suffix List: https://publicsuffix.org/
参考にした情報源リンク
- Go言語のコミット履歴 (GitHub): https://github.com/golang/go/commits/master
- Go Code Review Comments (API Design): https://go.dev/doc/effective_go#api-design
- RFC 6265 - HTTP State Management Mechanism: https://datatracker.ietf.org/doc/html/rfc6265
- Linux man pages for
sendmsg
(forMSG_FASTOPEN
context): https://man7.org/linux/man-pages/man2/sendmsg.2.html - Go CL 7518044 (related change list): https://golang.org/cl/7518044 (これはコミットメッセージに記載されているリンクであり、このコミットの直接的な変更内容を指すものではなく、関連する変更リストを示しています。)
- Go issue tracker (for context on feature requests): https://github.com/golang/go/issues
- Go
net/http/cookiejar
package documentation (after its introduction): https://pkg.go.dev/net/http/cookiejar (このパッケージはコミット後に導入されたため、コミット時点では存在しませんが、解説のために参照しました。)