前回,Linuxがハードウエアを制御するデバイス・ドライバについて解説しました。そこでは,Linuxがハードウエアを抽象化する3つのデバイス・モデルのうち,ブロック・デバイスとキャラクタ・デバイスについて紹介しました。

 しかし,もう一つのネットワーク・デバイスには触れませんでした。それは,ネットワーク・デバイスは,カーネルのネットワーク機能に密接にかかわっており,他の2つのデバイス・タイプとは異なる部分が多いためです。

 Linuxカーネルは,インターネットなどで使われる通信プロトコルであるIP(Internet Protocol)をはじめ,AppleTalkやIPXといったさまざまなプロトコルに対応したネットワーク機能を持っています。物理的な接続規格についても,一般的に使われているイーサネットのほか,さまざまな規格に対応しています。

 今回から,Linuxのネットワーク機能と,ネットワーク・デバイスの取り扱いについて解説します。なお,前述の通りLinuxは多くのネットワーク・プロトコルに対応していますが,本記事ではTCP/IPを利用する場合を中心に解説していきます。

プロセスはソケットを介して通信

 まずは,Linuxで稼働するユーザー・プロセスがどのように通信を実現するのか,その仕組みを見てみましょう。

 LinuxなどのUNIX系OSは,各種デバイスの入出力インタフェースを「デバイス・ファイル」という形で提供します。これを利用することで,ユーザー・プロセスは,一般のファイルを読み書きするのと変わらない手順で周辺機器をコントロールできます。具体的には,open()システム・コールでデバイス・ファイルに対応する「ファイル記述子」を取得し,それを使って周辺機器を特定してread()やwrite()などのシステム・コールでアクセスします。

 ネットワークでの通信プロトコルも,ファイルと同じように統一的にアクセスできるようにするのが効率的です。

 しかし,通信プロトコルは複雑なため,「ファイル」という概念をそのまま適用するのには無理があります。UNIXにおけるファイルは,固定長のデータが連続して記録されているもの(バイト・ストリーム・データ)と定義されていて,ファイルを操作するシステム・コールもそれを前提に設計されています。しかし,通信プロトコルでは可変長のデータを取り扱うことも多く,ファイル操作用のシステム・コールをそのままでは利用できません。

 また,通信の場合には,データをやり取りする相手がファイルやデバイスではなく,他のプロセスになるのが普通です。しかも,相互のプロセスには親子関係があることを期待できませんし,異なるシステムで動作するプロセスということも考えられます。そのため,データをやり取りする相手を特定する仕組みにも拡張が必要です。

 そこで,UNIX系OSでは従来のファイル・インタフェースを拡張した,「ソケット」(socket)というインタフェースを通信に利用しています。ソケットは「受け口」とか「ろうそく差し」を意味する言葉です。その言葉の通り,ユーザー・プロセスは,お互いのソケットをネットワークを通して接続し,その口を通して通信を実現します(図1)。

図1●ソケットを通した通信
図1●ソケットを通した通信
プロセスはソケットを通して他のプロセスと通信できます。ソケットはネットワーク越しでも同じように利用できます。

 なお,UNIXのプロセス間通信についてはソケット以外にもいくつかの手段があります。それについては,別掲記事「プロセス間通信とソケット」を参照してください。