IPA情報処理試験キーワード

IPA|情報処理技術者試験

ソケットとは?図で理解する通信の入口とOS内部の仕組み【TCP/IP・リソース消費まで徹底解説】

「ソケットは通信の入口です」――。ネットワークの学習を始めると必ず出会うこの説明ですが、「入口」という言葉だけでは、その実態はなかなかつかめません。なぜソケットには上限があり、リソースを消費するのでしょうか? アプリケーションがconnect()send()を呼び出したとき、OSの内部では一体何が起きているのでしょうか?

この疑問は、特に応用情報技術者試験やネットワークスペシャリスト試験の午後問題で問われる、TCP/IPの深い理解に繋がる重要なポイントです。

本記事では、「ソケットとは何か?」という基本的な問いから一歩踏み込み、その正体をOSの仕組みとTCP/IPプロトコルの観点から徹底的に解き明かします。「ソケットは単なる通り道ではなく、通信状態を管理する複雑なデータ構造である」という事実を、豊富な図解と身近な例えを交えながら解説。サーバ側でなぜソケット数のチューニングが必要になるのか、その理由までスッキリ理解できる構成でお届けします。

ソケットとは何か? アプリケーションとOSを繋ぐ「通信ハンドル」の正体

ネットワークプログラミングを学ぶ上で、ソケットは避けては通れない基本的な概念です。多くの解説書では「アプリケーションがネットワーク通信を行うための出入口」と説明されますが、この「出入口」とは具体的に何を指すのでしょうか。

結論から言うと、ソケットの正体は「OSが管理する、通信制御のための情報が詰まったデータ構造」そのものです。

アプリケーションが「インターネットにデータを送りたい」と考えたとき、直接ネットワークカード(NIC)を操作するわけではありません。代わりに、OSに対して「通信を始めたいので、窓口を用意してください」と依頼します。この依頼に応じてOSが作成する、いわば通信専用の受付窓口がソケットです。

(ここに図解を挿入:アプリケーション、ソケット、OS(TCP/IPスタック)、ネットワークカードの関係性を示すシンプルな階層図)

プログラマの視点から見ると、ソケットはファイルを開いて読み書きする際の「ファイルハンドル(ファイルディスクリプタ)」によく似ています。ファイルハンドルを使ってread()write()を行うように、ソケットハンドル(ソケットディスクリプタ)を使ってrecv()send()を実行し、ネットワークの先にいる相手とデータをやり取りするのです。

このセクションのポイントをまとめると、以下のようになります。

  • アプリケーションにとっての「出入口」: ソケットは、プログラムがネットワークという外部世界とデータをやり取りするための唯一の窓口として機能します。
  • OS内部の「データ構造」: OSはソケットが作成されるたびに、通信状態を管理するためのメモリ領域(socket構造体など)を確保します。これがソケットの実体です。
  • プログラマから見た「通信ハンドル」: 一度作成されたソケットは、特定の番号(ディスクリプタ)で管理され、アプリケーションはこの番号を使ってデータの送受信をOSに命令します。

このように、ソケットは単なる抽象的な「入口」ではなく、OS内部に確保される具体的なリソースであり、アプリケーションがそれを操作するための「ハンドル」でもあるのです。この二面性が、ソケットを理解する上で最初の重要な鍵となります。

ソケットとIPアドレス・ポート番号の関係|通信相手を特定する仕組み

ソケットが通信の窓口であると理解できたところで、次に「どのようにして特定の相手と通信するのか」を見ていきましょう。ここで登場するのが、おなじみのIPアドレスとポート番号です。

これらの関係は、よく現実世界の住所に例えられます。

  • IPアドレス: 建物の住所(例: 東京都千代田区千代田1-1)
  • ポート番号: 建物の中の部屋番号(例: 101号室)
  • ソケット: その部屋に実際に設置された「ドア」そのもの

住所と部屋番号が分かれば、特定の部屋(アプリケーション)に手紙を届けられます。しかし、通信は一方通行ではありません。誰から誰への通信なのかを明確にする必要があります。特にTCPのような信頼性が求められる通信では、OSはすべての通信をユニークに識別しなければなりません。

この識別のために使われるのが、以下の4つの情報セットです。これは「4-tuple(フォー・タプル)」と呼ばれ、ネットワークにおける通信の最小単位を定義します。

要素 役割
送信元IPアドレス 通信を送り出すコンピュータ 192.0.2.10 (クライアントPC)
送信元ポート番号 送り出す側のアプリケーションを識別する番号 54321 (OSが自動で割り当てたポート)
宛先IPアドレス 通信を受け取るコンピュータ 203.0.113.80 (Webサーバ)
宛先ポート番号 受け取る側のアプリケーションを識別する番号 443 (HTTPS)

OSは、この4つの情報の組み合わせが完全に一致する通信を「1つのユニークなTCPコネクション」として管理し、それを1つのソケットに関連付けます。これにより、たとえ宛先のIPアドレスとポート番号(例えばWebサーバのIPと443番ポート)が同じでも、送信元のIPアドレスやポート番号が異なれば、OSはそれらを別の通信として正しく区別できるのです。

(ここに図解を挿入:1台のWebサーバに、2台の異なるクライアントPCが接続している図。サーバ側のソケットが、それぞれのクライアントとの4-tupleによって区別されていることを示す)

これが、1台のWebサーバが何千、何万というクライアントと同時にHTTPS通信を行える理由です。クライアントごとに送信元IPアドレスやポート番号が異なるため、サーバOSは無数のソケットを生成・管理し、それぞれの通信を混線させることなく処理できるのです。

ソケットは1対ではない?サーバ・クライアント両側で生成される仕組み

1本の通信(TCPコネクション)が確立されると、そこにはいくつのソケットが関わっていると思いますか? 直感的には「1本の通信だから1つ」と考えてしまいがちですが、正解は「2つ」です。

TCP通信では、必ずクライアント側とサーバ側の両方のOSに、それぞれ1つずつソケットが作成されます。つまり、1つのコネクションは、2つのソケットによって支えられているのです。

(ここに図解を挿入:クライアントPCとWebサーバが通信している図。それぞれのOS内部にソケットが存在し、1対のコネクションを形成していることを示す)

なぜ両側にソケットが必要なのでしょうか。それは、TCPが「信頼性の高い通信」を実現するための仕組みに深く関係しています。

  • 独立した状態管理: TCPは「送ったデータが正しく相手に届いたか」「データが途中で抜け落ちたり、順番が入れ替わったりしていないか」を常に監視します。このため、送信側は「どこまで送ったか」、受信側は「どこまで受け取ったか」という状態を、それぞれ独立して管理する必要があります。それぞれのソケットが、この状態管理情報(シーケンス番号やACK番号など)や送受信データを一時的に溜めておくバッファを保持する役割を担います。
  • リソースの確保: 通信を安定して行うためには、データを一時的に保管するメモリ領域(バッファ)が必要です。クライアントは送信バッファを、サーバは受信バッファを使います(逆も然り)。これらのリソースは、それぞれのOSが自らのソケットのために確保します。

これを電話に例えるなら、1つの「通話」のために、あなたと相手のそれぞれが「受話器(電話機)」を持っているのと同じです。双方の受話器が正常に機能して初めて、円滑な会話が成り立ちます。ソケットも同様に、クライアントとサーバの両輪があって初めて、信頼性の高い通信が実現されるのです。

ソケットの内部構造とメモリ消費|OSが確保するTCP制御ブロック(TCB)とは

ソケットが単なる「入口」ではなく、通信状態を管理する実体であることを繰り返してきました。では、socket()システムコールが呼ばれたとき、OSのカーネル内では具体的にどのようなものが生成されるのでしょうか。その正体は、メモリ上に確保される複雑なデータ構造の集合体です。

TCPソケットが1つ作られると、OSは主に以下のコンポーネントをメモリ上に確保します。

(ここに図解を挿入:OSカーネル内に確保されるソケットの内部構造図。TCB、送受信バッファ、タイマー、FDなどが含まれるイメージ)

  • TCP制御ブロック (TCB: Transmission Control Block)

    ソケットの心臓部とも言える最も重要なデータ構造です。TCBには、特定のTCPコネクションを管理するためのあらゆる情報が格納されています。例えば、通信相手のIPアドレスとポート番号、現在のシーケンス番号とACK番号、ウィンドウサイズ、輻輳制御の状態、コネクションの状態(ESTABLISHED, FIN_WAITなど)といった、まさにTCPの頭脳にあたる部分です。

  • 送信バッファと受信バッファ

    TCPの信頼性を支える縁の下の力持ちです。送信バッファは、アプリケーションから渡されたデータのうち、まだ相手からの確認応答(ACK)が返ってきていないものを保持し続けます。これにより、パケットロスが発生した際の「再送」が可能になります。一方、受信バッファは、ネットワークから届いたデータを一時的に溜めておく場所です。TCPではパケットの到着順序が保証されないため、ここで順番を正しく並べ替えたり、アプリケーションがデータを読み取るまでの間、保管したりします。

  • その他の関連情報

    上記以外にも、再送タイミングを計るための各種タイマー、最適なパケットサイズを決定するための経路情報(MTUなど)、そしてアプリケーションがこのソケットを識別・操作するためのファイルディスクリプタ(FD)などがTCBに関連付けられて管理されます。

これらのデータ構造、特に送受信バッファは相応のメモリを必要とします。そのため、1つのTCPソケットあたり、OSの設定にもよりますが数十KBから数百KBものカーネルメモリを消費することになります。これが、サーバが高負荷時に「ソケットの数が上限に達する」という問題が発生する物理的な原因です。

ちなみに、コネクションレス型であるUDPのソケットは、TCBのような複雑な状態管理機構や再送のためのバッファを持たないため、TCPソケットに比べて非常に軽量です。信頼性をプロトコル側で担保するか、アプリケーション側で担保するかの違いが、リソース消費量に直接現れているのです。

ソケットがメモリ等のリソースを消費する理由|TCPの信頼性担保という役割

ここまでの解説で、TCPソケットがOS内部で多くのメモリを確保することが分かりました。では、なぜソケット、特にTCPソケットはこれほどのリソースを必要とするのでしょうか。その答えは、TCPが担う「信頼性の高い通信を保証する」という重い責務にあります。

UDPがデータを送りっぱなしにする「配達人」だとすれば、TCPは以下のような機能を持つ「優秀で几帳面な秘書」に例えることができます。

  • 配達確認(ACK): 送ったデータが相手に届いたかを必ず確認し、確認応答(ACK)が返ってくるまで領収書(送信データ)を保管し続けます。この「保管」のために送信バッファが必要です。
  • 順序の整列(順序保証): データがバラバラの順番で届いても、受信側で正しい順序に並べ替えてからアプリケーションに渡します。この「整列」作業のために受信バッファが使われます。
  • 再配達(再送制御): データが途中で紛失したことを検知したら、保管しておいた領収書を元に同じデータを再送します。
  • ペース調整(フロー制御・輻輳制御): 相手の受け取り能力(受信バッファの空き)やネットワークの混雑状況を常に監視し、送り出すデータ量を動的に調整します。

これらの高度な機能を実現するためには、通信のあらゆる「状態(ステート)」を常に記憶し、管理し続けなければなりません。TCP制御ブロック(TCB)は、まさにこの膨大な状態を記録するための台帳であり、送受信バッファはその作業スペースです。

つまり、ソケットがリソースを消費するのは、それが単なる「データの通り道」ではなく、通信の品質を保証するための高度な「通信管理装置」としての役割を内包しているからです。TCPの信頼性はタダではなく、OSがソケットごとに消費するCPU時間やメモリという「コスト」によって支えられているのです。

ソケットとTCP/IPヘッダの違い|OSの管理情報とパケットの制御情報

ソケットの役割を深く理解する上で、しばしば混同されがちな「ヘッダ」との違いを明確にしておくことが重要です。どちらも通信を制御するための情報ですが、その役割と存在する場所が全く異なります。

両者の違いを、構成案にもあった「郵便」の例えで見てみましょう。

  • ソケット: 郵便局の「窓口」です。手紙(データ)の受付、配達状況の追跡、再送手続きなど、一連の送達プロセス全体を管理するOSの機能・仕組みを指します。
  • ヘッダ: 手紙を入れた「封筒に書かれた宛名や差出人」です。IPヘッダには届け先の住所(IPアドレス)、TCPヘッダには部屋番号(ポート番号)やデータの順番(シーケンス番号)といった、データそのものに付随する制御情報が記録されています。

郵便局の窓口(ソケット)は、あなたが手紙を出しに行く場所であり、実体として存在します。一方、封筒の宛名(ヘッダ)は、手紙というデータの一部です。ネットワーク上のルータ(配達員)は、このヘッダ情報を見てパケットを正しい宛先へと中継していきます。

この違いを技術的な観点から表にまとめると、以下のようになります。

項目 ソケット ヘッダ (TCP/IPヘッダ)
実体 OSがメモリ上に確保するデータ構造(TCBなど) ネットワークを流れるパケットの先頭に付加されるビット列
存在する場所 コンピュータのOSカーネル内 個々の通信パケットの内部
主な役割 アプリケーションとOS間のインターフェース、通信状態の管理 パケットの宛先指定、順序制御、誤り検出
ライフサイクル 通信の開始から終了まで継続的に存在する パケットごとに生成・破棄される

アプリケーションがデータをソケットに書き込むと、OS内のTCP/IPプロトコルスタックがそのデータにTCPヘッダやIPヘッダを付けてカプセル化し、ネットワークに送り出します。つまり、ソケットはヘッダ情報を生成・解釈するための「仕組み」であり、ヘッダはその仕組みによってパケットに刻印される「情報」なのです。この明確な役割分担を理解することが、ネットワークのトラブルシューティングやパフォーマンスチューニングにおいても非常に重要となります。

サーバのソケット上限とリソース管理|file-max・ulimitによるチューニング入門

TCPソケットが1つあたり数十〜数百KBのメモリを消費するという事実は、特に多数のクライアントからの同時接続を処理するサーバにおいて、極めて重要な意味を持ちます。もし無制限にソケットの生成を許可すれば、サーバはあっという間にメモリを使い果たし、システムダウンに至るでしょう。これを防ぐため、LinuxなどのOSではソケット数(より正確にはファイルディスクリプタ数)に上限が設けられています。

サーバにおけるソケット数の管理は、大きく分けて「OSレベル」と「アプリケーションレベル」の2階層で行われます。

OSレベルでの上限設定

OSは、システム全体とプロセス単位でファイルディスクリプタの上限を定めています。ソケットはファイルの一種として扱われるため、この制限が直接的な上限となります。

  • /proc/sys/fs/file-max: システム全体で同時にオープンできるファイルディスクリプタの総数。OS全体の大元の上限値です。
  • ulimit -n: ユーザーまたはプロセスごとに同時にオープンできるファイルディスクリプタの数。Webサーバなどのサービスはこの制限下で動作するため、実質的に最も影響のあるパラメータです。

例えば、ulimit -n1024(多くのシステムのデフォルト値)の場合、そのユーザが起動したプロセスは、ファイルとソケットを合わせて1024個までしか同時にオープンできません。

アプリケーションレベルでの上限設定

OSの上限値に加えて、NginxやApacheといったミドルウェア自身も、性能と安定性のバランスを取るために同時接続数(=ソケット数)を制御する設定を持っています。

  • Nginx: worker_connections ディレクティブで、1つのワーカープロセスが同時に処理できる接続数を設定します。
  • Apache: MaxRequestWorkers (旧 MaxClients) ディレクティブで、同時に処理できるリクエストの最大数を設定します。

これらの設定値は、必ずOSのulimit -nの値以下でなければ意味がありません。大規模なサービスを運用する際には、まずulimitの値を引き上げ、その上でアプリケーションのパラメータを調整するという手順を踏むのが一般的です。

高負荷環境でのチューニング

同時接続数が数万を超えるような高負荷環境では、単に上限値を引き上げるだけでは不十分です。より少ないリソースで効率的に多数のソケットを扱うための、非同期I/O(epoll, kqueueなど)や、データベース接続で使われるコネクションプーリングといった高度な技術が不可欠となります。これらは、ソケットのリソース消費という根本的な課題に対応するための重要なアーキテクチャです。

ソケットのリソース管理は、サーバの安定稼働を支える根幹技術の一つであり、その背景にあるソケットの仕組みを理解することが、適切なチューニングへの第一歩となります。

ソケットのライフサイクル|bindからacceptを経てTIME_WAITに至るまで

ソケットは、通信が必要になったときに生まれ、役目を終えると消えていきます。この一連の流れ(ライフサイクル)を理解することは、ネットワークアプリケーションがどのように動作しているかを把握する上で不可欠です。ここでは、特にサーバ側の視点でライフサイクルを追ってみましょう。

サーバアプリケーションは、クライアントからの接続を待ち受け、接続があるたびに実際の通信を行うという役割を担います。このため、サーバ側では役割の異なる2種類のソケットが登場します。

  • リスニングソケット: クライアントからの接続要求を待ち受ける専門のソケット。「本店の総合受付窓口」のようなものです。
  • 接続済みソケット: 実際にクライアントとデータをやり取りするためのソケット。接続要求があるたびに新しく作られる「個別の担当者窓口」です。

(ここに図解を挿入:リスニングソケットが1つあり、複数のクライアントが接続してくるたびに、それぞれに対応する接続済みソケットが生成されていくイメージ図)

サーバ側ソケットの典型的な流れ

サーバ側のソケットは、以下のシステムコール(API)によって状態が遷移していきます。

  1. socket(): まず、ソケットという名のデータ構造をOSカーネル内に作成します。まだ住所も役割も決まっていない、更地の状態です。
  2. bind(): 作成したソケットに、特定のIPアドレスとポート番号(例: 0.0.0.0:443)を割り当てます。これで、通信の「住所」が確定します。
  3. listen(): ソケットを「待ち受け状態」にします。この瞬間から、このソケットはクライアントからの接続要求(SYNパケット)を受け付けられる「リスニングソケット」になります。
  4. accept(): クライアントから接続要求が来ると、accept()はそれを受け入れ、通信専用の新しいソケットを生成して返します。この新しく生まれたソケットが「接続済みソケット」です。リスニングソケットは、また次の接続要求を待つために待機し続けます。
  5. read() / write() (recv / send): 接続済みソケットを使って、クライアントとの間でデータの送受信を行います。
  6. close(): 通信が終了したら、接続済みソケットを閉じます。

このaccept()が新しいソケットを生み出す仕組みこそが、1つのサーバプログラムで多数のクライアントを同時に捌ける理由です。

通信終了後のTIME_WAIT状態

TCP通信では、close()を呼び出してもソケットはすぐには消滅しません。多くの場合、「TIME_WAIT」という状態に移行し、数分間リソースを保持し続けます。これはTCPの信頼性を担保するための重要な仕組みです。

  • 遅延パケットの衝突防止: ネットワークの遅延によって、切断したはずの古いコネクションのパケットが後から届くことがあります。もし同じポート番号で新しい接続がすぐに始まってしまうと、この古いパケットを新しい接続が誤って受信してしまうかもしれません。TIME_WAITは、そうした迷子のパケットが消滅するのを待つためのクールダウン期間です。
  • 確実な接続切断: 自分が送ったFINに対する最後のACKが相手に届いたことを保証します。もしACKが途中で消えてしまうと、相手はFINを再送してきます。TIME_WAIT状態であれば、その再送FINに対して再度ACKを返すことができます。

ただし、このTIME_WAIT状態のソケットもポート番号などのリソースを占有するため、非常に短い時間で大量の接続と切断が繰り返されるサーバでは、利用可能なポートを使い果たしてしまう「ポート枯渇」問題の原因となることもあります。

ソケットの役割はAPI提供|データ加工はTCP/IPスタックの仕事

ここまで、ソケットが通信状態の管理や信頼性の担保に深く関わっていると解説してきました。しかし、ここで一つ重要な役割分担を明確にしておきましょう。実は、ソケット自身がデータを加工したり、再送制御を行ったりしているわけではありません。

データの加工、すなわち以下のような複雑な処理の実行主体は、OSカーネルに実装されたTCP/IPプロトコルスタックです。

  • アプリケーションデータの分割(セグメンテーション)
  • TCPヘッダやIPヘッダの付加(カプセル化)
  • シーケンス番号やACK番号の管理
  • 再送タイミングの決定と実行
  • ウィンドウサイズに基づくフロー制御

では、ソケットの真の役割とは何でしょうか? それは、アプリケーションがこのTCP/IPスタックの機能を安全かつ容易に利用するための、標準化された「インターフェース(API)」を提供することです。

(ここに図解を挿入:【アプリケーション】 ⇔ 【ソケットAPI (send/recv)】 ⇔ 【OSカーネル: TCP/IPスタック】 ⇔ 【NIC】という階層的なデータの流れを示す図)

ここでも「郵便窓口」の例えが役立ちます。

  • あなた(アプリケーション): 届けたい手紙(データ)を書きます。
  • 郵便窓口(ソケット): あなたから手紙を受け付けるためのインターフェースです。send()を呼ぶことは、窓口に手紙を差し出す行為に相当します。
  • 郵便局の内部職員(TCP/IPスタック): 窓口の奥で、受け取った手紙に消印を押し、仕分けし、輸送トラックに乗せるなど、実際の配送業務を行います。あなたはこの内部処理の詳細を知る必要はありません。

このように、アプリケーション開発者はTCP/IPの複雑な内部動作を全て理解していなくても、「ソケット」というお作法にのっとってOSにデータ受け渡しを依頼するだけで、信頼性の高い通信を実現できます。この責務の分離こそが、ネットワークプログラミングを現実的なものにしているのです。

したがって、「ソケットは通信の入口」という最初の説明は、より正確には「アプリケーションがOSのネットワーク機能に入るための入口(API)」と理解するのが本質に近いと言えるでしょう。「窓口」そのものと、窓口の奥で行われている「内部業務」を混同しないことが重要です。

まとめ:ソケットとはOS内部の状態を持つ通信管理装置である

本記事では、「通信の入口」というシンプルな言葉の裏に隠されたソケットの正体について、OSの内部構造やTCP/IPの仕組みと関連付けながら多角的に解説してきました。

最後に、この記事の要点を振り返りましょう。

  • ソケットは二つの顔を持つ

    アプリケーションにとってはネットワーク機能を使うための便利な「APIの窓口(ハンドル)」ですが、OS内部ではTCPの信頼性を担保するための状態(TCB)やバッファを持つ、具体的な「データ構造」そのものです。

  • 信頼性にはコストがかかる

    TCPソケットがメモリなどのリソースを消費するのは、順序保証や再送制御といった信頼性の高い通信を実現するための「管理コスト」です。1つの通信にはクライアントとサーバ双方にソケットが必要であり、それぞれがリソースを消費します。

  • サーバ設計の勘所

    ソケットがリソースを消費するという事実は、サーバが処理できる同時接続数に物理的な上限があることを意味します。ulimit値の調整やミドルウェアの接続数設定は、このソケットのリソース管理に他なりません。

  • ソケットは「窓口」、仕事人は「TCP/IPスタック」

    ヘッダの付加やデータの分割といった実務はOSのTCP/IPスタックが担当し、ソケットはアプリケーションとスタックを繋ぐインターフェースとしての役割に徹しています。

「ソケット=通信の入口」という言葉は間違いではありません。しかし、その入口が、実は状態を保持し続ける高機能な管理装置でもあると理解することで、ネットワークのパフォーマンス問題やサーバ設計に関する議論の解像度が格段に上がるはずです。

特に、応用情報技術者試験やネットワークスペシャリスト試験で問われるTCP/IPの深い知識は、まさにこのソケットというOSの仕組みの理解に基づいています。本記事が、その一助となれば幸いです。

図解で総復習:ソケットの仕組みとライフサイクル

最後に、本記事で解説したソケットの概念を4つの図でまとめます。これらの図は、ソケットがどのような位置付けで、どのように動作し、どのような構造を持つのかを視覚的に捉えるのに役立ちます。

  1. OSI参照モデルにおけるソケットの位置付け

    (ここに図解を挿入:OSI参照モデルまたはTCP/IP階層モデルを図示し、アプリケーション層とトランスポート層の間に「ソケットAPI」が位置することを示す図。アプリケーションがソケットを通じてTCP/UDPを利用する関係性を表す)

  2. クライアント・サーバ間のソケット対応関係

    (ここに図解を挿入:1台のサーバに対し、複数のクライアントが接続している図。サーバ側には1つのリスニングソケットと、クライアントの数だけ接続済みソケットが存在し、各接続済みソケットがクライアント側のソケットと1対1で通信路を形成していることを示す)

  3. TCPソケットの内部構造

    (ここに図解を挿入:OSカーネルメモリ内にある1つのソケットの概念図。中にTCP制御ブロック(TCB)、送信バッファ、受信バッファ、関連するファイルディスクリプタ(FD)などが含まれている様子を描く)

  4. サーバ側ソケットのライフサイクル

    (ここに図解を挿入:socket()からbind(), listen()でリスニングソケットが生まれ、accept()で接続済みソケットが生成され、close()を経てTIME_WAIT状態に至るまでの一連の流れを示すシーケンス図または状態遷移図)

-IPA|情報処理技術者試験
-