テクノロジー

2024年10月1日

    代表的なプロトコル

    代表的な通信プロトコルについて学び、FTP、SMTP、POP、SSH、WebSocketなどの役割や使用方法を理解。各プロトコルがどのようにデータを送受信し、安全な通信を実現するかを詳しく解説します。

    著者プロフィール

    Webエンジニア歴5年以上。現在は、プログラミングスクールのメンターとして、次世代のエンジニア育成にも力を注いでいる。フロントエンドとバックエンドの開発に精通し、日々最新技術を追求しながら、実務経験をもとにした実践的な指導を行っている。スキル向上と学び続ける姿勢を大切にし、初心者から中級者まで幅広くサポートすることを得意としている。

    ゴール

    • 代表的なプロトコルの概要を理解する

    プロトコルを学ぶ

    これまで、TCP、UDP、HTTP、HTTPS、DNSについてみてきました。これらはすべてプロトコルです。
    プロトコルは、コンピュータ同士が通信するための通信規約という約束事(ルール)です。
    TCP/IPというインターネットの中心となるプロトコルを通して、さまざまなアプリケーションを利用するには、そこにさまざまなアプリケーションのプロトコルが関係していることを学習しました。
    プロトコルの説明をするにあたって、もう一度TCP/IPの構成について確認しましょう。

    TCP/IPでは、次のように4つの階層に役割が分かれています。
    上位から下位に対して、カプセル化を通して連携し、それぞれの役割を果たしていきます。

    TCP/IPの階層 役割 対応するプロトコル
    アプリケーション層 アプリケーションの目的を実現 HTTP(Web通信)、SMTP(メール送信)、POP(メール受信)、FTP(ファイル転送)、DNS(ドメイン名変換)など
    トランスポート層 送信時の信頼性の実現や目的の荷物を該当のアプリケーションへ送り届ける(送信元、宛先ポート番号の指定) TCP、UDP(後述)
    インターネット層 送信元から荷物としてのパケットを宛先へ送り届ける(送信元、宛先IPアドレスの指定) IP
    ネットワークインターフェース層 配送手段を提供する 有線、Wi-Fiなどの無線によるLAN、光通信ケーブルなどによるWAN

    インターネットを通して世界中のコンピュータ同士で、アプリケーションの情報をやり取りするために、裏でTCP/UDP、IPが国際郵便システムのような役割を果たしていることについて以前のテキストで説明しました。
    また、そのTCP/IPの荷物(パケット)を運ぶためには、具体的な手段として、ネットワークインターフェース層の有線、無線などのLANやWANを通して、運ばれることについても言及しました。
    ここでも、有線LANのプロトコル(イーサネットなど)やWiFiなどの無線のプロトコル(IEEE802.11シリーズ)などが使われています。

    このテキストでは、アプリケーション層で使用されている代表的なプロトコルについて、いくつか紹介します。

    プロトコル 役割
    FTP ファイル転送のプロトコル
    SMTP メール送信のプロトコル
    POP メール受信のプロトコル
    SSH リモート操作のプロトコル(暗号化付き)
    WebSocket チャットなどの双方向通信のプロトコル

    上記のプロトコルは、いずれも信頼性を必要とするため、トランスポート層のTCPによってカプセル化されます。

    FTP

    FTP(File Transfer Protocol)は、ファイル転送用のプロトコルです。
    たとえば、自分のWebサイトを公開する場合、テキストや画像ファイルなどをWebサーバに転送する必要がありますが、その時につかうプロトコルです。
    ただし、転送する際に、データが暗号化されないというデメリットがあります。そのため、Webサイトが改ざんされるなどのリスクがあります。
    そのデメリットを改善するため、SSH(後述)を使って暗号化するSFTP(SSH File Transfer Protocol)や、SSL/TLS(SSLサーバ証明書を使ったプロトコル)を使って暗号化するFTPS(File Transfer Protocol over SSL/TLS)が主流になっています。

    SMTP / POP

    SMTP(Simple Mail Transfer Protocol)は、メールを送信するためのプロトコルです。
    一方、POP(Post Office Protocol)は、メールを受信するためのプロトコルです。

    メールの送受信の流れを、実際の手紙を郵送する場合と比べてみましょう。

    みなさんが友達に手紙を送る場合を考えます。
    おそらく次のような流れになるはずです。

    Image from Gyazo

    1. 最寄りのポストに入れる。
    2. 郵便ネットワークを通して、相手のポストに届く。
    3. 相手が郵便ポストを確認して手紙を取り出す。

    メールの送信も同じような流れになります。
    インターネットのメールでは、ポストに当たるのがメールサーバのメールボックスです。

    Image from Gyazo

    1. メールを自分の契約している送信メールボックス(メールサーバ)に送る(SMTPプロトコルを使用する)。
    2. メールサーバは、メールの宛先を確認し、TCP/IPの国際郵便システムによって、相手の契約している受信メールボックス(メールサーバ)へ届ける(SMTPプロトコルを使用する)。
    3. 相手は、メールボックスを確認し、メールを受信する(POPプロトコルを使用する)。

    この流れの中で、メールサーバに届けるときにSMTPが使われ、メールをダウンロードする時にPOPが使われます。

    先ほど「POPを使ってメールをダウンロードする」と説明しましたが、Gmailのようなクラウドサービスでは少し変わります。
    メールのクラウドサービスの場合、メール本文はクラウド上にあります。
    通常は、クラウド上にあるメール本文をインターネットを経由して閲覧、編集、削除します。

    ただし、そのメールの設定画面でPOPの設定をすると、手元のPCや端末にメール本文をダウンロードすることが可能になります。

    Image from Gyazo

    なお、受信用のプロトコルは、改良を重ねた結果、POP3(Post Office Protocol version 3)が使われています。

    SSH

    SSH(Secure Shell)は、強力な暗号化方式を使用し安全に、遠隔のコンピュータ(リモートコンピュータ)と通信(暗号化されたリモート操作)するためのプロトコルです。

    暗号化方法

    公開鍵暗号方式と共通鍵暗号方式を組み合わせたハイブリッド暗号方式を使用します。

    接続方法(ログイン方法)

    パスワード認証方式 / 公開鍵認証方式の2通りがあります。パスワード漏洩のリスクがあるため、公開鍵認証方式が一般的に使用されます。
    公開鍵認証方式は、公開鍵暗号方式を本人確認の認証に利用する方式です。
    公開鍵暗号方式では、暗号化に利用する対となる秘密鍵、公開鍵を生成します。鍵は、数字、アルファベット、特殊文字の組合せからなる一定の長さのデータです。(ssh-keygenというコマンドで生成できます)
    生成された鍵は、次の特徴を持ちます。

    • 秘密鍵で暗号化した情報は、公開鍵でしか復号化できません。
    • 公開鍵で暗号化した情報は、秘密鍵でしか復号化できません。

    秘密鍵は、その名の通り、鍵作成者が秘密にしておく鍵です。
    公開鍵は相手に渡すため、たとえ、その鍵が盗まれても、公開鍵で暗号化したものを見れるのは、秘密鍵を持つ鍵を作った本人だけです。
    一方、秘密鍵で暗号化した情報を相手が公開鍵で復号化し検証することで、鍵作成者本人であることを確認できます。
    この特徴を利用して、接続者(ログイン者)の認証を行うのが公開鍵認証方式です。

    公開鍵認証方式

    【事前知識】

    • ssh-keygenというコマンド(詳細は割愛)を使うことで、秘密鍵と公開鍵(いずれも数字とアルファベットの羅列)のペアを作ります。
    • 秘密鍵で暗号化した情報は、公開鍵でしか復号化できません。
    • 公開鍵で暗号化した情報は、秘密鍵でしか復号化できません。
    • 鍵のかかった南京錠を相手に渡し、その相手が鍵を使って解錠するようなイメージととらえてください。

    【認証方法】

    1. 認証を受けるクライアントが事前にサーバ側に自分の作った公開鍵を渡しておく。(①)
    2. 認証を受けるときに、秘密鍵で暗号化した情報をサーバに送る。(②)
    3. サーバは、受け取った情報を事前に取得している公開鍵で復号化することで本人であることを認証する。(③)

    Image from Gyazo

    実際の通信の暗号化では、共通鍵暗号方式の共通鍵を利用します。
    これは、公開鍵暗号方式に比べて処理が速いためです。お互いに暗号化・復号化に同じ鍵を使用します。
    ただし、この共通鍵を相手に渡すときに盗聴されるリスクがあるため、鍵の受け渡しに公開鍵暗号方式を利用します。これがハイブリッド暗号方式の意味です。
    公開鍵暗号方式で共通鍵を受け渡すときには、公開鍵を持つサーバ側が共通鍵を生成し、公開鍵で暗号化し、秘密鍵を持つクライアントに送ります。
    共通鍵を復号できるのは、秘密鍵を持つクライアントだけです。
    以降、相互に共通鍵を使って暗号化・復号化が行えます。

    WebSocket

    WebSocketは、クライアントとサーバ間でリアルタイム・双方向通信を実現するためのプロトコルです。

    クライアントとサーバ間は、HTTPというプロトコルでやり取りをしています。
    HTTPでは、クライアントからリクエストを送り、サーバからレスポンスが返ってきて完結します。通信を始めるのはあくまでクライアント側であることが特徴です。

    ところが最近、SNSの普及により、サーバ上の特定の情報が更新された時点で、クライアントの画面を即座に変更する「リアルタイム・双方向通信」の必要性が生まれたのです。これは、HTTPでは実現できません。

    そこで開発されたのがWebSocketです。WebSocketを使うと、リクエストからレスポンスまでを一度実施することで、そのあとは接続しつづけます。さらにサーバからクライアントにも通信ができるようになりました。

    WebSocketは、チャットやオンラインゲームなどのサービスで活躍しています。

    Image from Gyazo

    HTTPの進化

    他に知っておくべきプロトコルとして、HTTP/2、HTTP/3があります。
    いずれもHTTPの進化系です。クライアントとサーバ間のやりとりを効率化し、情報伝送の高速化を目指して設計されました。

    まとめ

    • FTPはファイル転送用のプロトコルであり、セキュリティ強化のため、SFTPやFTPSが利用されている。
    • SMTP / POPは、メール送受信用のプロトコルである。
    • SSHはリモートコンピュータとの安全な通信のためのプロトコルであり、公開鍵暗号方式に基づく暗号化と認証方式が使われている。
    • WebSocketは双方向通信のためのプロトコルであり、チャットやオンラインゲームで活用されている。

    関連記事

    Webアプリケーションを支えるサーバの種類
    ポート番号とは

    ディープロで学んでみませんか?