Linuxカーネルに関する技術情報を集めていくプロジェクトです。現在、Linuxカーネル2.6解読室の第2章までを公開中。
古いUNIXは、単純なプロセス間通信の仕組みしか提供していませんでした。ソケットは、それに代わる柔軟性に富んだプロセス間通信インターフェイスとして登場しました。通信プロトコルとしては、TCP/IPが最も一般的に利用されています。BSD UNIXに端を発するこのネットワークの仕組みは、現在ではほとんどのOSで採用されています。
本書のPart 5で解説します。
ソケットは、任意のプロセス間での通信を可能とします。下位層にさまざまな通信プロトコルを定義可能であり、遠隔ホスト上のプロセスとも通信できます。
Linuxカーネルでは、ソケットインターフェイスはカーネル内に実装されています(ライブラリとして実装されているOSもあります)。ソケットが管理する送受信データは、ソケットバッファと呼ばれる仕組みで管理しています。処理機構間でデータのやり取りを単純に実装すると、CPU上ではデータのコピーが何度も発生しがちですが、ソケットバッファは、プロトコル処理でデータのコピーを発生させないように考慮した作りになっています(機能的には、BSDのmbufと呼ばれるものに相当)。たとえば、以下に述べるTCP/IPプロトコルスタックの送信処理では、TCPヘッダー生成、IPヘッダー生成、イーサネットヘッダー生成において、既存のソケットバッファに対してヘッダー部を簡単に追加できます。
さらに、データコピーを抑制するための仕組みとして、ソケットバッファのデータ部を共有する仕組みも提供しています。これは、TCPの再送処理などで用いられています。また、メモリ上の任意のページをソケットバッファのデータとしても登録でき、ファイルシステムなどから送り出すデータをソケットバッファ内にコピーすることなく、ネットワークに送り出すことが可能です。
「第21章 ソケットインターフェイス」で、その実装を説明します。
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プロトコルスタックを実現するための実装を見ていきます。
[PageInfo]
LastUpdate: 2008-07-07 17:54:11, ModifiedBy: hiromichi-m
[Permissions]
view:all, edit:login users, delete/config:members