基本的には、Web業界では「Websocket」と「http通信」の文脈で語られることが多いトピックになる。
ソケット通信
特徴
- OSI参照モデルで言えば、トランスポート層に位置します。
- プロトコルとしては「TCP/IP」、「UDP/IP」などがある。
- ソケット自体はOS標準機能です。(OSがソケット通信を扱うためのライブラリを持っている。)
- JavaやPython、C言語をはじめ様々なプログラミング言語からOSのライブラリを呼び出せます。
- クライアントサーバー間で通信状態を維持する。(ステートフル)
TCP通信の流れ
1.ソケットを作成する。(socket関数)
クライアントとサーバーでそれぞれソケット通信の受け口である「ソケット」を作成します。
2.リッスン/接続する。
内部的には通信確立のために3wayハンドシェイクが動いています。
サーバ側(listen関数)
リッスンする。つまりクライアントからの接続要求を監視します。また、クライアントからの通信の受付はaccept関数で行います。使うポートはアプリケーション製作者が決めます。
クライアント側(connect関数)
サーバーに接続要求をします。使うポートはソケットライブラリがその端末で使っていないポートから自動で割り振ってくれます。
3.通信する。(send関数、recv関数)
データをやりとりできます。
4.切断する。(shutdown関数、close関数)
クライアント、サーバー共にどちらもソケットを削除することでソケット通信の切断という挙動になります。
ユースケース
- 同じネットワーク内のIPが異なる別のホストマシンの別プロセスと文字などをやり取りするために使われてたりします。(主にSIerのシステムなどで)
- また、常にコネクションが繋がってやりとりできる状態になるので、リアルタイムでやり取りを行う必要があるシステムなどでは使われます。(WebならWebSocketなどが使われたりします。)
発展実装
複数のクライアントから待ち受ける実装が当たり前なので、サーバーのソケットはスレッド化して複数待ち受けれるようにしたりします。
HTTP通信
特徴
- OSI参照モデルで言えば、「アプリケーション層」に位置します。
- ただ、HTTP通信でも下位層である「トランスポート層」のソケット通信は内部的に使用しているのでソケット通信の一種であると言えるでしょう。
- 1回のリクエストレスポンスごとに接続を切断する。(ステートレス)
この記事へのコメントはありません。