はじめに
2000年代初頭、チャットアプリのアイデアが形になり始めた頃、XMPPは開発者がインタラクティブなチャットアプリを構築するのを可能にしていました。その誕生以来、大きく進化し、WhatsAppなどの高機能チャットアプリの開発に推奨される技術スタックに組み込まれるようになりました。
20年以上経った現在でも、このプロトコルはその輝きと重要性を失っていません。なぜXMPPが今なお時代に即しているのか、その要点を詳しく見ていきましょう。
XMLをベースにしたプロトコルで、オープンな通信規格として利用されることが多いです。簡単に申し上げると、データなどの必要なXML要素を途切れることなく送受信できるチャットプロトコルです。インスタントメッセージや即時の会話を実現するだけでなく、連絡先の管理やステータス情報の確認にも利用されます。
XMPPは、2点間で直接メッセージを交換する際、ユーザーの状態確認やサーバへの状態情報の共有に利用されます。また、サーバの状態管理、購読管理、連絡先リストの更新、特定ユーザーのブロックなども行います。
構造面では、XMPPはアプリ層で動くプロトコルと多くの共通点があります。例えば、固有の名前を持つクライアント同士がサーバを介して通信します。XMPPは、双方にプロトコルを適用しながらルーティングを管理します。
上図はXMPPのアーキテクチャを分かりやすく示しています。
しかし、複雑な実装では複数のXMPPゲートウェイが存在する場合もあります。この場合、プロトコルは複数のドメインをまたぐ通信をも管理する必要があります。したがって、ゲートウェイは情報交換の際、さまざまなプロトコルやドメイン間の仲介役となります。
さらに、XMPPゲートウェイは、必要なプロトコル変換を実施しながら、クライアントとサーバ間のセッションの開始や終了の制御なども行います。
多数のゲートウェイやドメインを用いても、XMPPを利用することで、全てのネットワークポイント間で安定した接続が可能となります。
XMPPのアーキテクチャを理解するためには、いくつかの用語を把握しておくことが重要です。
例えば、XMPPのスタンザについて理解しておく必要があります。これらは、通信セッションを開始するために用いる小さなXML断片で、3種類に分かれます:
XMPPの全ての処理は、クライアント・サーバモデルに基づいており、まずサーバに、次にクライアントにメッセージを送信します。
どのクライアントがメッセージを受け取るかを判断するため、XMPPサーバは受信者の固有IDを利用します。この固有ID(Jabber ID)は、ほぼメールアドレスに似ています。
Jabber IDの形式は user@domain.com/resource となります。
ここで、userはユーザー名、domain.comは送信者のドメイン情報、resourceは受信者の機器の種類を示します。例として、
JohnDoe@technology.testing/terminal.
この例では、JohnDoeがユーザー名、technology.testingがドメイン名、terminalが使用している機器の種類を示します。resourceは任意ですが、前の2つは必須です。
XMPPサーバは、TCP接続上で正確にメッセージをルーティングするためにこのJabber IDを利用します。通信セッションが開始されると、XMLストリームがサーバに送られ、Jabber IDによってクライアントが識別されます。
識別が完了すると、サーバは要求を受け取り、別のXMLストリーム送信要求を開始します。そのストリームがサーバ側からクライアントに送り返され、双方向のXMLストリームが成立します。
XMPPはフェデレーションと呼ばれる大規模なメッセージネットワークを効率的に構築できます。フェデレーションを利用することで、クライアントは複数のXMPPサーバと同時に通信が可能です。
XMPPを他のプロトコルと区別する基本的な特徴は、以下の通りです:
XMPPでは、連続して非同期にメッセージを送信することが可能です。つまり、受信者や送信者の応答を待たず、ユーザがオンラインでなくてもメッセージが送信されます。メッセージは、メタデータ、本文、送受信者の固有IDなどを含むXMLスタンザという単位でやり取りされます。
XMPPが他のクライアント・サーバシステムと異なる点は、ポーリングを採用していないことです。ポーリングとは、クライアントが定期的にサーバに新情報の有無を問い合わせるプロセスですが、これを行うと即時の通信ができず、帯域幅の大幅な消費にもつながります。
むしろ、XMPPは前回の要求が処理されていなくても、最新のメッセージを自動的にサーバへ送ります。これはサーバからクライアントへの通信でも同様で、即時の通信体験を実現します。
これはXMPPの基本的なアーキテクチャです。この仕組みでは、少量のXML要素がまずサーバに送られ、その後ユーザに伝わります。
XMPPクライアントには、メールアドレスのように固有の名前が割り当てられ、このIDを元にメッセージが適切な方向へルーティングされます。これにより、各クライアントは一定で標準的なサーバ接続経路を確保できます。
XMPPはもともと、データの送信や接続確立をTCPでのみ行います。この接続は固定され、新たなメッセージ送信時に再確立する必要がありません。
この方法により、XMPPは自由なXMLデータのやり取りを可能にするXMLストリームを構築します。ただし、最新のXMPP拡張ではTLSやWebSocketも利用されることがあります。
分散型ホスティングとは、中央管理者が存在せず、誰でもXMPPサーバを運用できる仕組みを指します。クラウドまたはオンプレミスのいずれでも設置可能で、メールと同様に各自の設定が自由に行えます。
XMPPのもう一つの特徴は、多くのチャットおよびメッセージプロトコルとの連携を可能にするゲートウェイを提供することです。これにより、多様なプロトコルと接続できます。
例えば、あるXMPPネットワークは、携帯へメッセージを送信する際にSMSドメインにアクセスし、そのメッセージを同時にSMTPドメインを通じて受信者のメールに届けることができます。また、メッセージを別の形式、例えばIRCで届ける場合にも、他のメッセージプロトコルを併用することが可能です。
XMPPは、現代の多くのコミュニケーションアプリの基盤として高い評価を受けています。XMPPを利用して開発された有名なアプリの例を以下に示します。
高機能なチャットアプリの開発において、XMPPは選択肢の一つです。しかし、その特徴と多くの利点から、依然として多くの現場で選ばれています。
IETFの支援と何千人もの開発者によって採用され、XMPPはチャットアプリ開発の主流なオープンスタンダードプロトコルとなっています。
優れた特徴を持ち、厳格なプロトコルによりこのギャップを埋めるべく構築されたXMPPは、ピアツーピアの通信などにおいて欠かせない存在であると証明されています。
XMPPプロトコルを採用することで得られる基本的な利点は以下の通りです。
このプロトコルは20年以上にわたり、開発者コミュニティに貢献してきました。その間にインフラが強化され、幅広い支持を得ています。現在、複数のXMPPサーバが存在し、何千人もの開発者が利用し、多くのアプリの基盤となっています。
これらにより、このプロトコルは実績があり、技術的なサポートも充実しています。また、無料でシンプルな点も魅力です。
高拡張性のプロトコルであるため、さまざまなメディアやメッセージの通信に利用可能です。音声か動画かを問わず、効果的な通信基盤の構築をサポートします。
XMPPはTCPの継続的な接続により、メッセージの配信が確実であり、いかに小さいXMLスタンザであっても漏れなく届けられます。
大規模な採用と世界的な需要により、さまざまなプログラミング言語に対応したXMPPライブラリが提供されています。Perl、C++、C#、Java、Pythonなど主要な言語で利用可能で、開発者は馴染みのある環境で開発できます。
XMPPは分散型であり、複数の実装が可能です。サーバやライブラリの構成に制限がなく、誰でも利用できるため、柔軟性が向上します。
XMPPは強化されたセキュリティを提供する点もメリットです。各XMPPサーバの設定時に、暗号化やセキュリティプロトコル、アクセス制御を選択でき、サイバー攻撃を低減し安心感を高めます。
特定のXMPPサーバが影響を受けたりオフラインになった場合でも、該当ユーザーのみが影響を受け、他は途切れない通信とデータ送信を維持できるため、100%の運用継続が可能となります。
サーバのフェデレーションは任意であり、セキュリティ上の理由でサーバ間通信を制限しながら、各サーバに特定の役割を付与することができます。
XMPPの大きなクライアント側の利点は、多くのXMPPクライアントが存在することです。デバイスの種類を問わず利用可能で、WindowsやUnixシステムではコマンドラインが提供されるなど、さらに利便性が向上しています。
即時通信に優れたアプリ構築のための基盤として、XMPP(拡張可能なメッセージング&プレゼンスプロトコル)は非常に拡張性のあるプロトコルです。上記の記事をお読みいただき、この革新的なプロトコルの詳細をご確認ください。包括的に解説しております。
最新情報を購読