matobaの学んだこと

とあるPythonエンジニアのブログ。ソフトウェア開発、執筆活動、ライフログ。

ソケット通信ってなんだろう

ソケット通信のことがあんまりわかってないよなあ。と思ったときがありました。

というわけで、ソケット通信ってなんだろう、ということを調べながら書きました。

ソケット通信は通信方法の1つ

調べていて最初にわかったことは、ソケット通信は通信方法の1つである、ということです。

こういう話をされると『いや、そんなこと見たらわかんねん。』って言い返したくなります。

はい。

じゃあソケット通信以外の通信方法は何があるのでしょう?

というかここでいう通信方法ってなんでしょうか?

こういう質問をされたら困ります。最初に僕はそのあたりが気になったので、調べながら書いてます。

ちなみに、ここでは通信方法という言葉を便宜上使っていますが、一般的な言葉ではないと思うので注意してください。

ソケット通信はサーバークライアントがある

ソケット通信では、必ずサーバーとクライアントがあります。言い換えると、必ずクライアントに相当するプロセスが、情報を送信して、サーバーに相当するプロセスが情報を受け取って、何かを返す。ということです。

『サーバーとクライアントがない通信ってあるの?』とか思う人もいるかもしれません。

普通にあります。例えば、地上波のテレビ番組です。地上波のテレビでは、放送局が発信するテレビの映像をのせた電波を各家庭で映してますが、放送局はどこかのテレビから、「こういう映像をください」という要求を受けた後に映像を流しているのではなくて、映像を流し続けています。

テレビはずっと映像を受信していて、テレビにチャンネルを指定すると、指定されたチャンネルに流れてくる映像を画面に映しています。

まあ厳密に言うと、テレビもデジタル放送があって〜とかありますし、ソケット通信も不特定多数に送れると思いますが、とりあえずそういう話は置いときます。

ソケット通信はプロセス間の通信

次にわかってきたのは、ソケット通信はプロセス間の通信であるということです。 言い換えると、ソケット通信では必ずプロセスから発信されて、プロセスが受信します。

プロセスとは、UNIXが実行するプログラムを管理する時に使う単位です。ということは、ソケット通信では、必ずプログラムとプログラムで通信をします。

こういう話をすると『プログラムとプログラム以外で通信することとかあるの?』と思うかもしれません。

これも普通にあります。と言うか、学校に通っていた時に『通信簿』と言うものがあったのをみんな知ってると思います。

通信という言葉は、『情報を伝達する』とかそういう意味の言葉なので送り手や受け手が何なのかはどんな通信かによって異なります。

だからソケット通信って聞いたら『プログラム間で通信するんだなー』『プログラムからプログラムに情報を送るんだろうな』みたいに思って大丈夫だろうな。と思います。

ソケットというライブラリを使って通信する

ソケット通信では、ソケットというAPIを使って通信を行います。というか、SocketというC言語のライブラリを使って通信することをSocket(ソケット)通信と言うようです。

Wikipediaで見ました。(Wikipediaすごい)

ソケット (BSD) - Wikipedia

で、ここで僕は「Socketというライブラリを使ってプロセス間で通信することをソケット通信というなら、プロセス間で通信するためのSocket以外のライブラリもあるということ?」と思いました。

Socket以外のプロセス間通信の手段もある

Socket以外のプロセス間通信の手段って何があるんだろうなーと思ったので調べました。

するとWikipediaにありました。(Wikipediaすごい)

プロセス間通信 - Wikipedia

すると、知ってるキーワードがいくつか並んでいました。

  • ファイル
  • シグナル
  • メッセージキュー
  • ソケット
  • UNIXドメインソケット
  • パイプ

...

なるほど。ファイルってプロセス間通信のための方法なんだ。とかも思いました。

確かに、プロセスAからプロセスBに情報を渡すときに、プロセスAが一回ファイルに書き出して、プロセスBに情報を渡すとかできるし、プロセスの間で通信していると言えばしてるなあ、とかも思います。

プロセス間通信って何が違うの?

色々プロセス間通信の方法があるのがわかったら、他と何が違うんだろう?と思います。

で、ざっと眺めていたらわかってきたのは以下のようなことです。

  • OSによって対応しているプロセス間通信の方法が違う。
  • ある言語に特化したプロセス間通信がある。(Java RMIとかPythonのpickleとかもそうだと思う)
  • 同期/非同期のどちらを前提にしているかで違う。(ストレージに保存するかしないか)
  • サーバークライアント/共有資源のどちらを前提にしているかで違う。
  • ネットワーク越しのマシンと通信できるかどうかで違う。

ソケット通信の特徴は?

プロセス間通信で何が違うかをわかったところで、ソケット通信の特徴を考えてみると、おそらく以下のような特徴を持っていると思います。

  • ほとんどのOSで対応している。
  • プログラミング言語に依存しない。
  • 同期型の通信で、ストレージに保存しない。
  • サーバークライアント型の通信。
  • ネットワーク越しのマシンと通信できる。
  • ライセンスフリー

要は、インターネットを作るとき、都合がいい通信方法なんだなあ、と思いました。というか、インターネットを作るために、Socketを作ったのかもしれない。(わからないけど)

ソケット通信の方法

これも調べてたし、ここからが本番なのですが、まとめる途中で力尽きました。

そのうち更新したいと思います。

とりあえず今日はここまで。