TCP/IPの話

# OSI参照モデル
現在では、異なるメーカーの製品、OS同士でも、互換性をもってネットワークが繋がれ、
膨大なデータのやり取りを正確にできています。

1970年代では、各メーカーがそれぞれネイティブなプロトコルを用いて、通信を行っていたため、
他のメーカーとの通信に互換性がないことが問題としてありました。
![TCP_IPの存在意義.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388964/6fa147de-6591-1a6c-01c6-be438b412f3f.png)
同じメーカーの製品を買い続ける必要があること、他部署で他メーカーを使用していた場合、プロトコルに互換性がないため、ネットワークが接続できないことなど。

全ての機器が同じ規格に準拠すれば、このような問題がなくなると考えた国際標準化機構(ISO)が通信の標準化をを定めたのが、OSI参照モデルです。
<img width="800" alt="OSI参照モデル.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388964/26fa4138-2758-4dff-259e-b3c62a63b11d.png">
OSI(Open System Interconnection：開放型システム間相互接続)はISO（国際標準化機構）とITU（国際電気通信連合）により、異なるベンダー間（様々なメーカーが製造した機器）で相互通信するためのネットワークアーキテクチャで、通信の機能を7つの階層に分類しています。

コンピュータ処理と通信機能との分離と、その標準化により、膨大なネットワークが今日までに存在しています。
# TCP/IP
TCP/IPとは、現DARPA(米国国防高等研究計画局)が策定したデータ通信機能におけるモデルであり、
OSI参照モデルと通信概念が異なり、4つの階層を持っています。
<img width="350" alt="TCP_IPモデル.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388964/3353dab3-1cc7-d775-1e52-d900e80ca467.png">
また、世界で標準的に利用されている通信プロトコルで、インターネット・プロトコル・スイートと呼ばれています。

## アプリケーション層
アプリケーションが通信するために扱うデータフォーマットやその手順を定めている階層である。
電子メール(SMTP)、Web(HTTP/HTTPS)、ファイル共有(FTP)、遠隔ログイン(TELNET)などがこの層にあたり、
個別に機能として実装したプロトコルが定義されています。
信号データを、ユーザがわかる表現に変換する役割を持つ。
![アプリケーション層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388964/1e786ba2-0192-ebf4-8109-d62715c834cd.png)

## トランスポート層
主なプロトコルはTCPとUDPが存在し、
データを適切なアプリケーションに振り分ける役割を持ちます。
TCPでは、データにエラーがないように、再送を行い、送り先まで確実に届けるのに対し、
UDPでは、データの欠損があった場合でも、送り続けます。
<img width="600" alt="TCPとUDP.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388964/29e0343b-996e-de96-683b-55d879f24b2a.png">

## インターネット層
複数あるネットワーク間の中で、目的の転送先(PC)を特定しデータ転送を行う役割を持ちます。
（”エンドツーエンド通信”と呼びます。）
ルータがネットワークを相互接続しており、ルータ間でデータ転送を行っています。
このような、ルータによるネットワーク間のデータ転送を”ルーティング”と呼びます。
![インターネット層.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388964/d981b94d-3230-6648-fee5-99e00dcda8b8.png)
以下のプロトコルなどが使用されて、転送先の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参照モデルに当てはめて考えることができます。
![TCP_IP.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388964/297846ec-b73c-d93c-89ae-370ac9c16f2f.png)
OSI参照モデルでは、"通信プロトコルに必要な機能"をモデル化しているのに対し、
TCP/IPの階層モデルでは、"コンピュータへプロトコルの実装"を中心としてモデルが考えられています。
（OSIでは、TCP/IPと比べて、実際に動作するプロトコルが迅速に作成出来なかったことが、普及しなかった原因として挙げられています。）


## TCP/IPの内部処理
送信から受信までのTCP/IPの内部処理を大まかに表した図です。
※LはLayerの略、L4ヘッダーとはLayer4のヘッダーという意。

下層へ行くにつれて、”ヘッダー”と呼ばれるプロトコルの目印が付与されていき、
L2では、”トレーラ”と呼ばれる伝送中の情報の抜け落ちを調べるチェックコードが後ろに付与される。
送信側から、データに対してヘッダー等でコーティングすることをカプセル化と呼び、
受信側がそのコーティングを剝がしていき（プロトコルを認識していき）、データを取り出すことを非カプセル化と呼ぶ。
![TCP処理.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388964/8a1ece79-e699-c212-2d1a-2cbf435d62a0.png)
このようにデータにメタデータを付与することで、
プロトコルを認識し、それに応じて対応したデータを取り出すことができるといった仕組みである。


# ソケット通信
ソケット通信とは、TCP/IP（概念）を利用する通信全般を指す。（TCP/IPの実装時の呼び名？）
ソケット（通信端点）とはプログラム、アプリと世界をつなぐ出入り口のことである。
（そのため、ソケット通信の呼び方で、UDPも含有している。基本的にはTCP）

ソケット通信を行うためには、IPアドレスとポート番号が必要となります。

IPアドレスは、ネットワーク上で各コンピュータに振り分けられた番号で、
同じIPアドレスを持ったコンピュータはインターネット上には、存在しません。
1つのコンピュータが複数の通信をするためには、ポート番号と呼ばれる、
通信をするプログラムを指定するものが必要になってきます。

![プロトコルによるポート番号の違い.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388964/34c9fbe6-cd46-2f5d-3111-08a75e385822.png)

IPアドレスとアプリケーションに応じたポート番号を指定することで、通信が行えます。
ウェルノンポート番号と呼ばれる予約された番号が存在するので注意。
例えば、
- メールの送信
    - SMTP、ポート番号：25
- Web
    - HTTP、ポート番号：80
    - HHTPS、ポート番号：443

## 通信方法
ソケット通信は、双方向通信(Two-Way Communication)で、
サーバ側とクライアント側同士が双方向に要請を送ることができる。
応答後も接続は確立されており、リアルタイムにやり取りができることがメリットである。
また、双方向通信には、さらに、
- 半二重通信：
    - 物理）信号経路が1つのみしか存在しない
    - 通信）信号が衝突しないように送信動作を制御、衝突した場合は修正
        - トランシーバーのようなやり取り
- 全二重通信：
    - 物理）信号経路が送受信で別々に存在する
    - 通信）信号が衝突しないので、衝突することを考慮せず、送信動作を行う
        - 携帯電話でのやり取り

に分類できることも言及しておく。
なお、物理的な意味ではなく、通信上の意味で使われていることに注意。

ソケット通信は3回のパケットの送受信を行い接続を確立させるため、スリーウェイ・ハンドシェイクとも呼ばている。
![ソケット通信.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388964/ae0fc67e-0a51-e1b4-a2fb-1efcad7198e8.png)
基本的に8つのメソッドで通信を行えます。
- socket()：ソケットを作成
- bind()：ソケットを関連づける
    - ソケットにIPアドレスやポート番号を設定する
- listen()：接続待ち
    - サーバ側がソケットを接続待ちにする
- connect()：接続を要求する
    - クライアント側が実行し、接続をどこにするか定める
- accept()：接続の受け入れ
    - サーバ側がクライアント側からの接続要求を受け入れる
- send()：データの送信
- receive()：データの受信
- close()：ソケット通信の切断
![ソケット通信（コネクション型）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388964/9a52501f-34a3-7038-1ea2-e2340f551306.png)

## HTTPとの違い
### HTTP通信
HTTP通信では、クライアント側がリクエストした時のみ、サーバ側がレスポンスをする仕組みである。
これは単方向通信(One-Way Communication)と呼ばれている。
また、サーバ側の応答後は、接続がすぐに終了する。
![HTTP通信.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388964/570fae4f-90b0-c75f-945e-d3d5d7059570.png)

ソケット通信に規則を与えて、Web上で取り扱いやすくしたものが、HTTP通信です。
なので、HTTP通信もソケット通信を行っています。

まとめると、
・ソケット通信（TCP通信）は、「通信デバイス間での通信内容を確実に送受信するためのルール」を定めているプロトコル
・HTTPは、「TCP通信にルールを追加して、送受信されるデータの形式や送受信タイミングをWebサイト閲覧に最適化する形に定められたルール」

## WebSocket
WebSocketと呼ばれるものが存在します。
これは、Web上で、双方向通信を行うために開発されたもので、
厳密にはHTTP/HTTPSとプロトコルが異なります（HTTPをUpgradeしたものになる）
<img width="600" alt="WebSocketの位置づけ.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/388964/9743c7d6-d09a-a95d-a48b-3857ef546e34.png">

# まとめ
簡潔にまとめると、
TCP/IPは通信の標準規格であり、様々なプロトコルが存在する。
ソケット通信とはTCP/IP全般を指す言葉であり、HTTP通信もソケット通信を行っている。
WebSocketと呼ばれるものはHTTPをアップグレードしたもので、Web上でリアルタイムにやり取りに適している。

DjangoでのWebSockt実装についての記事も投稿予定。

# 参考文献
マスタリング TCP/IP 入門編 第2版

https://www.infraexpert.com/study/networking3.html

https://www.itmanage.co.jp/column/osi-reference-model/

https://www.itmanage.co.jp/column/tcp-ip-protocol/

https://milestone-of-se.nesuke.com/nw-basic/tcp-udp/tcp-udp-summary/

http://research.nii.ac.jp/~ichiro/syspro98/socket.html

https://www.ibm.com/docs/ja/i/7.3?topic=programming-how-sockets-work

https://qiita.com/megadreams14/items/32a3eed4661e55419e1c

https://www.tohoho-web.com/ex/websocket.html

https://qiita.com/south37/items/6f92d4268fe676347160