OSI参照モデル
現在では、異なるメーカーの製品、OS同士でも、互換性をもってネットワークが繋がれ、
膨大なデータのやり取りを正確にできています。
1970年代では、各メーカーがそれぞれネイティブなプロトコルを用いて、通信を行っていたため、
他のメーカーとの通信に互換性がないことが問題としてありました。
同じメーカーの製品を買い続ける必要があること、他部署で他メーカーを使用していた場合、プロトコルに互換性がないため、ネットワークが接続できないことなど。
全ての機器が同じ規格に準拠すれば、このような問題がなくなると考えた国際標準化機構(ISO)が通信の標準化をを定めたのが、OSI参照モデルです。
OSI(Open System Interconnection:開放型システム間相互接続)はISO(国際標準化機構)とITU(国際電気通信連合)により、異なるベンダー間(様々なメーカーが製造した機器)で相互通信するためのネットワークアーキテクチャで、通信の機能を7つの階層に分類しています。
コンピュータ処理と通信機能との分離と、その標準化により、膨大なネットワークが今日までに存在しています。
TCP/IP
TCP/IPとは、現DARPA(米国国防高等研究計画局)が策定したデータ通信機能におけるモデルであり、
OSI参照モデルと通信概念が異なり、4つの階層を持っています。
また、世界で標準的に利用されている通信プロトコルで、インターネット・プロトコル・スイートと呼ばれています。
アプリケーション層
アプリケーションが通信するために扱うデータフォーマットやその手順を定めている階層である。
電子メール(SMTP)、Web(HTTP/HTTPS)、ファイル共有(FTP)、遠隔ログイン(TELNET)などがこの層にあたり、
個別に機能として実装したプロトコルが定義されています。
信号データを、ユーザがわかる表現に変換する役割を持つ。
トランスポート層
主なプロトコルはTCPとUDPが存在し、
データを適切なアプリケーションに振り分ける役割を持ちます。
TCPでは、データにエラーがないように、再送を行い、送り先まで確実に届けるのに対し、
UDPでは、データの欠損があった場合でも、送り続けます。
インターネット層
複数あるネットワーク間の中で、目的の転送先(PC)を特定しデータ転送を行う役割を持ちます。
(”エンドツーエンド通信”と呼びます。)
ルータがネットワークを相互接続しており、ルータ間でデータ転送を行っています。
このような、ルータによるネットワーク間のデータ転送を”ルーティング”と呼びます。
以下のプロトコルなどが使用されて、転送先のPCの特定、通信の診断を行います。
- IP(Internet Protocol)
- ICMP(Internet Control Message Protocol)
- Pingコマンドがこのプロトコルを使用しています。
- ARP(Address Resolution Protocol)
- IPアドレスとMACアドレス(Media Access Control)の変換を行うプロトコル
ネットワークインターフェース層
デバイスドライバと呼ばれて、OSとハードウェアのインターフェースを担っています。
アプリケーションが通信機能を利用するための仲介、周辺ネットワークの管理を行うために存在します。
OSI参照モデルとTCP/IPモデル
OSI参照モデルとTCP/IPモデルとでは、通信の概念が異なるため、区分に違いがありますが、
基本的には、OSI参照モデルに当てはめて考えることができます。
OSI参照モデルでは、"通信プロトコルに必要な機能"をモデル化しているのに対し、
TCP/IPの階層モデルでは、"コンピュータへプロトコルの実装"を中心としてモデルが考えられています。
(OSIでは、TCP/IPと比べて、実際に動作するプロトコルが迅速に作成出来なかったことが、普及しなかった原因として挙げられています。)
TCP/IPの内部処理
送信から受信までのTCP/IPの内部処理を大まかに表した図です。
※LはLayerの略、L4ヘッダーとはLayer4のヘッダーという意。
下層へ行くにつれて、”ヘッダー”と呼ばれるプロトコルの目印が付与されていき、
L2では、”トレーラ”と呼ばれる伝送中の情報の抜け落ちを調べるチェックコードが後ろに付与される。
送信側から、データに対してヘッダー等でコーティングすることをカプセル化と呼び、
受信側がそのコーティングを剝がしていき(プロトコルを認識していき)、データを取り出すことを非カプセル化と呼ぶ。
このようにデータにメタデータを付与することで、
プロトコルを認識し、それに応じて対応したデータを取り出すことができるといった仕組みである。
ソケット通信
ソケット通信とは、TCP/IP(概念)を利用する通信全般を指す。(TCP/IPの実装時の呼び名?)
ソケット(通信端点)とはプログラム、アプリと世界をつなぐ出入り口のことである。
(そのため、ソケット通信の呼び方で、UDPも含有している。基本的にはTCP)
ソケット通信を行うためには、IPアドレスとポート番号が必要となります。
IPアドレスは、ネットワーク上で各コンピュータに振り分けられた番号で、
同じIPアドレスを持ったコンピュータはインターネット上には、存在しません。
1つのコンピュータが複数の通信をするためには、ポート番号と呼ばれる、
通信をするプログラムを指定するものが必要になってきます。
IPアドレスとアプリケーションに応じたポート番号を指定することで、通信が行えます。
ウェルノンポート番号と呼ばれる予約された番号が存在するので注意。
例えば、
- メールの送信
- SMTP、ポート番号:25
- Web
- HTTP、ポート番号:80
- HHTPS、ポート番号:443
通信方法
ソケット通信は、双方向通信(Two-Way Communication)で、
サーバ側とクライアント側同士が双方向に要請を送ることができる。
応答後も接続は確立されており、リアルタイムにやり取りができることがメリットである。
また、双方向通信には、さらに、
- 半二重通信:
- 物理)信号経路が1つのみしか存在しない
- 通信)信号が衝突しないように送信動作を制御、衝突した場合は修正
- トランシーバーのようなやり取り
- 全二重通信:
- 物理)信号経路が送受信で別々に存在する
- 通信)信号が衝突しないので、衝突することを考慮せず、送信動作を行う
- 携帯電話でのやり取り
に分類できることも言及しておく。
なお、物理的な意味ではなく、通信上の意味で使われていることに注意。
ソケット通信は3回のパケットの送受信を行い接続を確立させるため、スリーウェイ・ハンドシェイクとも呼ばている。
基本的に8つのメソッドで通信を行えます。
- socket():ソケットを作成
- bind():ソケットを関連づける
- ソケットにIPアドレスやポート番号を設定する
- listen():接続待ち
- サーバ側がソケットを接続待ちにする
- connect():接続を要求する
- クライアント側が実行し、接続をどこにするか定める
- accept():接続の受け入れ
- サーバ側がクライアント側からの接続要求を受け入れる
- send():データの送信
- receive():データの受信
- close():ソケット通信の切断
HTTPとの違い
HTTP通信
HTTP通信では、クライアント側がリクエストした時のみ、サーバ側がレスポンスをする仕組みである。
これは単方向通信(One-Way Communication)と呼ばれている。
また、サーバ側の応答後は、接続がすぐに終了する。
ソケット通信に規則を与えて、Web上で取り扱いやすくしたものが、HTTP通信です。
なので、HTTP通信もソケット通信を行っています。
まとめると、
・ソケット通信(TCP通信)は、「通信デバイス間での通信内容を確実に送受信するためのルール」を定めているプロトコル
・HTTPは、「TCP通信にルールを追加して、送受信されるデータの形式や送受信タイミングをWebサイト閲覧に最適化する形に定められたルール」
WebSocket
WebSocketと呼ばれるものが存在します。
これは、Web上で、双方向通信を行うために開発されたもので、
厳密にはHTTP/HTTPSとプロトコルが異なります(HTTPをUpgradeしたものになる)
まとめ
簡潔にまとめると、
TCP/IPは通信の標準規格であり、様々なプロトコルが存在する。
ソケット通信とはTCP/IP全般を指す言葉であり、HTTP通信もソケット通信を行っている。
WebSocketと呼ばれるものはHTTPをアップグレードしたもので、Web上でリアルタイムにやり取りに適している。
DjangoでのWebSockt実装についての記事も投稿予定。
参考文献
マスタリング TCP/IP 入門編 第2版