Tech Blog.

Thoughts, stories, ideas.

Matrix

7. April 2017

Bei Matrix handelt es sich um ein Protokoll, welches sein Hauptmerkmal auf chatten legt. Das Protokoll ist darauf ausgelegt, die schon bestehenden Chat-Lösungen wie z.B. XMPP (Jabber), IRC oder Mattermost zu verlinken.

Vergleich XMPP

XMPP hat grundsätzlich dieselbe Idee, ein Unterschied ist der Aufbau des Protokolles. XMPP hat ein Basis RFC und kann so mit diversen XEPs erweitert werden. Dies macht das Protokoll sehr komplex und jeder Server kann andere XEPs implementieren. Im Gegensatz dazu besteht Matrix aus einem RFC in welchem alles spezifiziert ist. Wenn neue Features dazu kommen, muss das Basis Protokoll selber mit einem neueren RFC erweitert werden.

Funktionalität

Das Protokoll ist auf Basis von HTTP aufgebaut. Jeder Channel und jeder Client ist mindestens einem Server zugeordnet. So hat zum Beispiel der Server example.com den Channel foo, welcher nach dem entsprechenden Namensschema “#foo:example.com“ heisst. Dieser Channel kann aber über mehrere Server verteilt werden, so kann er z.B. auch über “#foo:example.org“ verfügbar gemacht werden. Dies hat den Vorteil, dass ein Channel auch bei Ausfall eines Servers weiterhin verfügbar ist.

Wird eine Message an einen Server geschickt, wird diese danach an jeden Server weitergeleitet, auf welchem ein User diesen Raum ebenfalls aktiviert hat.

Bridges

Es gibt zum Beispiel eine IRC Bridge, welche das IRC Netzwerk Freenode auf Matrix.org zur Verfügung stellt. Wird dem Channel “#freenode_#ansible:matrix.org“ gejoint, sieht dies auf Seite von IRC aus, als ob ein neuer User den Channel “#ansible“ joint, es gibt hierbei pro User und IRC Server eine Verbindung vom Matrix.org Server aus. Auf der Seite von Matrix präsentiert sich das Ganze wie ein normaler Matrix Channel.

Aktuell sind schon diverse Bridges vorhanden. Unten ist eine Übersicht der aktuellen Situation.

Identity Service

Jeder User hat eine Matrix User Identifikation, welche sich nach dem Schema “@user:domain“ richtet, also beispielsweise “@bob:matrix.org“. Die Matrix Accounts werden auf den jeweiligen Homeserver gespeichert. Um Matrix Accounts mit anderen Accounts zu verknüpfen, existiert der Identity Service. Aktuell existiert als bekannter Identity Service Provider nur [Vector.im](https://vector.im). Dieses Feature ist aber optional, da die eigentlichen Accounts auf den jeweiligen Servern liegen und nur die Verknüpfung zu anderen (ausserhalb von Matrix) Accounts dort abgespeichert werden.

Implementationen

Da es sich bei Matrix um ein Protokoll handelt, braucht es noch Implementationen davon. Dabei können drei Komponenten getrennt angeschaut werden, die Server, die Clients und die Bridges.

Server

Die gebräuchlichste Server Implementation ist Synapse, welche in Python implementiert ist. Diese wird von den Protokoll-Entwicklern als ihre Referenz-Implementation zur Verfügung gestellt.

Bridges

Es gibt schon in ganz verschiedene Netzwerke eine Bridge. Die wohl gebräuchlichste ist IRC, von welcher es schon mehrere Produkte gibt. Die Liste der unterstützten Netzwerke ist bereits gross und so können unter anderen auch Bridges zu XMPP, Mattermost, Slack oder GitHub betrieben werden.

Die Integration der Bridges ist mit der Weboberfläche riot.im sehr simpel. Das Aktivieren eines neuen Bots funktioniert in etwa so, dass ein neuer Channel erstellt und in diesem dann der jeweilige Bot hinzugefügt wird. Dafür gibt es in den Room Settings einen Menüpunkt “Manage Integrations”. Diese Bridges werden von Riot zur Verfügung gestellt, die Auswahl ist aber begrenzt. Sollen andere Bots und Bridges hinzugefügt werden oder ist z.B. ein IRC Netzwerk nicht verfügbar, muss der entsprechende Bot oder die entsprechende Bridge selber zur Verfügung gestellt werden.

Clients

Es gibt schon reichlich Clients. Synapse bringt eine kleine Weboberfläche mit. Eine der gebräuchlichsten Oberfläche ist Riot, welche als Web-Applikation, Android App und iPhone App zur Verfügung steht. Riot ist dabei eine reine Webapplikation, welche auf die API von Matrix zugreift. Sie hat selber keine Datenbank oder persistente Daten im Hintergrund.

Eine weiterer Client ist WeeChat, für welchen es ein Plugin gibt. Dies ist für all jene interessant, welche gerne einen Client in der Konsole bedienen.

Erkenntnisse

Matrix macht es einfach über ein Protokoll auf die verschiedenen, schon vorhandenen Protokolle zu zugreifen. Die Möglichkeit den Client selber zu wählen ist ein zusätzliches Nice-to-have.

Diverse Implementationen sind noch in einer Alpha bis Beta Phase. Dies schränkt die Wahl der einzelnen Komponenten beträchtlich ein.

Das Protokoll kennt nur einen reduzierten Satz von HTTP Headern. So ist zum Beispiel der Server Name Indicator (SNI) nicht implementiert, was dazu führt, dass Matrix nur unter gewissen Umständen hinter einem Reverse Proxy betrieben werden kann.