ソケット

# ソケット

インターネットはTCP/IPと呼ぶ通信プロトコルを利用しますが、そのTCP/IPを
プログラムから利用するには、プログラムの世界とTCP/IPの世界を結ぶ特別な
出入り口が必要となります。その出入り口となるのがソケット
(Socket)であり、TCP/IPのプログラミング上の大きな特徴となっています。
このため、TCP/IP通信をソケット通信と呼ぶこともあります。

## ソケットとは

ソケットとは、簡単にいえばコンピュータ間の概念的な電話機であり、郵便ポ
ストです。つまり、プログラムはソケットに喋りかけたり、手紙を投函すれば、
通信相手のコンピュータの受話器または郵便受け、つまりソケットにその喋っ
た内容や手紙が届くことになります。従って、プログラムは通信相手のソケッ
トに自分のソケットを繋ぐことができれば、コンピュータ同士がどのようにデー
タを送受信しているかなどは考える必要がないのです。

ソケットはその使い方にも特徴があります。ソケットを介してデータを送受信
するときにはファイルの入出力と同じ要領で行うことができます。つまり、送
信したいデータをソケットに書き込むと通信相手のコンピュータのソケットに
届きます。また、受信はソケットからデータを読み出せばいいのです。ファイ
ルの入出力を行うプログラムを何度か書いた方は多いと思いますが、その方法
と違いはありません。

先ほど、ソケットはコンピュータ間の電話機であり、郵便ポストであると申し
上げましたが、電話機と郵便ポストが違うように、コネクション型通信である
TCPと、データダイアグラム型通信であるUDPではソケットの使い方が大きく異
なります。本書では、TCPを前提としたソケットの使い方を中心に説明してい
きます。

### コラム：ソケットの歴史

昔々、カリフォルニア大学バークレイ校というところで、AT&Tのベル研が開発
したオペレーティングシステムであるUNIXを拡張しようという研究が行われ、
BSD UNIXという名称で、便利で高機能のUNIXが開発されておりました。その研
究の一つにUNIXから通信ネットワーク、特にTCP/IPを利用した通信プログラム
を容易にする工夫として開発されたのがソケットです。

UNIXでは、キーボード、画面などのデータを読んだり、書き込む対象は何でも
ファイルとして扱ってしまおうという哲学があります。そこで、コンピュータ
間通信もファイルへの読み書きとしてプログラミングができないかということ
を目標にして開発されました。このため、ファイルの入出力プログラムの流れ
である、ファイルのオープン・データの書き出し／読み出し・ファイルクロー
ズに乗っ取り、UNIXにおける初期のTCP/IPの利用では /dev/tcp というファイ
ルへのオープン・読み／書き・クローズがそのまま通信になるようにデザイン
されていました。しかし、BSD UNIXを開発しているグループは、TCP/IPの多様
な通信形態を扱うには、オープン・読み／書き・クローズの流れだけでは困難
であると考え、代わりに生み出されたのがソケットです。ソケットは、ファイ
ルオープンに相当する操作が通常のファイルより複雑ですが、より高度が通信
が可能であり、さらにオープン後はファイルへの読み書きと同じスタイルで通
信が可能になります。

ソケットはその取り扱いの容易さから、その後、UNIXの本流であるAT&TのUNIX
にも採り入れらましたし、他のオペレーティングシステムにも徐々に利用でき
るようになりました。特に、初期のインターネットでは接続されているコンピュー
タの多くがUNIXオペレーティングシステムを利用していたため、インターネッ
ト用のソフトウェアの殆どはソケットを利用して開発されました。この結果、
他のオペレーティングシステムが、これらのインターネット用のソフトウェア
を利用するには、そのオペレーティングシステムでもソケット機能を提供して
PCいる必要が生じ、大型計算機（メインフレーム）から、WindowsやMacOSなどの
用のオペレーティングシステムまでもがソケット機能を提供しています。
このため、ソケットの使い方さえ知っていれば、インターネットに代表される
TCP/IPを基礎とした通信ネットワーク用のプログラミングができるようになり
ますし、ソケットを利用したプログラムが書けないと、インターネット用のプ
ログラムは書けないといっても過言ではありません。（コラム終わり）

## ソケット間通信

電話には電話番号がついてます。そして、電話をかけるときは、この電話番号
でどの電話機にかけるかを特定します。インターネットには数多くのコンピュー
タが接続されています。インターネット上でコンピュータ同士が通信をすると
きは、どのコンピュータ（またはグループ）と通信をしたいのかを特定しなけ
ればいけません。インターネット上の電話番号に相当するのは、IPアドレスと
ポート番号と呼ばれるものです。

### IPアドレス

IPアドレスは各コンピュータに割り当てられた番号で、同じIPアドレスをもっ
たコンピュータはインターネット上には一つしかありません。このIPアドレス
は32ビットの数字で133.65.66.181などと書かれますが、通常は
machine.some.where.jpのようにネットワーク名やマシン名をドット記号で区
切って表現します。

なお、IPアドレスは各コンピュータに割り当てられると申し上げましたが、厳
密にはEthernetなどの物理的ネットワークのためのインタフェースである、ネッ
トワークインタフェースごとに一つのIPアドレスを持ちます。このため、一つ
のコンピュータが複数のネットワークインタフェースをもっている場合には同
じコンピュータでも複数のIPアドレスを持つことになります。

### ポート番号

一つのコンピュータでも同時に複数の通信を行う場合があります。例えば、
FTPでファイルを転送しながら、WWWブラウザでホームページをアクセスしたり、
メールを送受信することがあります。このとき、どのプログラムのための通信
データなのかを区別して仕分ける必要があります。その仕分けるための識別子
がポート番号と呼ばれる16ビットの整数番号です。つまり、IPアドレスが
machine.some.where.jpという代表電話番号だとすると、ポート番号は内線番号に
相当します。コンピュータ間通信の内容によって事前に決められ
ているポート番号(Well-known Port Number)もあります。

表:TCP通信のポート番号例

番号 キーワード 内容
21 ftp ファイル転送
23 telnet 遠隔端末
25 smtp 電子メイル送信
79 finger ユーザ情報の取得
80 http WWWブラウザによるホームページアクセス
110 pop3 電子メイル受信

この他にも、すでに使われているポート番号があります。また、用途が決まっ
たポート番号が幾つか予約されています。UNIX系のOSでは1023番以下の予約ポー
ト番号であり、システム管理者(ルート)にならないと使えません。どのポート
番号を使うかは一概にはいえないのですが、一般的には5000番以上のポート番
号を使うのが安全です。通信用途とポート番号の対応関係は、
UNIXならば/etc/servicesというファイルを、Windows95/98ならば
C:\WINDOWS\SERVICES(ここでC:\WINDOWSとはWindowsがインストール
されているフォルダー名)というファイルを調べてみてください。以下は
Windows98のSERVICESファイルの一部です。

# Format:
# <service name> <port number>/<protocol> [aliases...] [#<comment>]
echo 7/tcp
echo 7/udp
discard 9/tcp sink null
discard 9/udp sink null
systat 11/tcp
systat 11/tcp users
daytime 13/tcp
daytime 13/udp
netstat 15/tcp
qotd 17/tcp quote
qotd 17/udp quote
chargen 19/tcp ttytst source
chargen 19/udp ttytst source
ftp-data 20/tcp
ftp 21/tcp
telnet 23/tcp
smtp 25/tcp mail
(省略)

SERVICESファイルにある一覧はあくまでも目安であり、ここにあげ
られたポート番号以外も利用されていることがあります。

### コラム：IPアドレスの付け方

IPアドレスの設定はオペレーティングシステムにより行います。ただし、IPア
ドレスをそのコンピュータが接続しているネットワークに依存し、他のコンピュー
タと同じ番号をつけてはいけません。また、インターネットワークプロバイダー
を利用して、インターネットに接続している場合は、DHCPと呼ばれる機構を通
じて、接続時にプロバイダーによりIPアドレスがその都度割り当てられます。
このため、プロバイダーに接続するためにIPアドレスが変わってしまうことも
あります。