{"id":23781,"date":"2023-02-01T17:49:00","date_gmt":"2023-02-01T16:49:00","guid":{"rendered":"https:\/\/blog.mi.hdm-stuttgart.de\/?p=23781"},"modified":"2023-06-18T17:25:11","modified_gmt":"2023-06-18T15:25:11","slug":"websockets-technischer-einblick-und-performance-vergleich","status":"publish","type":"post","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/01\/websockets-technischer-einblick-und-performance-vergleich\/","title":{"rendered":"WebSockets: Technischer Einblick und Performance-Vergleich"},"content":{"rendered":"\n<p>In diesem Artikel wird ein kurzer Blick auf die zu Grunde liegende, technische Funktionsweise von WebSockets geworfen und ihre Performance im Vergleich zu HTTP und Server-sent Events (SSE) untersucht, wodurch letztlich das Potenzial von WebSockets eruiert werden kann.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Hintergrund &amp; Entstehung<\/h2>\n\n\n\n<p>In der Vergangenheit war es bei Webanwendungen nur unter unsachgem\u00e4\u00dfer Verwendung des Hypertext Transfer Protokolls (HTTP) realisierbar, eine bidirektionale Verbindung zwischen Client und Server herzustellen. Dabei sind folgende Probleme entstanden: (1.) Der Server muss verschiedene Transmission Control Protocol (TCP) Verbindungen f\u00fcr jeden Client nutzen. Eine, um Informationen zum Client zu senden, und eine neue f\u00fcr jede eintreffende Nachricht. (2.) Es gibt einen gro\u00dfen Overhead, da jede Client-to-Server Nachricht einen eigenen HTTP-Header hat. (3.) Das Client-seitige Skript muss sich merken, welche abgehenden Verbindungen zu welchen eingehenden Verbindungen geh\u00f6ren. Nur so k\u00f6nnen Antworten verfolgt werden. [vgl. 1]<\/p>\n\n\n\n<p>Eine bessere L\u00f6sung w\u00e4re eine einzige TCP-Verbindung f\u00fcr beide Richtungen \u2013 hier kommt der WebSocket-Standard ins Spiel. Der Standard setzt sich zusammen aus dem WebSocket-Protokoll und der WebSocket-API (WSAPI). Der WebSocket-Standard kann einen bidirektionalen Kommunikationskanal zwischen einer Webanwendung und einem Server herstellen. Es stellt dadurch eine Alternative zu allen bislang verwendeten, HTTP-basierten Kommunikationstechnologien dar. [vgl. 1]<\/p>\n\n\n\n<p>Im Jahr 2009 hat Google das WebSocket-Protokoll der Internet Engineering Task Force (IETF) als Draft vorgelegt [vgl. 2]. Die IETF ist ein weltweites Komitee, welches die Standardbetriebsprotokolle f\u00fcr das Internet definiert [vgl. 3]. Bis Mai 2010 [vgl. 4] wurde das Protokoll von Google und anderen weiterentwickelt und kontinuierlich verbessert. Nach einem zweimonatigen Stillstand hat die \u201eBiDirectional or Server-Initiated HTTP (HyBi)\u201c-Arbeitsgruppe \u2013 eine Gruppe der IETF \u2013 die Weiterentwicklung offiziell fortgef\u00fchrt. Im Dezember 2011 ist das WebSocket-Protokoll schlie\u00dflich unter dem Request for Comments (RFC) 6455 erschienen [vgl. 1]. Ein RFC ist die Form, in welcher die IETF die Standardbetriebsprotokolle formuliert [vgl. 3].<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Technische Funktionsweise<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Opening-Handshake<\/h3>\n\n\n\n<p>Sobald im Browser eine WebSocket-Verbindung aufgebaut wird, findet durch den sogenannten Opening-Handshake zun\u00e4chst der Verbindungsaufbau statt. HTTP-basierend wird dabei ein WebSocket-Kanal er\u00f6ffnet. Ein beispielhafter HTTP-GET-Request ist nachfolgend zu sehen. [vgl. 5, S. 35]<\/p>\n\n\n\n<p class=\"has-small-font-size\"><code class=\"\" data-line=\"\">GET \/chat HTTP\/1.1&lt;br&gt;Host: server.example.com&lt;br&gt;Upgrade: websocket&lt;br&gt;Connection: Upgrade&lt;br&gt;Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==&lt;br&gt;Origin: http:\/\/example.com&lt;br&gt;Sec-WebSocket-Protocol: chat&lt;br&gt;Sec-WebSocket-Version: 13<\/code><\/p>\n\n\n\n<p><strong>GET \/chat<\/strong> spricht den Endpunkt des WebSocket-Servers an. Ein Server kann dabei mehrere WebSocket-Endpoints besitzen. Mit <strong>Upgrade: websocket<\/strong> wird mitgeteilt, dass auf das Websocket-Protokoll umgestellt werden soll. Der eigentliche Wechsel passiert durch <strong>Connection: Upgrade<\/strong>. Im <strong>Header Sec-WebSocket-Key<\/strong> steht eine Zufallszahl. Mit ihr wird \u00fcberpr\u00fcft, ob der Server das WebSocket-Protokoll unterst\u00fctzt. \u00dcber den <strong>Origin<\/strong> kann der Client den Server dar\u00fcber informieren, von welcher Ursprungsdomain der Request gesendet wurde. Darauf basierend kann der Server entscheiden, ob er die Verbindung annimmt. \u00dcber den Header <strong>Sec-WebSocket-Protocol<\/strong> kann der Client dem Server optional mitteilen, welche Subprotokolle \u00fcber den WebSocket-Kanal verarbeitet werden k\u00f6nnen. Die Versionsnummer des WebSocket-Protokolls wird mit <strong>Sec-WebSocket-Version<\/strong> angegeben. Da die Reihenfolge der Header vom Client zuf\u00e4llig gew\u00e4hlt werden, spielt sie keine Rolle. Wenn ein Handshake-Request nicht alle notwendigen Felder liefert, wird keine Verbindung aufgebaut. [vgl. 5, S. 36 f.]<\/p>\n\n\n\n<p>Wird die Handshake-Anfrage vom Server akzeptiert, sendet er eine HTTP-Response an den Client [vgl. 5, S. 37]. Eine beispielhafte Response ist nachfolgend zu sehen. <\/p>\n\n\n\n<p class=\"has-small-font-size\"><code class=\"\" data-line=\"\">HTTP\/1.1 101 Switching Protocols&lt;br&gt;Upgrade: websocket&lt;br&gt;Connection: Upgrade&lt;br&gt;Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+0o=&lt;br&gt;Sec-WebSocket-Protocol: chat<\/code><\/p>\n\n\n\n<p>Diese Antwort enth\u00e4lt den Statuscode <strong>101 Switching Protocols<\/strong>, wodurch best\u00e4tigt wird, dass der Protokollwechsel stattfinden kann. Der Wert f\u00fcr <strong>Sec-WebSocket-Accept<\/strong> wird folgenderma\u00dfen erstellt: Zun\u00e4chst wird ein Globally Unique Identifier (hier: <strong>258EAFA5-E914-47DA-95CA-C5AB0DC85B11<\/strong>) and den <strong>Sec-WebSocket-Key<\/strong> des Handshake-Requests angeh\u00e4ngt. Dadurch ergibt sich <strong>dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-C5AB0DC85B11<\/strong>. Aus dieser Zeichenkette wird unter Einsatz der kryptografischen Hashfunktion SHA-1 ein Hashwert erzeugt, welcher daraufhin mittels einer Base64-Codierung [vgl. 6] in einen Textstring umgewandelt wird. Dieser String ergibt den Wert des Headers <strong>Sec-WebSocket-Accept<\/strong>. Nun ist es dem Client m\u00f6glich, anhand des <strong>Sec-WebSocket-Keys<\/strong> und des <strong>Sec-WebSocket-Accepts<\/strong> zu \u00fcberpr\u00fcfen, ob die Antwort von dem richtigen WebSocket-Server kommt. Sofern in dem Opening-Handshake-Request Subprotokolle im Header <strong>Sec-WebSocket-Protocol<\/strong> angegeben wurden, teilt der Server im gleichnamigen Header der Response mit, welche Subprotokolle er unterst\u00fctzt \u2013 hier: <strong>chat<\/strong>. Es finden Verbindungsabbr\u00fcche statt, wenn angeforderte Subprotokolle nicht unterst\u00fctzt werden oder wenn der Server mit einem nicht-angefragten Subprotokoll antwortet. Nach erfolgreichem Ablauf aller genannten Schritte gilt der Handshake als abgeschlossen und der WebSocket-Kanal wurde aufgebaut. \u00dcber diesen Kanal k\u00f6nnen nun sequenzweise Daten in Form von sogenannten Frames in beide Richtungen geschickt werden. [vgl. 5, S. 37-39]<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Datentransfer<\/h3>\n\n\n\n<p>Die zu transportierenden Daten liegen als Sequenz von Frames vor. Die Protokollnachricht besteht \u2013 wie \u00fcblich \u2013 aus einem Header mit Kontrolldaten und den Nutzdaten im Payload. Ein vereinfachter Aufbau eines WebSocket-Frames ist in Abbildung 1 dargestellt. Aus dieser Darstellung ist auch abzulesen, wie schlank das WebSocket-Protokoll ist \u2013 im Vergleich zu HTTP. Der kleinste WebSocket-Frame, der vom Server zum Client gesendet wird, betr\u00e4gt 2 Bytes. Ist die Header-L\u00e4nge maximal, so betr\u00e4gt sie 14 Bytes. [vgl. 5, S. 39]<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/frameAufbau.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"267\" data-attachment-id=\"23783\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/01\/websockets-technischer-einblick-und-performance-vergleich\/frameaufbau\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/frameAufbau.png\" data-orig-size=\"1252,326\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"frameAufbau\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/frameAufbau-1024x267.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/frameAufbau-1024x267.png\" alt=\"\" class=\"wp-image-23783\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/frameAufbau-1024x267.png 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/frameAufbau-300x78.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/frameAufbau-768x200.png 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/frameAufbau.png 1252w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\"><em><strong>Abbildung 1:<\/strong> Vereinfachter Aufbau eines WebSocket-Frames [vgl. 5, S. 39]<\/em><\/figcaption><\/figure>\n\n\n\n<p>WebSockets \u00fcbertragen Nutzdaten sequenzweise. Besondere Bedeutung hat dies, wenn Nutzdaten zum \u00dcbertragungszeitpunkt nicht vollst\u00e4ndig sind. Sie k\u00f6nnen daher weder in ein WebSocket-Frame eingef\u00fcgt werden, noch kann die Datenl\u00e4nge der Nutzdaten im Frame-Header angegeben werden. Dennoch besteht die M\u00f6glichkeit, in diesem Fall Daten zu \u00fcbertragen \u2013 n\u00e4mlich st\u00fcckchenweise. Das <strong>FIN<\/strong>-Bit des ersten Bytes gibt Auskunft dar\u00fcber, ob der Frame vollst\u00e4ndig ist. Trifft dies zu, so ist das Bit auf <strong>1<\/strong> gesetzt, anderenfalls auf <strong>0<\/strong>. Das <strong>FIN<\/strong>-Bit ist in Abbildung 1 zu erkennen. [vgl. 5, S. 42 f.]<\/p>\n\n\n\n<p>F\u00fcr alle Frames, die vom Client zum Server geschickt werden, gibt es aus Sicherheitsgr\u00fcnden eine Besonderheit: Sie m\u00fcssen maskiert werden. F\u00fcr jeden Frame muss der Client dazu eine neue, noch unverwendete 32-Bit-Zufallszahl generieren. Dieser sogenannte <strong>Masking-Key<\/strong> wird in das entsprechende Header-Feld gesetzt (siehe Abbildung 1). Mittels eines Algorithmus werden die Nutzdaten unter Verwendung des <strong>Masking-Keys<\/strong> maskiert. Das Demaskieren erfolgt auf Serverseite entsprechend umgekehrt. [vgl. 5, S. 43\u201345]<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Closing-Handshake<\/h3>\n\n\n\n<p>Ein Closing-Handshake kann sowohl vom Client als auch vom Server veranlasst werden und wird durch einem sogenannten Close-Frame gestartet. Haben sowohl Client als auch Server einen solchen Close-Frame empfangen und gesendet, gilt der Closing-Handshake als abgeschlossen. Der darunterliegende TCP-Kanal wird vom Server beendet. [vgl. 5, S. 53 f.]<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Performance-Vergleich<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">HTTP vs. WebSockets<\/h3>\n\n\n\n<p>In einem Blogpost auf Feathersjs.com vergleicht David Luecke die Performance von HTTP und WebSockets. Der Test-Server ist dabei auf Heroku gehostet und gibt auf einen Request ein JSON-Objekt zur\u00fcck. \u00dcber eine Webseite k\u00f6nnen eine festgelegte Anzahl von Requests durchgef\u00fchrt werden, w\u00e4hrend die daf\u00fcr ben\u00f6tigte Zeit gestoppt wird. [vgl. 7]<\/p>\n\n\n\n<figure class=\"wp-block-image alignleft size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Speed_neu.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23785\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/01\/websockets-technischer-einblick-und-performance-vergleich\/httpvswebsocket_speed_neu\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Speed_neu.png\" data-orig-size=\"499,616\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"HTTPvsWebSocket_Speed_neu\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Speed_neu.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Speed_neu.png\" alt=\"\" class=\"wp-image-23785\" width=\"270\" height=\"333\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Speed_neu.png 499w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Speed_neu-243x300.png 243w\" sizes=\"auto, (max-width: 270px) 100vw, 270px\" \/><\/a><figcaption class=\"wp-element-caption\"><em><strong>Abbildung 2:<\/strong> Vergleich der ben\u00f6tigten Zeit f\u00fcr einen Request zwischen HTTP und WebSocket [vgl. 7]<\/em><\/figcaption><\/figure>\n\n\n\n<p>Die durchschnittliche Dauer eines einzigen HTTP-Requests betr\u00e4gt 107 Millisekunden, w\u00e4hrend ein einzelner WebSocket-Request 83 Millisekunden dauert (siehe Abbildung 2). F\u00fcr alle durchgef\u00fchrten Tests wird die Zeit, die ben\u00f6tigt wird, um die WebSocket-Verbindung herzustellen, nicht ber\u00fccksichtigt. Gr\u00f6\u00dfere Unterschiede zeigen sich, sobald mehrere parallele Requests durchgef\u00fchrt werden: 50 WebSocket-Requests dauern 180 Millisekunden, w\u00e4hrend f\u00fcr dieselbe Anzahl \u00fcber HTTP 5 Sekunden ben\u00f6tigt werden (siehe Abbildung 3). \u00dcber HTTP k\u00f6nnen ungef\u00e4hr 10 Requests pro Sekunden geschickt werden \u2013 bei WebSocket sind es knapp 4.000 Requests. Hauptgrund hierf\u00fcr ist, dass der Browser die Anzahl der gleichzeitigen HTTP-Verbindungen begrenzt. Bei Google Chrome \u2013 dem Testbrowser \u2013 liegt die Anzahl standardm\u00e4\u00dfig bei 6 Requests. Bei WebSockets gibt es solche Beschr\u00e4nkungen hingegen nicht. [vgl. 7]<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Speed_50_neu.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23786\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/01\/websockets-technischer-einblick-und-performance-vergleich\/httpvswebsocket_speed_50_neu\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Speed_50_neu.png\" data-orig-size=\"577,616\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"HTTPvsWebSocket_Speed_50_neu\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Speed_50_neu.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Speed_50_neu.png\" alt=\"\" class=\"wp-image-23786\" width=\"311\" height=\"332\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Speed_50_neu.png 577w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Speed_50_neu-281x300.png 281w\" sizes=\"auto, (max-width: 311px) 100vw, 311px\" \/><\/a><figcaption class=\"wp-element-caption\"><em><strong>Abbildung 3:<\/strong> Vergleich der ben\u00f6tigten Zeit f\u00fcr 50 parallele Requests zwischen HTTP und WebSocket [vgl. 7]<\/em><\/figcaption><\/figure>\n\n\n\n<p>David Luecke hat auch die \u00fcbertragenen Datenmengen verglichen. Auch hier wird der initiale WebSocket-Verbindungsaufbau nicht ber\u00fccksichtigt. Ein HTTP-Request und -Response erzielt eine \u00dcbertragungsmenge von 282 Bytes. Unter Verwendung eines WebSockets liegt die entsprechende Datenmenge bei 54 Bytes (31 Bytes f\u00fcr den Request und 24 Bytes f\u00fcr die Response). Zu beachten ist jedoch, dass diese Differenz mit steigender Nutzdatenmenge (Payload) abnimmt, da die Header-Gr\u00f6\u00dfe bei HTTP gleichbleibend ist. [vgl. 7]<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Bytes_neu.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23787\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/01\/websockets-technischer-einblick-und-performance-vergleich\/httpvswebsocket_bytes_neu\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Bytes_neu.png\" data-orig-size=\"681,620\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"HTTPvsWebSocket_Bytes_neu\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Bytes_neu.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Bytes_neu.png\" alt=\"\" class=\"wp-image-23787\" width=\"360\" height=\"327\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Bytes_neu.png 681w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/HTTPvsWebSocket_Bytes_neu-300x273.png 300w\" sizes=\"auto, (max-width: 360px) 100vw, 360px\" \/><\/a><figcaption class=\"wp-element-caption\"><em><strong>Abbildung 4:<\/strong> Vergleich der bei einem Request \u00fcbertragenen Datenmenge zwischen HTTP und WebSocket [vgl.  7]<\/em><\/figcaption><\/figure>\n\n\n\n<p>Abschlie\u00dfend hat David Luecke Benchmark-Tests (Lasttests) durchgef\u00fchrt, um herauszufinden, ob und wie sich die bisherigen Ergebnisse ver\u00e4ndern, wenn mehrere Clients mit dem Server kommunizieren. Die Benchmarks laufen mit 100 gleichzeitigen Verbindungen und beinhalten auch die Verbindungsaufbauzeit des WebSockets. Wenn nur ein einziger Request pro Verbindung get\u00e4tigt wird, so ist HTTP etwa doppelt so schnell wie WebSocket. Bei 50 Requests pro Verbindung ist der WebSocket allerdings ca. 50 Prozent schneller. Bei einer hohen Anzahl an Requests pro Verbindung erzielen WebSockets also bessere Ergebnisse. [vgl. 7]<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Server-sent Events vs. WebSockets<\/h3>\n\n\n\n<p>Bei Server-sent Events (SSE) wird ein einzelner HTTP-Request kontinuierlich aufrechterhalten, um dar\u00fcber Updates zu schicken. Das bedeutet, dass Header nur einmalig \u2013 wenn der Request veranlasst wird \u2013 gesendet werden m\u00fcssen. Dadurch werden f\u00fcr jedes Update nur die notwendigen Informationen \u00fcbertragen, wodurch sich die Datenmenge reduziert. Ein weiterer Vorteil von SSE ist, dass sie sich im HTML5-Standard befinden. Das bedeutet: Bestehende Anwendungen k\u00f6nnen mit minimalem Aufwand nachtr\u00e4glich auf SSE umgestellt werden. Es ist jedoch zu beachten, dass SSE unidirektional funktionieren, das hei\u00dft Updates k\u00f6nnen nur vom Server zum Client gesendet werden \u2013 nicht andersherum. Eine Verbindung vom Client zum Server w\u00fcrde einen zus\u00e4tzlichen HTTP-Request ben\u00f6tigen. Laut einem Test von Alexis Abril schneiden SSE im Vergleich zu WebSockets \u00e4hnlich performant ab. Die Menge der \u00fcbertragenden Daten unterscheidet sich lediglich um wenige Kilobytes. Die Ergebnisse sind in Abbildung 5 dargestellt. Alexis Abril kommt zu dem Ergebnis, dass sich f\u00fcr die meisten Webanwendungen SSE aufgrund ihres geringeren Entwicklungsaufwands besser eignen. Falls jedoch h\u00e4ufig Daten vom Client zum Server geschickt werden m\u00fcssen, liefern WebSockets eine bessere Performance, wodurch der etwas h\u00f6here Implementierungsaufwand gerechtfertigt werden kann. [vgl. 8]<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/SSEvsWebSockets_neu.png\"><img loading=\"lazy\" decoding=\"async\" data-attachment-id=\"23788\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/01\/websockets-technischer-einblick-und-performance-vergleich\/ssevswebsockets_neu\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/SSEvsWebSockets_neu.png\" data-orig-size=\"919,620\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"SSEvsWebSockets_neu\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/SSEvsWebSockets_neu.png\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/SSEvsWebSockets_neu.png\" alt=\"\" class=\"wp-image-23788\" width=\"482\" height=\"326\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/SSEvsWebSockets_neu.png 919w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/SSEvsWebSockets_neu-300x202.png 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/SSEvsWebSockets_neu-768x518.png 768w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/a><figcaption class=\"wp-element-caption\"><em><strong>Abbildung 5:<\/strong> Testergebnisse Vergleich zwischen Server-sent Events und WebSocket [vgl. 8]<\/em><\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Vor- und Nachteile von WebSockets<\/h2>\n\n\n\n<p>Vorteile von WebSockets sind, dass \u00fcber einen bidirektionalen Kanal Daten in Echtzeit zwischen Client und Server \u00fcbermittelt werden k\u00f6nnen. Dies beschr\u00e4nkt sich dabei nicht auf Textdateien, sondern es k\u00f6nnen auch bin\u00e4re Daten (z. B. Video-, Audio- und Bilddateien) \u00fcbertragen werden. Zudem haben WebSockets nur einen kleinen Overhead, d. h. es werden geringere Datenmengen \u00fcbertragen, wodurch eine bessere Performance erzielt werden kann. Gerade f\u00fcr Anwendungen, die h\u00e4ufig mobil genutzt werden, kann dies entscheidend sein. [vgl. 5, S. 35]<\/p>\n\n\n\n<p>Ebenso weisen WebSockets eine sehr gute Browserunterst\u00fctzung auf. Seit 2013 werden sie von allen g\u00e4ngigen Desktop-Browsern unterst\u00fctzt und inzwischen auch von den vertretenen Smartphone-Browsern. Welche Browser WebSockets unterst\u00fctzen ist aus Abbildung 6 zu entnehmen. [vgl. 10]<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/browserunterstuetzung-scaled.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"183\" data-attachment-id=\"23789\" data-permalink=\"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/01\/websockets-technischer-einblick-und-performance-vergleich\/browserunterstuetzung\/\" data-orig-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/browserunterstuetzung-scaled.jpg\" data-orig-size=\"2560,458\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"browserunterstuetzung\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/browserunterstuetzung-1024x183.jpg\" src=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/browserunterstuetzung-1024x183.jpg\" alt=\"\" class=\"wp-image-23789\" srcset=\"https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/browserunterstuetzung-1024x183.jpg 1024w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/browserunterstuetzung-300x54.jpg 300w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/browserunterstuetzung-768x137.jpg 768w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/browserunterstuetzung-1536x275.jpg 1536w, https:\/\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/01\/browserunterstuetzung-2048x366.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\"><em><strong>Abbildung 6:<\/strong> Browserunterst\u00fctzung von WebSockets [10]<\/em><\/figcaption><\/figure>\n\n\n\n<p>Gravierende Nachteile weisen WebSockets nicht auf. Man sollte sich jedoch \u00fcber gewisse Sicherheitsrisiken bewusst sein und entsprechende Schutzma\u00dfnahmen einrichten. Die Risiken gleichen denen des zugrundeliegenden HTTP-Protokolls. So sind beispielsweise Denial-of-Service-Angriffe (DoS-Angriffe) m\u00f6glich, da die Anzahl an Verbindungen zum Server nicht begrenzt wird. Bei einer DoS-Attacke wird eine hohe Anzahl an Anfragen an den Server gesendet, sodass das System enorm langsam wird oder sogar zusammenbricht [vgl. 11]. Zudem findet keine Authentifizierung und Autorisierung w\u00e4hrend des Handshake-Prozesses statt. Ebenso wird der Nutzer-Input nicht gepr\u00fcft, wodurch z. B. Cross-Site-Scripting (XSS) und SQL-Injections m\u00f6glich sind. [vgl. 12]<\/p>\n\n\n\n<p>In [13] sind einige Best Practices einzusehen, die f\u00fcr einen sicheren Einsatz von WebSockets umgesetzt werden sollten. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n\n\n\n<p>In WebSockets steckt gro\u00dfes Potenzial, da es bislang keine andere Technologie gibt, die eine bidirektionale Verbindung zwischen Client und Server erm\u00f6glicht. Auch kann eine sehr hohe Performance erzielt werden. Allerdings gibt es gewisse Sicherheitsrisiken, auf die bei der Implementierung geachtet werden sollte. Sofern Textdaten lediglich unidirektional vom Server zum Client gesendet werden m\u00fcssen, empfielt sich stattdessen die Verwendung von Server-sent Events. Diese erzielen eine vergleichbare Performance, bei einem geringeren Entwicklungsaufwand.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Literatur<\/h2>\n\n\n\n<ul class=\"has-small-font-size wp-block-list\">\n<li>[1] Alexey Melnikov und Ian Fette. The WebSocket Protocol. Issue: 6455 Num Pages: 71 Series: Request for Comments Published: RFC 6455. 30. Sep. 2011. DOI: 10.17487\/RFC6455. URL: <a href=\"https:\/\/www.rfc-editor.org\/info\/rfc6455\">https:\/\/www.rfc-editor.org\/info\/rfc6455<\/a> (besucht am 29.01.2023).<\/li>\n\n\n\n<li>[2] Ian Hickson. The WebSocket protocol. Internet-Draft draft-hixie-thewebsocketprotocol-76. Backup Publisher: Internet Engineering Task Force Num Pages: 55. Internet Engineering Task Force, 9. Jan. 2009. URL: <a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/draft-hixie-thewebsocketprotocol-76\">https:\/\/datatracker.ietf.org\/doc\/html\/draft-hixie-thewebsocketprotocol-76<\/a> (besucht am 29.01.2023).<\/li>\n\n\n\n<li>[3] Michael Eckert. IETF (Internet Engineering Task Force). Whatis.com\/de. Apr. 2020. URL: <a href=\"https:\/\/whatis.techtarget.com\/de\/definition\/IETF-Internet-Engineering-Task-Force\">https:\/\/whatis.techtarget.com\/de\/definition\/IETF-Internet-Engineering-Task-Force<\/a><\/li>\n\n\n\n<li>(besucht am 29.01.2023).<\/li>\n\n\n\n<li>[4] Ian Hickson. The WebSocket protocol. Internet-Draft draft-hixie-thewebsocketprotocol-76. Backup Publisher: Internet Engineering Task Force Num Pages: 55. Internet Engineering Task Force, 6. Mai 2010. URL: <a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/draft-hixie-thewebsocketprotocol-76\">https:\/\/datatracker.ietf.org\/doc\/html\/draft-hixie-thewebsocketprotocol-76<\/a> (besucht am 29.01.2023).<\/li>\n\n\n\n<li>[5] Peter Leo Gorski, Luigi Lo Iacono und Hoai Viet Nguyen. WebSockets: Moderne HTML5-Echtzeitanwendungen entwickeln. M\u00fcnchen: Hanser, 2015. 269 S. ISBN: 978-3-446-44371-6.<\/li>\n\n\n\n<li>[6] Simon Josefsson. The Base16, Base32, and Base64 Data Encodings. Request for Comments RFC 4648. Num Pages: 18. Internet Engineering Task Force, Okt. 2006. DOI: 10.17487\/RFC4648. URL: <a href=\"https:\/\/datatracker.ietf.org\/doc\/rfc4648\">https:\/\/datatracker.ietf.org\/doc\/rfc4648<\/a> (besucht am 29.01.2023).<\/li>\n\n\n\n<li>[7] David Luecke. HTTP vs Websockets: A performance comparison. Medium. 27. Jan. 2018. URL: <a href=\"https:\/\/blog.feathersjs.com\/http-vs-websockets-a-performance-comparison-da2533f13a77\">https:\/\/blog.feathersjs.com\/http-vs-websockets-a-performance-comparison-da2533f13a77<\/a> (besucht am 29.01.2023).<\/li>\n\n\n\n<li>[8] Alexis Abril. A comparison between WebSockets, server-sent events, and polling. Aquil.io. 23. Sep. 2017. URL: <a href=\"https:\/\/medium.com\/dailyjs\/a-comparison-between-websockets-server-sent-events-and-polling-7a27c98cb1e3\">https:\/\/medium.com\/dailyjs\/a-comparison-between-websockets-server-sent-events-and-polling-7a27c98cb1e3<\/a> (besucht am 29.01.2023).<\/li>\n\n\n\n<li>[9] Dane Cameron. HTML5, JavaScript und jQuery: Der Crashkurs f\u00fcr Software-Entwickler. 1. Aufl. Heidelberg: dpunkt.-Verl, 2015. 280 S. ISBN: 978-3-86490-268-0.<\/li>\n\n\n\n<li>[10] caniuse.com. Web Sockets. URL: <a href=\"https:\/\/caniuse.com\/websockets\">https:\/\/caniuse.com\/websockets<\/a> (besucht am 29.01.2023).<\/li>\n\n\n\n<li>[11] BSI. DoS- und DDoS-Attacken. Bundesamt f\u00fcr Sicherheit in der Informationstechnik. URL: <a href=\"https:\/\/www.bsi.bund.de\/DE\/Themen\/Verbraucherinnen-und-Verbraucher\/Cyber-Sicherheitslage\/Methoden-der-Cyber-Kriminalitaet\/DoS-Denial-of-Service\/dos-denial-of-service.html?nn=132356\">https:\/\/www.bsi.bund.de\/DE\/Themen\/Verbraucherinnen-und-Verbraucher\/Cyber-Sicherheitslage\/Methoden-der-Cyber-Kriminalitaet\/DoS-Denial-of-Service\/dos-denial-of-service.html?nn=132356<\/a> (besucht am 29.01.2023).<\/li>\n\n\n\n<li>[12] Danko Kovacic. WebSocket Security: Top 8 Vulnerabilities and How to Solve Them. Bright Security. 30. Juli 2021. URL: <a href=\"https:\/\/brightsec.com\/blog\/websocket-security-top-vulnerabilities\/\">https:\/\/brightsec.com\/blog\/websocket-security-top-vulnerabilities\/<\/a> (besucht am 29.01.2023).<\/li>\n\n\n\n<li>[13] Heroku Dev Center. WebSocket Security. 7. Dez. 2021. URL: <a href=\"https:\/\/devcenter.heroku.com\/articles\/websocket-security\">https:\/\/devcenter.heroku.com\/articles\/websocket-security<\/a> (besucht am 29.01.2023).<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>In diesem Artikel wird ein kurzer Blick auf die zu Grunde liegende, technische Funktionsweise von WebSockets geworfen und ihre Performance im Vergleich zu HTTP und Server-sent Events (SSE) untersucht, wodurch letztlich das Potenzial von WebSockets eruiert werden kann. Hintergrund &amp; Entstehung In der Vergangenheit war es bei Webanwendungen nur unter unsachgem\u00e4\u00dfer Verwendung des Hypertext Transfer [&hellip;]<\/p>\n","protected":false},"author":1068,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1,649,262,21,651],"tags":[620,621,432,392],"ppma_author":[883],"class_list":["post-23781","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-interactive-media","category-rich-media-systems","category-system-architecture","category-system-designs","tag-rich-media-systems","tag-server-sent-events","tag-web-performance","tag-websockets"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack-related-posts":[{"id":28654,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/02\/28\/multiplayer-arena-dynamische-game-sessions-mit-docker-fastapi\/","url_meta":{"origin":23781,"position":0},"title":"Multiplayer-Arena: Dynamische Game-Sessions mit Docker &amp; FastAPI","author":"Emre Kalkan","date":"28. February 2026","format":false,"excerpt":"Game: https:\/\/46.101.127.20.sslip.io\/ (online bis 31. M\u00e4rz 2026) (beachte Readme im Git!) Git Repo: https:\/\/github.com\/ek101-collab\/ArenaGame-with-ContainerSessions Einleitung und Motivation Im Rahmen der Vorlesung \"System Engineering und Management\" bestand die Kernaufgabe darin, ein Projekt zu konzipieren und umzusetzen, das moderne Web- und Cloud-Technologien nutzt. Zu Beginn der Projektphase lag mein Fokus auf einer\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/mainmenu.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/mainmenu.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/mainmenu.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/mainmenu.png?resize=700%2C400&ssl=1 2x"},"classes":[]},{"id":27369,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2025\/02\/26\/cloudy-mit-aussicht-auf-worter-unser-weg-mit-crowdcloud\/","url_meta":{"origin":23781,"position":1},"title":"Cloudy mit Aussicht auf W\u00f6rter: Unser Weg mit CrowdCloud","author":"Simon Wimmer","date":"26. February 2025","format":false,"excerpt":"Willkommen zu unserem Erfahrungsbericht aus der Vorlesung \u201eSystem Engineering and Management\u201c. In den letzten Monaten haben wir uns an ein Projekt gewagt, das uns sowohl technisch als auch pers\u00f6nlich herausgefordert hat \u2013 CrowdCloud. Anstatt uns in trockene Theorien zu verlieren, m\u00f6chten wir euch in diesem Blog-Beitrag erz\u00e4hlen, wie aus einer\u2026","rel":"","context":"In &quot;System Engineering&quot;","block_context":{"text":"System Engineering","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/system-designs\/system-engineering\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System_Engineering.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System_Engineering.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System_Engineering.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System_Engineering.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System_Engineering.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2025\/02\/System_Engineering.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":28823,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2026\/02\/28\/morehuehner-ein-moorhuhn-remake-als-cloud-native-multiplayer-browsergame\/","url_meta":{"origin":23781,"position":2},"title":"Morehuehner: Ein Moorhuhn-Remake als Cloud-Native Multiplayer-Browsergame","author":"Michael Dick","date":"28. February 2026","format":false,"excerpt":"1. Einleitung \u201cMoorhuhn\u201d, wer erinnert sich nicht? Damals auf Windows XP, in der Mittagspause oder nach der Schule, mit dem Fadenkreuz \u00fcber den Bildschirm und auf pixelige H\u00fchner geballert. F\u00fcr uns war Moorhuhn eines dieser Spiele, das man eigentlich nie alleine spielen wollte. Man sa\u00df vor dem Rechner, jemand schaute\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/redis.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/redis.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/redis.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/redis.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/redis.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2026\/02\/redis.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":12206,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/18\/quic-die-zukunft\/","url_meta":{"origin":23781,"position":3},"title":"QUIC &#8211; Die Zukunft?","author":"Max Merz","date":"18. February 2021","format":false,"excerpt":"QUIC soll als neuer Standard das weit verbreitete TCP-Protokoll abl\u00f6sen. Welche Neuerungen QUIC mitbringt, wo seine St\u00e4rken liegen und warum \u00fcberhaupt eine Weiterentwicklung von TCP ben\u00f6tigt wird, versuche ich in diesem Artikel zu beantworten. QUIC allgemein Um zu verstehen, was QUIC ist und was es verbessern m\u00f6chte, muss man zuerst\u2026","rel":"","context":"In &quot;Interactive Media&quot;","block_context":{"text":"Interactive Media","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/interactive-media\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/ISO-OSI_Spaces.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/ISO-OSI_Spaces.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/ISO-OSI_Spaces.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/ISO-OSI_Spaces.png?resize=700%2C400&ssl=1 2x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/ISO-OSI_Spaces.png?resize=1050%2C600&ssl=1 3x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/02\/ISO-OSI_Spaces.png?resize=1400%2C800&ssl=1 4x"},"classes":[]},{"id":12162,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2021\/02\/19\/websocket-protokoll-ein-detaillierter-technischer-einblick\/","url_meta":{"origin":23781,"position":4},"title":"WebSocket-Protokoll: Ein detaillierter technischer Einblick","author":"Laurin Keim","date":"19. February 2021","format":false,"excerpt":"Das HTTP-Protokoll existiert seit Beginn des Internets und hat sich bis heute in Bezug auf Performance immer weiter entwickelt. Die vielen TCP-Verbindungs-Aufbau-Prozeduren wurden durch das Multiplexing auf ein paar Wenige reduziert, welche jeweils mehrere verschiedene Daten \u00fcbertragen [7]. Auch der Header selbst wurde auf Performance getrimmt. So wurde aus dem\u2026","rel":"","context":"In &quot;Interactive Media&quot;","block_context":{"text":"Interactive Media","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/interactive-media\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/01\/websocket-header.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/01\/websocket-header.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2021\/01\/websocket-header.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":23945,"url":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/2023\/02\/05\/jamstack-und-astro-vor-und-nachteile-einer-serverless-architektur\/","url_meta":{"origin":23781,"position":5},"title":"JAMStack und Astro:  Vor- und Nachteile einer serverless Architektur","author":"zack walker","date":"5. February 2023","format":false,"excerpt":"Einleitung Seit den fr\u00fchen Tagen der Web-Entwicklung hat die Performance von Websites eine wichtige Rolle gespielt. W\u00e4hrend sich das Internet im Laufe der Jahre weiterentwickelt hat, haben sich auch die Anforderungen an die Performance von Websites erh\u00f6ht. Benutzer erwarten eine schnelle und reibungslose Nutzererfahrung, unabh\u00e4ngig von der Gr\u00f6\u00dfe ihres Ger\u00e4ts\u2026","rel":"","context":"In &quot;Allgemein&quot;","block_context":{"text":"Allgemein","link":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/category\/allgemein\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-05-at-22.08.11.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-05-at-22.08.11.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-05-at-22.08.11.png?resize=525%2C300&ssl=1 1.5x, https:\/\/i0.wp.com\/blog.mi.hdm-stuttgart.de\/wp-content\/uploads\/2023\/02\/Screenshot-2023-02-05-at-22.08.11.png?resize=700%2C400&ssl=1 2x"},"classes":[]}],"jetpack_sharing_enabled":true,"authors":[{"term_id":883,"user_id":1068,"is_guest":0,"slug":"nw084","display_name":"Nicole W\u00f6lfel","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/27afc1c516822e34e6870f3b57706e727cf9cef2e45d513220faa99fc2aa4089?s=96&d=mm&r=g","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/23781","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/users\/1068"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/comments?post=23781"}],"version-history":[{"count":39,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/23781\/revisions"}],"predecessor-version":[{"id":23832,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/posts\/23781\/revisions\/23832"}],"wp:attachment":[{"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/media?parent=23781"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/categories?post=23781"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/tags?post=23781"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/blog.mi.hdm-stuttgart.de\/index.php\/wp-json\/wp\/v2\/ppma_author?post=23781"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}