聞かれて困ったIT用語 – 「プロトコル」

社員のharaiです。Atomエディタが好きです。社内ではアンケート分析システムを作っています。

弊社ではインターン生を受け入れています。彼らはみな一生懸命で、分からない言葉を聞くと、それがどういう意味なのかすぐ質問してくれます。その中には、日常的に使う用語でありながら私自身も正確な意味を理解しているか怪しいものが数多くあり、自分の無知に改めて気付かされます。

「プロトコルって何ですか?」

「プロトコル」もそうした用語の一つです。質問はそれにとどまらず「HTMLはプロトコルですか?」「APIとプロトコルはどう違うんですか?」と続きます。そこで、私も初心にかえって考えてみることにしました。

ウェブ系の技術者にとって、プロトコルといえばHTTP(Hypertext Transfer Protocol)やTCP(Transmission Control Protocol)、IP(Internet Protocol)がなじみ深いと思います。この普段何気なく使うプロトコルとは一体何なのでしょうか?プロトコルとプロトコルでないものの違いは何なのでしょうか?

「プロトコル」の元の意味

プロトコルという用語はインターネットを始めとした通信の世界でよく使われますが、新しい言葉ではなく、外交の世界で昔から使われていました。

複数の国が集まる場では、異なる言語や宗教を持つ外交官たちが、お互い誤解を招くことなくコミュニケーションしなければなりません。そこで、お互い守るべき最低限の慣習が作られていきました。それがプロトコルと呼ばれるものです。Wikipediaのプロトコルの項目では「列席者の序列、国旗の取扱い、式例の進行手順、参列者の服装」などがプロトコルの例に挙げられています。

ITの世界での意味

ITの世界では、プロトコルはこのような意味の類推で「さまざまな通信機器間で通信を行う際のルール、手順」という意味で使われています。

各々の通信機器、たとえばWindowsやMacが動いているマシンは、それぞれ異なるルールで動作しています。ソフトウェアにWindows用のものとMac用のものがあることが、それを端的に示しています。ですから、通信しようとLANケーブルをつないでも本来は通信できないはずです。しかし実際には、設定さえ行えばお互いデータのやりとりを行えます。それはなぜかというと、双方とも同じプロトコルをサポートしているからなのです。

USBメモリはプロトコルか?

ここで疑問が生じます。USBメモリは普通WindowsでもMacでもそのまま差し込んでデータの読み書きが行えます。それでは、これもプロトコルと呼べるでしょうか?

同じUSBメモリがさまざまなOS間でデータをやりとりするために利用できるのには大きく2つの理由があります。まず、どちらもUSB(Universal Serial Bus)という規格に対応していること。もうひとつは、どのOSも共通のファイルフォーマット(多くはFAT32)に対応していることです。

これらは、ネットワークにおけるTCP/IPのようなものに似ていなくもありませんが、プロトコルとは呼べません。なぜなら、WindowsとMacが直接通信しているのではなく、データのやりとりに人の手を介しているからです。人の意思ひとつで、別の「あるマシン」にコピーするためにUSBメモリに書き込んだデータを、消去したり、そのまま保管したり、別のもうひとつのマシンにコピーしたりと自由自在です。プロトコルは通信を行う際のルールという意味でしたが、USBメモリはそのような操作にはまったく介入することができず、受動的に動作するのみです。これを通信と呼ぶには無理があります。したがって、USBメモリはプロトコルではありません。

もっとも、一般的なネットワークを介した通信でも外部の影響を受けることはあります。通信に電気的なノイズが混じって0が1に変わるかもしれませんし、中間にある機器が故障してしまうかもしれません。しかしそれでも、その通信に用いるルールはプロトコルと呼ぶことができます。なぜなら、プロトコルは最終的な目的、つまりマシン同士のデータのやりとりを意識した上で、その障害となる外部の影響をどう扱うかについても考慮しているからです。これは、USBメモリ本体へのデータの読み書き自体が最終的な目的となっており、その後そのデータがどう扱われるかについては関知しないUSBメモリとは対照的です。

ただし、USBメモリとマシン間で行っていることはまさに通信であり、そのルールはプロトコルと呼べます。実際、WikipediaのUSBの項目には

USB, short for Universal Serial Bus, is an industry standard developed in the mid-1990s that defines the cables, connectors and communications protocols used in a bus for connection, communication, and power supply between computers and electronic devices.

という記述があります(強調は筆者)。ウェブ系の技術者にとって通信といえばインターネットのことなので、この用法には違和感を持つ方も多いかもしれません。しかし、どちらも通信であることは同じなので一貫性の観点からもプロトコルと呼んで問題ないでしょう。

HTMLはプロトコルか?

webブラウザは、HTMLを読み込むことで多種多様な情報を画面に表示させます。それでは、HTMLはプロトコルでしょうか?

Wikipediaの通信プロトコルの項目にはプロトコルの一覧が載っており、その中には(この記事執筆時点では)HTMLも含まれています。しかしながら、HTMLはプロトコルとは呼べないように感じます。

プロトコルとは通信を行うルールです。たとえば、HTTPは「リクエスト」と「レスポンス」のやりとりで、データが存在するか、キャッシュを利用できるかなどの情報をやりとりし、必要に応じてHTMLなどのデータを通信します。HTTPは、単にリクエストとレスポンスの書式だけを標準化しているのではなく、不確実で時間がかかることも多いという通信特有の問題にどう対処するかまで含めて練られた結果でき上がったものなのです。これは、一般的にプロトコルと呼ばれているもの全てに共通するでしょう。しかし、HTMLには通信の部分が完全に欠落しています。HTMLの特徴はタグとリンクにありますが、タグは文書構造を示すだけでWord文書と本質的な違いはありません。リンクはさらなる通信のきっかけとなるものですが、それは単なるきっかけに過ぎず、それ以上の通信の部分はHTTPが担当します。

もし、HTMLをプロトコルと呼ぶと、おかしな問題が起こります。HTMLがプロトコルであるのなら、JPEGPNGもプロトコルになるでしょう。そればかりか、PDFMP3、さらには文字コードのUTF-8など、ありとあらゆるデータ形式をプロトコルと呼んでいいことになってしまいます。これでは、プロトコルという言葉が何のために存在するのか分かりません。

したがって、いずれにしてもHTMLはプロトコルではないとすべきでしょう。少なくとも、HTMLを指してプロトコルと呼ぶような状況はないはずです。

XMLはプロトコルか?

HTMLと似たマークアップ言語にXMLがあります。HTMLがプロトコルでないなら、XMLもプロトコルではないのでしょうか?

この問題は少し複雑です。まず、XMLそのものはプロトコルではありません。しかし、XMLを利用したプロトコルを設計することは可能です。実際、SOAPというウェブサービスのためのプロトコルはXMLを用います。これは、電流やビット列そのものはプロトコルではないが、ほとんどの通信プロトコルがそれらの上に成り立っているという構造と比較して考えると、納得しやすい概念だと思います。

HTMLは文書の構造を表すための言語なので、それ自身がプロトコルになることはありません。一方、XMLはデータ構造を表す汎用的な言語です。汎用的な言語なので、数式の構造や複雑な図形を表すために使ったり、さらにはHTMLと同等の文書構造を表すために使うこともできます。ですから、XMLを使ってプロトコルを作ることもできてしまうのです。

プロトコルとAPIはどう違うか?

プロトコルと似た概念にAPI(Application Programming Interface)というものがあります。APIとプロトコルは一体どのような関係なのでしょうか?

APIも、異なるもの同士のコミュニケーションを橋渡しするという点ではプロトコルと同じです。たとえば、GitHub APIを使えば、GitHub内部のしくみに関係なく全然違うしくみのマシンからGitHubのサービスを利用できます。

APIとプロトコルの違いはその着眼点にあります。APIが、それが可能にする「機能」に着目してそう呼ばれるのに対して、プロトコルはマシンやサービス同士の通信を「どう可能にするか」に着目してそう呼ばれます。つまり、「こんな機能もプログラムから使えるようにしたぜ!」と主張できるものならAPIと呼ばれることになり、「こんなルールでみんながコミュニケーションできるようにしたぜ!」と主張できるものならプロトコルと呼ばれることになるのです。そのためか、APIと呼ばれるものはGitHubやFacebook、Googleなど企業の製品の規格である傾向が強い一方、プロトコルと呼ばれるものはOAuthOpenIDなどオープン化された規格である傾向があります。

「共通語」以上の意味

プロトコルという概念が難しいとしたら、それは単なる「共通語」との区別が付きにくいからではないかと思います。

クロスプラットフォーム化が進んだ昨今、ある形式が複数の種類のマシンで使えるのは当たり前になっています。前述のHTMLやJPEGなどのデータだけでなく、JavaのバイトコードRuby, JavaScriptなどのプログラム、USBやHDMIなどの物理的なインタフェースもそうです。プロトコルもそのような「共通語」の一つですが、意味はさらに限定されます。プロトコルは複数の種類のマシンで使えるというだけではなく、まさに使うためのものであり、その通信に伴って生じる問題を解決、緩和するためのものなのです。これは、プロトコルの原義に照らしても、実際の用法に照らしても納得できると思います。

用語は変化する

言葉の意味は時代とともに変わります。これはITの用語も同じです。

たとえばAPIという用語は、昔は「プログラム内のライブラリにおける、『隠蔽された実装ではなく』別のコードからアクセスを受けるために公開された仕様」を指していました。ところが今では「ウェブサービスにおける、『人ではなく』プログラムからの操作を受け付けるためのインタフェース」という意味も持つようになっています。つまり、比較対象が「隠蔽された実装」から「人」に変わったのです。

Facebookが主体となって策定した仕様にOGP(Open Graph protocol)というものがあります。これはHTMLにクローラ用のメタデータを埋め込む際の仕様ですが、"protocol"という言葉がついています。ここまで議論した結果から言えば、HTMLがプロトコルでないのと同様の理由で、これもプロトコルとは認められません。実際、類似の仕様にSchema.orgTwitter CardsMicroformatsなどがありますが、いずれもプロトコルとは名乗っていません。

しかし、もしそのような使い方が今後普及していくのなら、定義を変える必要があります。

皆さんは、何がプロトコルだと思いますか?