【備忘録】通信プロトコル

# プロトコルって何？
異なるデバイスやシステム，ソフトウェア等が相互に通信するためのルール

コンピュータは通信を実現するための一連のプロトコル群を1つのモジュールとして実装している
このモジュールはプロトコルスタック，プロトコルスイートと呼ばれる

プロトコルスタックの実装はOSによって異なるが、OSI(Open System Interconnection)参照モデルを用いて統一的に表現できる

# OSI参照モデル
- アプリケーション層：それぞれのアプリケーションの中で通信に関するプロトコルを定める
- プレゼンテーション層：アプリケーション固有のデータフォーマットをネットワーク共通のフォーマットに変換
- セッション層：アプリケーションレベルで送受信かんにおける通信接続を管理
- トランスポート層：コネクションを確立，切断し，アプリケーションの要求に応じた方法でデータを転送
- ネットワーク層：アドレスの管理や経路を選択し，宛先までデータを届ける
- データリンク層：物理的に接続された2つの機器間での通信を提供
- 物理層：情報ビット列を電気/光の信号に変換し，物理媒体を通して情報転送

# TCP/IP
TCP/IP(Transmission Control Protocol/Internet Protocol)はインターネット通信およびイントラネット通信において最も利用されている通信プロトコル
IP通信で使用するプロトコル群(IP, ICMP, TCP, UDP, HTTP, SMTP, SSH, TELNETなど)を総称してTCP/IPと呼ぶ
プロトコル群のうち中心的な役割を果たすのがTCPとIPであることからTCP/IPと呼ばれるようになった

## TCP/IPの階層モデル

TCP/IPにおける階層モデルは4階層で構成される
- アプリケーション層：OSI参照モデルのアプリケーション層，プレゼンテーション層，セッション層
 => HTTP, SMTP, POP3, FTP, SSH, RIP, SNMP, ...
- トランスポート層：OSI参照モデルのトランスポート層
 => TCP, UDP
- インターネット層：OSI参照モデルのネットワーク層
 => IP, ARP, ICMP, OSPF, ...
- ネットワークインターフェース層：OSI参照モデルのデータリンク層，物理層
 => Ethernet, PPP, ...

### アプリケーション層
主にアプリケーションごとの固有規定
HTTPなどのアプリケーション層のプロトコルにより，通信アプリケーションの機能が実現される

### トランスポート層
主にノード間のデータ転送の信頼性を確保するための規定
TCPまたはUDPを使用する
TCPの場合，信頼性の高い通信を実現し，UDPの場合，信頼性でなく効率重視のデータ転送を実現する

### インターネット層
主にネットワーク間のend-to-endの通信のための規定
IPが代表的なプロトコルになる
IPによりネットワーク上のノードに対し自分の位置情報となる論理アドレス(IPアドレス)を割り当てる

### ネットワークインターネット層
主に直接接続されたノード間の通信のための規定
LANプロトコルはEthernet，WANプロトコルはPPPが代表的なプロトコル
Ethernetはセグメント上のノードに対して，自分の位置情報となる物理アドレス(MACアドレス)を割り当てる
これによりローカルでのノード間通信が実現する

# TCP
TCPはネットワーク層のIPとセッション層以上のプロトコル(HTTP, FTP, ...)の橋渡しをする形で動作する
コネクション型通信であり，送受信を行う機器間で通信開始と終了を確認する
データ転送時に送信側はデータを転送し，受信側はそれに対する確認応答であるACK(Acknowledgement)を返すことによって，両端のホスト間でデータが届いたかどうかを確認しながら確実にデータ転送を行う

データの送信単位にはデータ部とヘッダ部があり，ヘッダは各階層ごとにフォーマットが規定されている
TCPでは両ホストはトランスポート層のヘッダのみを参照し，通信のやりとりを行う
この送信単位のことを「セグメント」と呼ぶ

TCPのヘッダには「セグメントが何番目まで送られたか」を示すシーケンス番号や，「何番目までを受け取った/次は何番目が欲しい」を示す確認応答番号，「受信可能なセグメント量」を示すウィンドウサイズ等のフィールドが用意されている

TCPは通信する両者が同時にデータを送受信可能である全二重通信を提供するが，ネットワークの状況によっては宛先へ到着するセグメントの順番が入れ替わったり，消失してしまったりすることがある

この問題を解消するために，TCPはシーケンス番号によるセグメントの順序制御や消失したセグメントの再送制御，ネットワークの混雑を回避する送信セグメント量の制御をする
これによりend-to-end間の信頼性の高い通信を実現する

# IP
IP(Internet Protocol)はインターネット上でコンピュータ同士が通信を行うために定められた規定
通信相手を特定するためのIPアドレスに基づいてパケットを宛先のネットワークやホストまで届けるためのプロトコル

IPは論理アドレス(IPアドレス)を各ノードに割り当てることで，各ノードを識別することができる

# TCP/IPにおけるアプリケーション層
アプリケーション層のプロトコル
HTTP：Webブラウザで利用
SMTP/POP3：電子メールソフトで利用
DHCP,DNS：アプリケーション通信を行う準備のためのプロトコル

# HTTP
HTTP(Hyper Text Transfer Protocol)はHTMLなどのテキストファイル，画像，その他の複合ファイルを効率的にクライアントへ配布するためのプロトコル
HTTPは単にリソースの送受信を行うプロトコルにすぎず，画像の生成/表示はHTMLやWebブラウザにおける仕様である

## 基本構文
- スタートライン
- ヘッダフィールド
- メッセージボディ

### スタートライン
リクエストやレスポンスの内容が含まれるフィールドである
リクエストの場合リクエストライン，レスポンスの場合はステータスラインとも呼ばれる

#### リクエストラインの構成

- メソッド
GET:
サーバーに情報を要求する．変数をスタートラインに含めて送信するため，ブックマークやプロキシサーバーなどの通信ログに変数の値が見えてしまう問題がある
POST:
サーバーに情報を要求する．変数をメッセージボディに含めることから，GETメソッドの問題を防ぐことができる
HEAD:
サーバーに情報を要求するが，HTTPのみでメッセージボディは要求しない．
GETメソッドよりも通信量を減らせることから，状態監視などで利用される
CONNECT:
プロキシサーバーに指定した通信を透過的に通すように要求する．
Webサーバーと直接HTTPS通信を行いたい場合などに利用される

- リクエストURI
リクエストURIはメソッドの対象が記述され，リクエストターゲットとも呼ばれる．
通常のWebアクセスではHostsヘッダなどで接続先のサーバーが指定されるため，パス名やファイル名のみが指定されることが多い．
一方で，プロキシサーバーを経由する場合は接続先を明記するため"http://"から指定される

- HTTPバージョン

#### ステータスラインの構成
- HTTPバージョン
- ステータスコード
ステータスコードはリクエストの処理結果をクライアントに通知する
3桁の数字で構成され，処理結果をカテゴライズする
1** : 通知
リクエスト処理中になんらかの情報をクライアントに通知したい場合に送信される．リクエストの処理は継続される
2** : 成功
リクエストの処理が成功した場合に送信される
3** : リダイレクト
転送先を案内する場合に送信される
新サイトに誘導したい場合や自動的にトップページへ遷移させたい場合などに利用される
転送先はLocationヘッダで指定される
4** : 失敗(クライアント)
クライアント側が原因でリクエストの処理が失敗した場合に送信される
5** : 失敗(サーバー)
サーバー側が原因でリクエストの処理が失敗した場合に送信される

- 説明文

### HTTPのセッション維持
HTTPはリクエスト・レスポンスをやりとりして通信を行うが，やりとりした情報はリクエスト・レスポンス間で引き継ぐことができない
そのため，複数のリクエスト・レスポンスで情報を引き継いで処理したい場合はセッションを維持するための仕組みが必要となる
これにはCookieを利用するのが一般的である

Cookieがサーバーとやりとりした情報をクライアント側に保持させ，その情報を用いてリクエスト・レスポンス間で情報を引き継ぐ
Cookieはサーバー側からSet-Cookieヘッダが送信されることでクライアント側に保持される
一方でクライアント側はリクエスト内のCookieヘッダにCookieの情報を含めることで保持している情報をサーバー側に通知する

#### Set-Cookieのパラメータ
- name
クライアント側のCookieに保持させる変数名と値を指定

- domain
Cookieを利用できるドメインを指定
複数のサブドメインでCookieを利用したい場合に指定
指定がない場合はそのホストのみで利用できる

- secure
HTTPSを利用した通信でのみCookieのやりとりを認める
指定がない場合はHTTPでもやりとりがされるため，セキュリティ上必須のパラメータ

- httponly
HTTPやHTTPSの通信でのみCookieのやりとりを認める
javascriptでのやりとりを防ぐことができるため，セキュリティ上指定することが望ましい

## 参考ページ
[ジャパンセンサー株式会社 通信プロトコルとは何ですか？【電気一般について】](https://www.japansensor.co.jp/faq/938/index.html)
[エンジニアhub TCP/IPをわかりやすく - 通信プロトコルの基礎知識を図解で学ぼう](https://eh-career.com/engineerhub/entry/2020/02/13/103000)
[TCP/IPをはじめから](https://www.infraexpert.com/study/tcpip.html)
https://dsk.or.jp/dskwiki/index.php?インターネットプロトコル
[一般財団法人情報通信振興会 インターネットプロトコル](https://www.infraexpert.com/study/tcpip1.html)
[ネットワークのおべんきょしませんか？ TCP/IPの概要](https://www.n-study.com/network-architecture/tcp-ip-layer/)
[@IT HTTP](https://www.atmarkit.co.jp/ait/articles/0103/02/news003.html)
[ThinkIT アプリケーションプロトコル「HTTP(HyperText Transfer Protocol)」のポイント](https://thinkit.co.jp/article/15143)