100日後にエンジニアになるキミ - 49日目 - ネットワーク - 通信について

昨日までのはこちら

[100日後にエンジニアになるキミ - 42日目 - クラウド - クラウドサービスについて](https://qiita.com/otupy/items/d1765f1541a104ed6133)

[100日後にエンジニアになるキミ - 36日目 - データベース - データベースについて](https://qiita.com/otupy/items/7af17635d576677606dc)

[100日後にエンジニアになるキミ - 24日目 - Python - Python言語の基礎1](https://qiita.com/otupy/items/6d1e5453f530e07b7aec)

[100日後にエンジニアになるキミ - 18日目 - Javascript - JavaScriptの基礎1](https://qiita.com/otupy/items/2f71d5f9c754b29d9555)

[100日後にエンジニアになるキミ - 14日目 - CSS - CSSの基礎1](https://qiita.com/otupy/items/61a97863f6df14171994)

[100日後にエンジニアになるキミ - 6日目 - HTML - HTMLの基礎1](https://qiita.com/otupy/items/cd2315dcb38671cfded0)


## 通信について

コンピューターなどにおける通信とは世界中のコンピュター同士をつなぐ事です。

通信を行うためには、通信に参加するもの同士の間で、あらかじめ通信に関する規約を
定めていなくてはなりません。この規約のことを`プロトコル`と言っています。

## プロトコルについて

ざっくりした訳だと`通信規約`です。
プロトコルを定め、それに従うことは、通信を成立させるための基本原理となっています。

また世界中には様々なプロトコルが存在します。
よく使われているプロトコルは以下のようなものがあります。

|層|プロトコル名|内容|
|:--:|:--:|:--|
|アプリケーション層|HTTP(Hypertext Transfer Protocol)|WebブラウザがWebサーバと通信する際に主として使用する通信プロトコル|
|アプリケーション層|FTP(File Transfer Protocol)|コンピュータネットワーク上のクライアントとサーバの間でファイル転送を行うための通信プロトコル|
|アプリケーション層|SSH(Secure SHell)|暗号や認証の技術を利用して、安全にリモートコンピュータと通信するためのプロトコル|
|プレゼンテーション層|SMTP(Simple Mail Transfer Protocol)|インターネットで電子メールを転送するプロトコル|
|トランスポート層|TCP(Transmission Control Protocol)|インターネットにおいて標準的に利用されているプロトコル|


余談ですが映画`ミッション:インポッシブルシリーズ`の第４弾に`ゴースト・プロトコル`というものが出てきます。

`ゴースト・プロトコル`は元のTVシリーズであるスパイ大作戦でお馴染みの
`例によって君もしくは君のメンバーが捕らえられ、或いは殺されても当局は一切関知しないから、そのつもりで`
よろしく、アメリカ政府が非合法の秘密作戦に対して一切の関与を否定する
つまりIMFのと言う組織そのものが存在しない物(ゴースト)だとして扱うという`取り決め（プロトコル）`
だからだそうです。

ハイパー蛇足でしたね。
`プロトコル`の意味合いが把握できれば大丈夫です。
まあこれを機会に`ゴースト・プロトコル`の方も見ていない方は見た方が良いでしょうね。
より言葉に対する理解が深まると思います。

### HTTP(Hypertext Transfer Protocol)について

おそらくはもっともメジャーで普段から気にせず利用している通信です。

`HTML(HyperText Markup Language)`や`XML(Extensible Markup Language) `によって
記述されたハイパーテキストの転送を主な目的としてます。

それ以外にも、バイナリ形式の画像、音声を含め、様々なデータを扱うことが可能です。

この通信を行う代表的なソフトウェアは`WEBブラウザー`で
主に`GET`と`POST`メソッドを用いて通信を行なっています。

#### リクエストとレスポンス

HTTP通信では`リクエスト`と`レスポンス`が発生します。

`リクエスト`はブラウザーを含むクライアントからサーバーへの問い合わせ要求
`レスポンス`はサーバーからの返答結果になります。

ブラウザーでURLを打ち込むとサーバーに対するアクセス要求を行おうとします。
この時のURL部分
`http://hoge.com/?page_id=1`

この先頭にある`http`が`プロトコル`になります。
続く`hoge.com`が問い合わせ先の`ドメイン`になります。

URLが正しければブラウザー側で`リクエスト`を発生させてサーバーにアクセスして情報取得を試みます。

`レスポンス`はサーバーからの返答となるため`HTML`,`XML`,`JSON`,`IMG`など
何かしらのデータとなって返ってきます。


#### GETとPOST

`リクエスト`を行う際の通信の方法にも種類があります、それが主に`GET`と`POST`です。

URLなどにパラメータをつけて送る事ができるのが`GET`通信で
`http://hoge.com/?page_id=1`
この`?`以降の部分がパラメータ値になります。

この場合は様々な情報をパラメータ値としてサーバー側に送る事ができますが
URLを見れば値などが見えてしまうため、間違って送ってしまうと丸見えになってしまいます。

`POST`通信ではそのようなことを防ぐため`リクエストボディ`部に情報を格納して通信を行います。

URL：

```
http://hoge.com/
```

リクエストボディ

```
{ "name":"hoge", "date":"2020/05/08", "page_id":"1" }
```

`WEBスクレイピング`ではHTTP通信を用いて情報取得を行うため
HTTP通信の仕組みを把握しておく事が求められます。

### FTP(File Transfer Protocol)について

主にファイルなどをやり取りする際のプロトコルです。

`用途としてはウェブページ用各種データファイル（HTMLファイル、画像）の
クライアントのパソコンからウェブサーバへのアップロード`
`FTPファイルサーバからクライアントへのファイルのダウンロード`

などに用いられます。

`wordpress`などのCMSを用いてWEBサイトを構築する際などによく使われています。
`FTP`クライアントソフトを用いてサイトを構成するファイルをアップロードしたり
バックアップを取るためにダウンロードしたりする場合に用いられる通信規約になります。

定番の`FTP`クライアントは
`WinSCP`
`FFFTP`
`Cyberduck`
などがあります。



### SSH(Secure SHell)について

SSHとは、安全に通信を行いネットワークに接続された機器を遠隔操作するためのプロトコルです。

SSHを利用するためにはSSHプロトコルを使用する為のソフトが導入されており
サーバー側で`SSHデーモン`,クライアント側で`SSHクライアント`が起動されている必要があります。

LinuxやMacなどでは初めからクライアントが用意されています。

```
(base) otupynoiMac:~ otupy$ ssh -V
```
OpenSSH_7.9p1, LibreSSL 2.7.3

SSHでの接続方法は主に二つ
**1.パスワード認証方式**

パスワード認証方式はデフォルトの認証方式で、ユーザー名とパスワードでログインする方式。
ユーザー名とパスワードは接続先OSのユーザーアカウントの情報が使用される。

sshコマンドで

```
$ ssh ユーザー名@ドメイン
ユーザー名@ドメイン パスワード:
```

と入力してアクセスする。

**2.公開鍵認証方式**

公開鍵と秘密鍵の２つの鍵(キーペア)を使用した接続方式。
サーバーに公開鍵、クライアントに秘密鍵を置いて使用する。
公開鍵認証を使うとパスワード入力なしでログインする事が可能になる

いくつかの手順を追って設定をします。

***クライアントPCでキーペアを作成する***

```
ssh-keygen -t rsa -b 2048 {-f 鍵のパス}
(暗号方式:RSA,鍵長:2048bit)
```
/home/[user名]/.sshディレクトリに以下の秘密鍵と公開鍵が作られる。

秘密鍵：id_rsa
公開鍵：id_rsa.pub

***鍵の保管先***

デフォルトだとログインユーザーの.sshディレクトリにid_rsaという名前で保存される。
鍵の名前や保存先を変えたければ`-f /home/ユーザー名/.ssh/[鍵の名前]`

***パスフレーズ***

未入力だと`無し` , セキュリティー的に問題がない環境なら`無し`でも。

***公開鍵をリモートに転送する***

```
scp /home/ユーザー名/.ssh/id_rsa.pub ユーザー名@ホスト名:~/.ssh
```

***リモートで公開鍵を登録する***

```
ssh-copy-id ~/.ssh/id_rsa.pub
```
公開鍵がリモートの~/.ssh/authorized_keysに登録される。

***公開鍵認証でSSH接続できることを確認する***

```
ssh -i id_rsa ユーザー名@ホスト名
```
鍵の保管先が別ならパスで指定すること


### SMTP(Simple Mail Transfer Protocol)について

インターネットで電子メールを転送するプロトコルです。

SMTPサーバーの設定に必要な項目は以下のようなものがあります。

`サーバー名`
`ポート番号`
`セキュリティ（暗号化）方式`
`認証の有無`

この辺りの設定を把握すればプログラム側からもメールにアクセス可能になります。

pythonでgmailにアクセスするためのコード例は以下のようになります。

```python
import smtplib
smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
smtpobj.ehlo()
smtpobj.starttls()
smtpobj.ehlo()
smtpobj.login(メールアドレス , パスワード)
```

### TCP(Transmission Control Protocol)について

`TCP(Transmission Control Protocol)/IP(Transmission Control Protocol)` とは
`レイヤー3`のIPと`レイヤー4`の TCP/UDP(User Datagram Protocol) を組み合わせて通信を行う
プロトコルのことで現在のインターネット通信の一般的な通信モデルです。

更に上位レイヤー(http, ftp 等)のプロトコルはこの`TCP/IP`通信にカプセル化されて
相手先に情報が送られます。

`TCP`と`UDP`はともにクライアントとサーバ間での通信チャネルの提供通信管理を行う`レイヤー4`のプロトコルです。

`通信チャネル`というのはいわゆる`ポート`というもので`1`番から`65535`番までの番号が使用できます。
同じ`IPアドレス`であっても`TCP`や`UDP`のポートが異なれば提供されるサービスが異なります。

**一般的なポート番号**

|ポート番号|サービス名称|
|:--:|:--:|
|TCP:80番|HTTP|
|UDP:53番|DNS|
|TCP:25番|SMTP|

このポート番号は一般的なものであり、変更することも可能ですが
よく使われるポートに関してはあまり設定をいじることは少ないです。

サーバーとの通信を行う場合は、そのプロトコルとポートの番号の設定を
把握しておく必要が出てきますので、サーバー側の設定を調べておきましょう。


## まとめ

プログラム内で通信を行おうとする際には取り扱う情報ごとに通信規約やライブラリの使い方などが変わってきます。
どの何をどの通信方式でやり取りするのかを把握してコードを書いたりする事が求められてきますので
通信にも色々な仕組みがあることを知っておきましょう。

君がエンジニアになるまであと51日

## 作者の情報
乙pyのHP：
http://www.otupy.net/

Youtube：
https://www.youtube.com/channel/UCaT7xpeq8n1G_HcJKKSOXMw

Twitter：
https://twitter.com/otupython