【勉強用】通信方法やプロトコルを初心者視点から

##免責事項
この記事は初心者視点でザックリとした説明をしています。正確性に欠ける可能性がございますが、ご了承ください。「明らかに違うよ」ということがありましたら、ご指摘くださると幸いです。

##環境
OS：最新版ではないMacOS
VirtualBox：5.2.26
Vagrant：2.2.6
Ubuntu：ubuntu/bionic64 v20181129.0.0


##目次
1. 通信とは
2. 通信をするときのプロトコル（取り決め、約束、ルール）
3. 通信をしてみる

#1. 通信とは
通信とは、送り手（サーバー）が情報を送り、受け手（クライアント）がその情報を受け取ることです。
手紙、電話やインターネットなどが通信です。
その中でも、電話やインターネットは電気を使って通信するために電気通信と呼ばれます。
###通信方法
通信をする方法は2つあります。
1. 回線交換方式 
...電話
2. パケット通信方式 
...インターネット

###サービスの通信方法
サービスを提供する方法は２つあります。
1. Peer to Peer（P2P）
...LINE、Skypeなど
2. サーバー・クライアント 
...メールサーバー、WEBサーバーなど

以上の概念は簡単なので、説明は省略します。

#2. 通信をするときのプロトコル（取り決め、約束、ルール）
####1. TCP/IP
TCP（Transmission Control Protocol）とIP（Internet Protocol）はインターネット通信をするときの取り決めのことです。
TCPは相手との通信が確立してからデータの転送を行う取り決めです。
IPはインターネットを使う上での取り決めです。
TCPとIPの両方を使って通信を行うことをTCP/IP通信と言います。
#####※IPアドレスについて
IPアドレスはパソコン、スマートフォンなどでインターネット通信を行う場合に利用されるインターネット上の住所のことです。
インターネットに接続されたコンピュータはすべてIPアドレスを持っています。

####2. UDP/IP
UDP（User Datagram Protocol）は相手との通信を確立をせずにデータの通信を行う取り決めです。
オンラインゲームなど、高速でやりとりが行われる場合には、TCPのようにいちいち通信の確立を待っていたら、遅くなってしまうため、UDPが使われます。
UDPとIPの両方を使って通信を行うことをUDP/IP通信と言います。
####3. HTTP
HTTP（Hypertext Transfer Protocol）はWebサーバとWebクライアントの間でデータの送受信を行うために使われる取り決めです。
主にWebブラウザを使う際に用いられ、Webページを構成するHTMLファイルやスタイルシート（CSS等）、スクリプト（JavaScript等）、画像、音声、動画などのファイルを、データ形式などのメタ情報を含めてやり取りします。

#####※HTTPSについて
HTTPS（Hypertext Transfer Protocol Secure）はHTTPをより安全に使えるような取り決めです。HTTPをSSL/TLSプロトコルによって安全にしたものと解釈できます。

####4. VoIP
VOIP（Voice over Internet Protocol）はTCP/IP通信を使った音声データを送受信できる仕組みです。取り決めというより技術の仕組みに該当します。
LINEやSkypeなどがその代表使用例です。
####5. FTP
FTP（File Transfer Protocol）はサーバーとクライアント間で、ファイルを送受信する際の取り決めです。
例えば、インターネット上にWEBサイトを公開したいときにWEBサーバーにファイルを置かなければなりません。その際に私たちはFTPクライアントソフトというソフトウェアを使用し、ファイルをWEBサーバーに転送します。WEBサーバー側ではFTPサーバーを使用し、そのファイルを受け取ります。
####6. SMTP, POP3/IMAP
SMTP（Simple Mail Transfer Protocol）はメールを送信する際に使用する取り決めです。TCPが使用されています。
POP3/IMAP（Post Office Protocol / Internet Message Access Protocol）はメールを受信する際に使用する取り決めです。TCPが使用されています。

#3. 通信をしてみる
####TCP/IP通信をしてみる
TCP/IP通信のパケットの様子を見ることができるtcpdumpコマンドを使います。
tcpdumpを使うためには、サーバーとクライアントの両方が必要なので、コンソールウィンドウを2つ用意します。片方をサーバー、もう片方をクライアントとします。

```linux:サーバー側
sudo tcpdump src 好きなURL -X
```
> 今回は、「好きなURL名」から送られてくるパケットを見るという設定です。
・sudoはスーパーユーザ（別のユーザー）としてコマンドを実行することを意味します。なぜ使うのかはわかりません、、、。
・tcpdumpの後のsrcはソースで後にURLが来ることを意味します。
・srcの後には送信元のサイトにしたい、好きなURLを指定します。
※サーバー側のURLにはhttps://などのプロトコルは書かないでください。
・-Xは、詳細にパケットの中身を表示するというオプションです。


クライアント側ではcurlコマンドを使います。

```linux:クライアント側
curl 好きなURL
```
>curl (カール) というコマンドは 「好きなURL名」のWEBサイトの内容をコンソールに表示する、というコマンドです。
オプションがない場合、HTML文字列をそのまま標準出力（コンソール）に表示します。
※クライアント側のURLにはプロトコルを含めて書いてください。

クライアント側では、指定したURLのHTML文字列が表示されると思います。
クライアント側でコンソールではなく、WEBブラウザを使うとWEBブラウザがHTMLを読み取り、綺麗な画面を表示してくれるというわけです。

サーバー側では以下のように、パケットの情報が表示されます。
![スクリーンショット 2019-10-27 17.30.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374924/e74d7aea-b0a1-7a53-7e79-d1b0f2c5f4ca.png)
IP 182.22.25.124.httpsが送信元のIPアドレスで、>の後に隠している部分に送信先のIPアドレスが来ます。
0x0000:  a4d1 8ce6 b764 8857 eee6 c2cd 0800 4500...の部分がパケットです。
以上でTCP/IP通信を行い、そのパケットの様子を見ることができました。

####通信ができているか確認
pingコマンドを使うことで、通信ができているかの確認を行うことができます。
詳しく言うと、パケットを発行し、通信の確認をしたい相手に対して、パケットが届くかの確認をしたり、その応答時間を調査することができるコマンドです。

```
ping www.google.co.jp
```
すると、
![スクリーンショット 2019-10-27 17.53.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/374924/a6917a28-93b1-dabb-7bb3-f8d755d05dd4.png)
と表示され、172.217.26.35 というIPアドレスのコンピューターと通信できていることが確認でき、
64バイトの情報が4.395ミリ秒でこちらに届いたということが確認できます。

##参考
「N予備校 プログラミングコース」
https://www.nnn.ed.nico/
「「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典」
https://wa3.i-3-i.info/index.html
「【入門】FTPとは？通信・ソフトについて分かりやすく解説します」
https://www.kagoya.jp/howto/network/ftp/