LAN技術研究室(LANに関心がある人のために情報を提供しているサイト)

このページでは、ソケットについて解説しています。
ソケットは、LANやインターネットで使用するTCP/IPなどのネットワークプログラムを作成したい場合に役立ちます。



ネットワークソフトウェアの構造

ソケットの基礎(1)

昔からUNIXというOS(オペレーティングシステム)がありまして、その仲間にはNetBSDやFreeBSDなどのBSD系UNIXがあります。
BSDとは、Berkeley Software Distributionの略です。
このBSD系UNIXを起源とし、コンピュータネットワークの機能を提供するAPIをソケットと言います。
APIは、Application Program Interfaceの略で、アプリケーション・プログラム・インターフェイスのことです。
80年代にBSD系UNIXにソケットが導入されました。
最初は、単なるプロセス間通信の仕組みを提供するものでしたが、やがてネットワークを挟んだプロセス間通信へと発展しました。
ソケットの実体は、主にC言語によるアプリケーションソフトウェアの開発でノード間または同一ノード内のプロセス間通信、主にTCP/IPのコンピュータネットワークに関するライブラリを示します。
ソフトウェア開発者はこれを利用してC言語でネットワークアプリケーションソフトウェアを開発します。
ソケットは、BSDソケットバークレーソケットなどとも呼ばれています。
バークレーソケットでは、2つのEnd Point(端点)を繋ぎ、この端点間の通信を行うためのAPIを提供します。
このような概念は、家電製品をケーブルでコンセントに繋ぐことに似ています。
そのため、この端点をソケットと呼びます。
一つのソケットは、2つのプロセス間で行われる通信の一方の端点に相当します。
このバークレーソケットをMicrosoft®のWindows®に移植し、拡張したものをWinSockと言います。
WinSockは、ウィンソックと読み、Windows®でTCP/IPなどのネットワークプログラムを作成したい場合に使用されます。
バークレーソケットのようなネットワークアプリケーションソフトを開発した場合、LANのような環境があると簡単に開発したソフトのテストができます。
当サイト(LAN技術研究室)の管理人である私(ケロ丸)は、昔からソケットにはお世話になっています。
これを使用してよくネットワークアプリケーションソフトを開発してきました。
多くの人がいつも使用しているブラウザ、Webサーバー、電子メールソフト、メールサーバーなどのプログラムは、すべてこのソケットライブラリを使用して開発されています。
このライブラリに含まれるAPI関数を使用することで、LANやインターネットで使用するプログラムを作成できます。
プログラム言語は、主に前述のC言語ですが、JavaやPerlなどでも使用することが可能です。
このソケットを使用してLANやインターネット用のプログラムが作成できるということはわかりましたが、ソケットプロトコルとの関係があまりはっきりしないのをネットワーク初心者のころに感じたのは、私(ケロ丸)だけではないと思いますが、皆さんはいかがでしょうか。
そこで、わかりやすくこの関係について説明したいと思います。
最近では、ネットワークアプリケーションプログラムを作成する場合、プロトコルTCP/IPを使用する場合が多くなりました。
そのため、TCP/IPプロトコルスタックを表で示してから、ソケットプロトコルの関係について説明します。

TCP/IP階層モデル
階層階層名称利用対象
レイヤアプリケーション層電子メールやWebなどOSI参照モデルのセション層以上全部
レイヤトランスポート層OSI参照モデルのトランスポート層に対応し、接続指向(TCP)や非接続指向(UDP)の通信を行う。
レイヤネットワーク層OSI参照モデルのネットワーク層に対応し、IPパケットという単位でデータを転送する。
レイヤインターフェイス層OSI参照モデルでは対応する階層がなく、上位のIPリンク層に依存しないで通信ができるように共通化したインターフェイスを提供
レイヤリンク層OSI参照モデルのデータリンク層物理層の機能とほぼ同じであり、イーサーネットATMなどがあてはまる。

プロトコルは、上の表で示したように階層構造になっていて、下から積み上げられています。
上の表で示したプロトコル階層モデルは、TCP/IP階層モデルですが、他にOSI参照モデルというものもあります。
後者の方がむしろよく見かけます。
OSI参照モデルに関しては、以下のページで詳しく説明しています。

プロトコルの基礎

上の表で示したように、各レイヤ階層)と様々なプロトコルが対応しています。
そして、だいたいプロトコルごとにヘッダーがあります。
例えば、上記のTCP/IP階層モデルリンク層に位置するイーサーネットではMACヘッダーネットワーク層に位置するIPヘッダートランスポート層に位置するTCPヘッダーなどがあります。
どのプロトコルを使用するかによって、様々なプロトコルの組み合わせパターンが異なってきます。
また、これらの抽象的なプロトコルという概念をソフトウェアの集合体で具体的に実現する必要があります。
抽象的なTCP/IPプロトコルスタックのイメージをソケットネットワークを通して他のノードと通信ができるプログラムという具現化したものになるように手を貸してくれます。
そこで、このようなソフトウェアの集合体は、プロトコル階層構造に従って、下から積み上げたような構造を成しています。
実際に、西洋の皿を積み上げる器具(スタック)のように、下からこれらのソフトウェアを積み上げていきます。
このようなソフトウェアの構造をプロトコルスタックと呼びます。
一つ一つのお皿にヘッダーが書かれていて、どんどん積み重ねていきます。
一番下は、MACヘッダーが書かれたお皿、その上にIPヘッダーが書かれたお皿、その上にTCPヘッダーが書かれたお皿、...というように積み上げてく感じになります。
一枚、二枚、三枚、四枚、...T_T
これでは、番町皿屋敷じゃわい。(^_^;
全部積み上がったら、パケットとしてLANなどのネットワークに投げてしまいます。
プロトコルスタックは、OSや通信の目的によっても内容が変わります。
つまり、貨物列車の荷物の入れ替えのように積み上げるプロトコルに対応するソフトウェアを入れ替える必要があります。
ここまでの説明で、ソケットプロトコルの関係について少しでもお分かり頂けましたでしょうか。
ソケットは、プロトコルと1対1で対応しているわけではありません。
ソケットと呼ばれる一方の端点を作成する場合は、バークレーソケットでもWinSockでもsocketというAPI関数を使用します。
その際、この関数の引数で前述のプロトコルスタックのどのレイヤの上に独自のプロトコルを実装するかをプログラム作成者が決めることができます。
例えば、前述のブラウザやWebサーバーのようにHTTPというプロトコルを実装したいのなら、上記のTCP/IP階層モデルTCPというトランスポート層プロトコルの上に実装する必要があります。
socket関数では、この関数の引数で接続指向か非接続指向かを指定したり、もっと下位のプロトコルを指定したりすることができます。
TCPの場合接続指向を指定します。
接続指向のことをstream(ストリーム)と呼ぶ場合もあり、非接続指向のことをdatagram(データグラム)と呼ぶ場合もあります。
また、下位のプロトコルを指定する場合は、例えばIPというネットワーク層プロトコルの上に独自のプロトコルを実装することもできます。
他には、バークレーソケットの場合、TCP/IP階層モデルリンク層の上に独自のプロトコルを実装することも可能です。
例えば、ARPというアドレスの解決に使われるプロトコルがありますが、これを送受信できるプログラムを自分で作成することもできます。
この場合、MACヘッダーを記述したフレームにARP関連の必要項目に値を設定して送信します。
ただし、WinSockでは、そのバージョンにもよりますが、IP以上にしか実装できません。
バークレーソケットでもWinSockでもsocket以外に多数のAPI関数があります。
LANで実験できそうないろいろ役立つツールを御自分で作ってみてはいかがでしょうか。
自分のLANを監視するツールでも作って、インターネットからの不正アクセスがないかどうかを調査したり、LANの負荷を測定したり、様々な用途に使えるかもしれません。
こういったプログラムを作ってみるのも楽しいものです。(^_^)

ページトップ
ネットワークソフトウェアの構造[メニュー]へ戻る
LAN技術者の必須知識[メニュー]へ戻る
サイトマップ(LAN技術研究室の案内図)
ネットワーク技術用語集へ行く
LAN技術研究室のトップページ




© 2008 Toyozi Masuda All rights reserved.