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

[インデックス 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システムコールへの対応の拡充があります。

  1. HTTPリクエストのキャンセル機能: 従来のGoの net/http パッケージでは、進行中のHTTPリクエストを外部からキャンセルする直接的なメカニズムが不足していました。特に、タイムアウトやユーザー操作による中断など、リクエストのライフサイクルをより細かく制御したいというニーズが高まっていました。CancelRequest メソッドの追加は、この課題に対処し、より堅牢で応答性の高いネットワークアプリケーションを構築するための基盤を提供します。

  2. Cookie管理の標準化: HTTP通信においてCookieの管理は不可欠ですが、Goの標準ライブラリには、Cookieの保存、取得、およびセッション管理を包括的に行うための専用パッケージがありませんでした。開発者は通常、サードパーティライブラリを使用するか、独自のCookie管理ロジックを実装する必要がありました。net/http/cookiejar パッケージの導入は、この共通のニーズに応え、Cookie管理を標準化し、開発者がより簡単にセキュアなWebクライアントを構築できるようにすることを目的としています。特に、Public Suffix Listのサポートは、セキュリティ上の重要な考慮事項です。

  3. 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の sendmsgrecvmsg などのソケット操作関数で使用されるフラグです。

  • 目的: このフラグは、TCP Fast Open (TFO) を利用して、TCP接続の確立と同時にデータを送信することを可能にします。
  • 利用方法: クライアント側では、最初のSYNパケットにデータを埋め込むために MSG_FASTOPEN フラグを sendtosendmsg に渡します。サーバー側では、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 に記録しています。

  1. pkg net/http, method (*Transport) CancelRequest(*Request):

    • これは net/http パッケージの Transport 型に CancelRequest という新しいメソッドが追加されることを示しています。
    • このメソッドは、引数として *http.Request を受け取ります。
    • これにより、開発者は Transport を介して送信された特定のリクエストを、そのリクエストが完了する前にプログラム的にキャンセルできるようになります。これは、タイムアウト処理やユーザーによる操作の中断など、リクエストのライフサイクルをより細かく制御するために非常に有用です。
  2. 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を自動的に管理するための標準的な方法を提供します。
  3. 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およびシステムプログラミングの要求に応えるための進化を示しています。

関連リンク

参考にした情報源リンク