この記事は、 BRIGHT VIE Advent Calendar 2017 - Qiitaの 22日目の記事になります。
はじめに
最近社内でもソケット通信でのやりとりを行う案件が多くなってきており、なんとなくの理解でこれまで来てしまっていたので、改めてソケット通信を理解するために調査がてら簡単にまとめてみようと思います。
ソケット通信とは
ソケット インターネットはTCP/IPと呼ぶ通信プロトコルを利用しますが、そのTCP/IPをプログラムから利用するには、プログラムの世界とTCP/IPの世界を結ぶ特別な出入り口が必要となります。 その出入り口となるのがソケット(Socket)であり、TCP/IPのプログラミング上の大きな特徴となっています。
引用元: http://research.nii.ac.jp/~ichiro/syspro98/socket.html
とのことで、普段利用しているHTTP通信もソケット通信を行っているのですね。
OSI参照モデル
OSI(Open System Interconnection)参照モデルとは、ISOで定められている、異なるベンダー間で相互に通信を行うためのネットワークモデルと言われる統一規格のことです。
高校生の頃、初級シスアドを取得するために必死で学んだ方も中にはいらっしゃるのではないでしょうか。
ここでソケット通信は、TCP/IPを利用する通信全般のことであるため、トランスポート層を指します。そして、そのソケットを利用してアプリケーション層のHTTP通信などが行われているというイメージですね。
簡単にまとめると、
・TCPは、「データの内容はおいといて、通信デバイス間での通信内容を確実に送受信するためのルール」を定めているプロトコル
・HTTPは、「TCPにさらにルールを追加して、送受信されるデータの形式や送受信タイミングをWebサイト閲覧に最適化する形に定められたルール」
と考えると分かりやすいかもしれませんね
ソケットを使うと何が出来るの?
上記OSI参照モデルからもわかるように、HTTPよりも下のレイヤを扱うことが出来きます。
また、ソケットを使うとTCP/UDP上で動く(トランスポート層レベル)アプリケーションを開発することが出来るため、HTTPよりもよりコンパクトな通信を使ってデータを送信したいといったことも可能となります。
ソケット通信のライフサイクル
ソケット通信を行う上で知っておきたいライフサイクルについて箇条書きベースで記載してみます。
下記のような処理を実際のプログラムに組み込むような形となります。
サーバ側のライフサイクル
- create ソケットの作成
- bind ソケットを特定のIPアドレスとポートに紐付け
- listen 接続の待受を開始
- accept 接続を受信
- close 接続を切断
クライアント側のライフサイクル
- create ソケットの作成
- bind ソケットを特定のIPアドレスとポートに紐付け
- connect リモートソケットに接続
- close 接続を切断
まとめ
簡単にですが概要をまとめてみましたが、簡易的な通信をするくらいだったら調べればすぐに出来そうなレベルであるが、実際にサービスとして運用させるのであれば、ディスクリプタの枯渇やpingは通るのにconnect出来ないといったトラブル対応が曖昧な知識ではなかなか厳しそうだなという印象でした。
そのあたりも意識した実装が必要になるため、しっかり勉強した上で取り組んでいきたいところですね。
以下調査している時面白かった記事のリンクになります。