0.8 ネットワーク

 古いUNIXは、単純なプロセス間通信の仕組みしか提供していませんでした。ソケットは、それに代わる柔軟性に富んだプロセス間通信インターフェイスとして登場しました。通信プロトコルとしては、TCP/IPが最も一般的に利用されています。BSD UNIXに端を発するこのネットワークの仕組みは、現在ではほとんどのOSで採用されています。

 本書のPart 5で解説します。

0.8.1 ソケット

 ソケットは、任意のプロセス間での通信を可能とします。下位層にさまざまな通信プロトコルを定義可能であり、遠隔ホスト上のプロセスとも通信できます。

 Linuxカーネルでは、ソケットインターフェイスはカーネル内に実装されています(ライブラリとして実装されているOSもあります)。ソケットが管理する送受信データは、ソケットバッファと呼ばれる仕組みで管理しています。処理機構間でデータのやり取りを単純に実装すると、CPU上ではデータのコピーが何度も発生しがちですが、ソケットバッファは、プロトコル処理でデータのコピーを発生させないように考慮した作りになっています(機能的には、BSDのmbufと呼ばれるものに相当)。たとえば、以下に述べるTCP/IPプロトコルスタックの送信処理では、TCPヘッダー生成、IPヘッダー生成、イーサネットヘッダー生成において、既存のソケットバッファに対してヘッダー部を簡単に追加できます。

 さらに、データコピーを抑制するための仕組みとして、ソケットバッファのデータ部を共有する仕組みも提供しています。これは、TCPの再送処理などで用いられています。また、メモリ上の任意のページをソケットバッファのデータとしても登録でき、ファイルシステムなどから送り出すデータをソケットバッファ内にコピーすることなく、ネットワークに送り出すことが可能です。

 「第21章 ソケットインターフェイス」で、その実装を説明します。

0.8.2 TCP/IPプロトコルスタック

 BSDの実装をベースとしているOSが多い中、Linuxカーネルは完全に新規にTCP/IPプロトコルスタックを実装しています(図0-7)。System Vが採用したSTREAMSなどの汎用機構は使わず、ストレートな実装を採用しています。イーサネットなどの物理デバイスを制御するデバイスドライバ上にIPプロトコルドライバを置き、その上にTCPプロトコルドライバやUDPプロトコルドライバを配置しています。それに加え、Linuxカーネル2.6では、SCTPプロトコルも提供されるようになりました。

 LinuxカーネルのTCP/IPプロトコルスタックは、積極的に遅延処理を用いることで最大限のスループットを得ています。また、マルチプロセッサ構成時に実行並列度が向上するような、さまざまな工夫がなされています。

 さらに、Linuxカーネルは、USAGIチームの活躍により、完成度の高いIPv6スタックも備えています。実装面から見た場合、基本的な構造はIPv4スタックとほぼ同じです。

 また、Linuxカーネルは、TCP/IP標準以外の拡張機能として、パケットフィルタリング、NAT機能、負荷分散機能なども備えています。Linux搭載マシンをファイアウォールやロードバランサとして利用可能です。

 「第22章 IP層」、「第23章 UDP層」、「第24章 TCPコネクション管理」、「第25章 TCPフロー制御」、「第26章 TCP輻輳制御」にわたり、TCP/IPプロトコルスタックを実現するための実装を見ていきます。