ソケットプログラミング入門:コンピュータネットワークの基礎をわかりやすく解説
ソケット(Socket)は、コンピュータネットワークプログラミングにおいて最も基本的な技術のひとつです。ソケットを利用することで、ネットワーク上のソフトウェア同士が、ネットワークハードウェアやオペレーティングシステム(OS)に組み込まれた標準的な仕組みを通じて相互に通信できるようになります。
「インターネット開発のための新機能」という印象を受けやすいソケットですが、実はWebが登場する以前から存在している技術です。現在でも、数多くの代表的なネットワークアプリケーションがソケットに依存して動作しています。
ソケット技術でネットワークにできること
ソケットは、2つのソフトウェア間の1対1の接続(ポイントツーポイント接続)を表します。3つ以上のソフトウェアが通信する場合は、クライアント/サーバー方式や分散システムのように、複数のソケットを組み合わせて実現します。たとえば、多数のWebブラウザが、サーバー側で生成された複数のソケットを使って、1台のWebサーバーと同時に通信できます。
ソケットベースのソフトウェアは通常、ネットワーク上の別々の2台のコンピュータ上で動作しますが、1台のコンピュータ内でのローカル通信(プロセス間通信)にも利用できます。また、ソケットは双方向性を持つため、接続のどちら側からでもデータの送信と受信が可能です。
なお、通信を開始する側のアプリケーションを「クライアント」、相手側を「サーバー」と呼ぶことがありますが、この用語はピアツーピア(P2P)ネットワーキングでは混乱を招きやすいため、一般的には避けるのが望ましいとされています。
ソケットAPIと主要ライブラリ
標準的なアプリケーションプログラミングインターフェース(API)を実装したライブラリは、いくつか公開されています。最初期の主流パッケージである「Berkeley Socket Library(バークレーソケット)」は、UNIX系システムで広く利用されてきました。
もうひとつの代表的なAPIが、Microsoft OS向けの「Windows Sockets(WinSock)」です。他のコンピュータ技術と比べても、ソケットAPIは非常に成熟しており、WinSockは1993年から、バークレーソケットは1982年から長年にわたり使われ続けています。
ソケットAPIは比較的小規模でシンプルな構成です。多くの関数は、read()、write()、close()といったファイル入出力ルーチンの関数とよく似ています。実際にどの関数を呼び出すかは、採用するプログラミング言語やソケットライブラリによって異なります。
ソケットインターフェースの3つの種類
ソケットインターフェースは、大きく次の3種類に分類できます。
1. ストリームソケット
最も一般的なタイプです。通信する両者が先にソケット接続を確立し、その後その接続を通じて渡されるデータは、送信された順序どおりに届くことが保証されます(コネクション指向型のプログラミングモデル)。
2. データグラムソケット
コネクションレス型の性質を持つソケットです。ストリームと異なり、接続は明示的ではなく暗黙的に扱われます。各側が必要に応じてデータグラムを送信し、相手からの応答を待つ形になります。メッセージが伝送中に失われたり、順序が入れ替わって受信されたりすることもありますが、こうした問題への対処はソケットではなくアプリケーション側が担います。データグラムソケットを採用すると、ストリームソケットと比べて高いパフォーマンスと柔軟性を得られるケースがあります。
3. RAWソケット
TCPやUDPといった標準プロトコルに対するライブラリの組み込みサポートをバイパスできるソケットです。独自の低レベルプロトコルを開発する際などに使用されます。
ネットワークプロトコルとソケットの関係
現代のネットワークソケットは、通常、IP・TCP・UDPというインターネット標準プロトコルと組み合わせて使われます。インターネットプロトコル向けにソケットを実装したライブラリでは、ストリームにはTCP、データグラムにはUDP、RAWソケットにはIPがそれぞれ対応付けられています。
インターネット上で通信を行う際、IPソケットライブラリはIPアドレスによって特定のコンピュータを識別します。ただし、インターネットの多くの部分はネーミングサービス(DNSなど)と連携して動作しているため、ユーザーやソケットプログラマーは、「208.185.127.40」のような数値アドレスの代わりに、「thiscomputer.wireless.lifewire.com」のような名前でコンピュータを扱うことができます。
さらに、ストリームソケットとデータグラムソケットは、同一コンピュータ上の複数のアプリケーションを区別するためにもIPポート番号を利用します。たとえば、インターネット上のWebブラウザは、Webサーバーとのソケット通信の既定値としてポート80を使用するよう設計されています。
-
【Ruby入門】開発者が押さえておきたい主要データ構造の特徴と使い方
データ構造とは? データ構造とは、データを整理し、効率よくアクセスするための具体的な方法のことです。 代表的な例としては以下のようなものがあります。 配列(Array) 二分木(Binary Tree) ハッシュ(Hash) データ構造ごとに得意な処理は異なります。たとえば、ハッシュは辞書(単語と意味)や電話帳(名前と電話番号)のように「キーと値」のペアを扱うデータの保存に最適です。 どのようなデータ構造が存在するのか、そしてそれぞれの特性を理解することは、Ruby開発者としてのレベルアップに直結します。 本記事では、その知識をわかりやすく解説していきます! 配列(Array)を理解する
-
Rubyネットワークプログラミング入門!ソケットの基本とTCPサーバーの作り方
Rubyでオリジナルのネットワーククライアントやサーバーを作りたいと思ったことはありませんか?あるいは、その仕組みを理解したいだけかもしれません。 その場合、必ず「ソケット」と向き合うことになります。 この記事では、Rubyネットワークプログラミングの基礎を学び、Rubyを使って他のサーバーやクライアントと通信を始めるための方法をご紹介します。 ソケットとは何か? ソケットとは、通信チャネルのエンドポイント(終端)のことです。クライアントとサーバーの両方が、このソケットを使って通信を行います。 その仕組みは非常にシンプルです。 接続が確立されると、ソケットにデータを書き込むことでデータが相手側