Webサイトの閲覧なども含め、私たちが普段利用しているコンピューターのプロトコルは、「ステートフル」か「ステートレス」どちらかの性質に大別できます。両者の違いはかなり根本的なところにありますが、知識として身につけている人は意外と少ないようです。そこで本記事では、ステートフルとステートレスの違いについて解説します。
ステートフルとは
「ステートフル」とは何か確認するにあたって、まずは言葉の意味から見てみましょう。ステートフル(stateful)のステート(state)とは「状態」や「状況」を意味する言葉です。そして、フルとは、「ビューティフル」などの単語にも見られるように、「~に満ちた」という意味を付与する接尾辞です。つまりステートフルとは、言語的に「状態を維持すること」を意味します。ここから転じて、IT用語におけるステートフルという言葉は、以前のセッション状態を保持して、その後の処理結果に反映させる通信プロトコルやアプリケーションを指して使われるのです。
身近な例を挙げると、オンラインショップのショッピングカート機能はステートフルなシステムの典型例と言えるでしょう。私達はオンラインショップ内で商品名を検索したり、ナビゲーションをクリックしたりして、購入したい商品を探します。
しかしその際、商品をその都度一つひとつ決済したり、気に入った商品をメモしなくてはいけなかったりしたら、ひどく不便でしょう。それゆえ、オンラインショップ内には通常、気に入った商品をショッピングカートなどに一時保存しておいて、後で再度閲覧したり、ほかの商品とまとめて注文したりする機能が備え付けられています。
このように、以前にユーザーが操作した情報を保存しておいて、後でその情報をそのまま活用できる状態にしておくのがステートフルなシステムです。
ステートフルなプロトコルのメリットは、ショッピングカートの例に見られるように、以前の操作を保持・反映できるため、すべての操作をスムーズに完結させられることです。しかしその一方で、データを保持する必要があるため、多数の人が共用するようなシステムでは負荷が重くなります。特にサーバーが複数台ある場合は、状態が変わるごとに情報を同期しないといけないなどのデメリットもあります。
ステートフルなプロトコルの例
ステートフルなプロトコルの主な例としては、「FTP」「TCP」「SSH」などが挙げられます。
FTPとは、サーバー上でデータのアップロードやダウンロードをしたり共有したりするために使われる、ファイル転送プロトコルです。
TCPはWebサイトの閲覧やメールの送受信、あるいはファイルの転送の際などに使われる通信プロトコルです。
SSHは、サーバーへの安全な接続手段として、ネットワーク上で接続された機器を遠隔管理する際、通信内容を暗号化し安全性を高めるために使われます。
ステートレスとは
ステートレス(stateless)の「レス」とは、「不足していること」「乏しいこと」などを意味する接尾辞です。つまりステートレスとはステートフルとは正反対の意味を持っています。
ITにおいては、前後の状況に応じて処理の仕方をさまざまに変えるステートフルなプロトコルに対して、以前のセッション情報を保持せず、「前後の状況に関係なくその都度いつも同じレスポンスを返すようなプロトコル」がステートレスと言われます。
例えばWebサイトへの通信の際に使われる「HTTP」というプロトコルはステートレスの典型例です。私達は通常、「http://」ないしは「https://」から始まるURLを用いてWebサイトに接続しますが、あるWebコンテンツを表示するためにはいつも同じURLを使用してアクセスします。
Webサイト管理者がそのコンテンツを削除したり変更したりしない限りは、何度やっても、誰がどのマシンでやっても、表示されるのは同じWebサイトです。このようにステートレスなシステムは、その都度行われる入力と出力という一対一の関係のみで成り立っており、自動販売機の仕組みに例えられることもあります。
このようにいうと、ステートレスはステートフルに比べて、融通の利かない不便なプロトコルに思えるかもしれません。たしかにステートフルなプロトコルの方が、操作を簡潔に済ませられる分、利便性を実感しやすい側面はあるでしょう。
しかしステートレスなシステムは上記のようなデメリットを持つ一方で、「以前のセッション状態を保持・反映しないという単純な構造ゆえに負荷も少なく、自己完結性や再現性に優れている」というメリットも持っています。
ステートレスなプロトコルの例
ステートレスなプロトコルの主な例としては、「HTTP」「UDP」「DNS」などが挙げられます。
HTTPは上記で説明したように、主にWebサイトにアクセスするときなどに使われる通信プロトコルです。
UDPは、音声通話やビデオ通話、動画ストリーミングなど、リアルタイム性を重視したデータの送受信をする際に使われる通信プロトコルを意味します。
DNSはインターネット上の住所に相当する「ドメイン」と、個々のコンピューターを識別する「IPアドレス」を紐づけて管理・運用するためのプロトコルです。
ステートフルとステートレスの違い
ここまでの説明を踏まえて、ステートフルとステートレスの違いを改めてまとめてみましょう。両者の大きな違いは、以前の状態(ステート)を「保持する/保持しない」という点にあります。
ステートフルなら以前の状態を保持したまま以後の処理に役立てますが、他方ステートレスでは以前の状態を保持せずにその都度の処理を要求するのです。
ステートフルとステートレスの違いは、人間の性格によく例えられます。例えば店員に例えた場合、ステートフルな店員は、来客の顔をよく覚えて、常連客が「いつものやつをお願い」というだけで、阿吽の呼吸で該当の商品を差し出してくれるでしょう。対してステートレスな店員の場合は、常連も初顔も関係なしに接客し、常連客から「いつもの」と言われても、「ちゃんと商品名を言ってくれませんか?」と、正式な注文を要請します。いわゆるお役所仕事的な対応をするのがステートレスな店員です。
このように接客業に例えると、ステートフルな店員の方が断然気の利くよい店員に思えますが、実際には両者は一長一短があります。例えば、いくら常連客だからといって、貯金を引き出しに来た顧客に対して銀行員が何の本人確認もなしに出金許可を出したら、それはそれで批判を免れないでしょう。これはプロトコルの種類においても同様であり、ステートフルの方がいいか、ステートレスの方がいいかは場面によって変わるものだと言えます。
まとめ
この記事では、ステートフルとステートレスについて、それぞれの特徴や違いを解説しました。両者には、以前のセッション状態を「保持する/保持しない」という大きな違いがあります。これにより、良くも悪くも「融通の利きやすさ」に違いが生まれますが、重要なのは用途や場面に応じてどちらのプロトコルを選択するかということです。