<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Allgemein Archive - Maximilian Krieg</title>
	<atom:link href="https://maximiliankrieg.de/category/allgemein/feed/" rel="self" type="application/rss+xml" />
	<link>https://maximiliankrieg.de/category/allgemein/</link>
	<description>Wissen, Technik &#38; Erfahrungen</description>
	<lastBuildDate>Sat, 20 Jun 2026 09:26:15 +0000</lastBuildDate>
	<language>de</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://maximiliankrieg.de/wp-content/uploads/2026/05/cropped-20260524_logo_2_512-2-32x32.png</url>
	<title>Allgemein Archive - Maximilian Krieg</title>
	<link>https://maximiliankrieg.de/category/allgemein/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Verteilte Systeme (Teil 2)</title>
		<link>https://maximiliankrieg.de/2014/07/verteilte-systeme-teil-2/</link>
					<comments>https://maximiliankrieg.de/2014/07/verteilte-systeme-teil-2/#respond</comments>
		
		<dc:creator><![CDATA[Maximilian]]></dc:creator>
		<pubDate>Thu, 03 Jul 2014 09:24:00 +0000</pubDate>
				<category><![CDATA[Allgemein]]></category>
		<guid isPermaLink="false">https://maximiliankrieg.de/?p=3175</guid>

					<description><![CDATA[<p>Ein verteiltes System ist im Prinzip der Zusammenschluss mehrerer Rechner zur Lösung einer gemeinsamen Aufgabe. Eines der größten verteilten Systeme ist das Internet mit seinen&#8230;</p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2014/07/verteilte-systeme-teil-2/">Verteilte Systeme (Teil 2)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Ein verteiltes System ist im Prinzip der Zusammenschluss mehrerer Rechner zur Lösung einer gemeinsamen Aufgabe. Eines der größten verteilten Systeme ist das Internet mit seinen Applikationen. Teil 2 beschreibt die Kommunikation über das Netzwerk mittels TCP, UDP und Sockets. Im Anschluss folgt die Verwendung von Remote Procedure Calls.</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>Skript-Annfang</th><td>VS_1_So2014 &#8211; Seite 1</td></tr><tr><th>Skript-Ende</th><td>VS_6_So2014 &#8211; Seite 70</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">Netzwerkkommunikation</h3>



<h4 class="wp-block-heading">Kommunikationsformen</h4>



<p class="wp-block-paragraph">Welche Kommunikationsformen gibt es?</p>



<ul class="wp-block-list">
<li>Verbindungslos (<em>UDP</em>)</li>



<li>Verbindungsorientiert (<em>TCP</em>)</li>



<li>Synchron (<em>Blockiert und wartet auf Antwort</em>)</li>



<li>Asynchron (<em>Kein Blockieren</em>)</li>
</ul>



<p class="wp-block-paragraph">Wo sind die Unterschiede zwischen verbindungsloser und verbindungsorientierter Kommunikation?</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>&nbsp;</td><td>Verbindungslos</td><td>Verbindungsorientiert</td></tr><tr><td>Protokoll</td><td>UDP</td><td>TCP</td></tr><tr><td>Reales Beispiel</td><td>Brief</td><td>Telefongespräch</td></tr><tr><td>Verbindung</td><td>Wird nicht ausgehandelt</td><td>Wird ausgehandelt mittels Handshake (<em>Auf- und Abbau</em>)</td></tr><tr><td>Paketverlust</td><td>Kann passieren</td><td>Zustellung wird garantiert</td></tr><tr><td>Reihenfolge</td><td>Nicht gewährleistet und muss von Anwendung geprüft werden</td><td>Reihenfolge wird garantiert</td></tr><tr><td>Broadcast/Multicast</td><td>Ja</td><td>Nein</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Was ist die synchrone Kommunikation?</p>



<ul class="wp-block-list">
<li>Sender wird blockiert bis Antwort eintrifft</li>
</ul>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a3d32d4ae7fa&quot;}" data-wp-interactive="core/image" data-wp-key="6a3d32d4ae7fa" class="wp-block-image size-full wp-lightbox-container"><img fetchpriority="high" decoding="async" width="253" height="286" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_synchron.png" alt="" class="wp-image-3176"/><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Was ist die asynchrone Kommunikation?</p>



<ul class="wp-block-list">
<li>Sender wird nicht blockiert</li>



<li>Ergebnis muss explizit gesendet werden</li>
</ul>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a3d32d4aec30&quot;}" data-wp-interactive="core/image" data-wp-key="6a3d32d4aec30" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" width="253" height="332" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_asynchron.png" alt="" class="wp-image-3177" srcset="https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_asynchron.png 253w, https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_asynchron-229x300.png 229w" sizes="(max-width: 253px) 100vw, 253px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Welche Kommunikationsform ist am besten geeignet in einem verteilten System?</p>



<ul class="wp-block-list">
<li>Das kommt auf die Art des verteilten Systems an</li>
</ul>



<p class="wp-block-paragraph">Was kann bei synchroner Kommunikation passieren?</p>



<ul class="wp-block-list">
<li>Wenn eine Nachricht verloren geht, wird der Absender blockiert</li>



<li>Wenn der Empfänger ausfällt, wird der Absender blockiert</li>
</ul>



<h4 class="wp-block-heading">Qualitätsparameter</h4>



<p class="wp-block-paragraph">Welche Qualitätsparameter gibt es?</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><td>Merkmal</td><td>Beschreibung</td></tr><tr><td>Latenz</td><td>Dauer des Transfers einer leeren Nachricht zwischen Sender und Empfänger</td></tr><tr><td>Datentransferrate</td><td>Datenmenge, die innerhalb einer Zeiteinheit über einen Übertragungskanal übertragen wird</td></tr><tr><td>Nachrichtentransferzeit</td><td>Dauer des Transfers einer Nachricht (<em>Latenz + Datenmenge / Datentransferrate</em>)</td></tr><tr><td>Durchsatz</td><td>Datenmenge pro Zeiteinheit</td></tr><tr><td>Bandbreite</td><td>Maximale Übertragungsrate</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Warum ist Latenz nicht gleich Nachrichtentransferzeit?</p>



<ul class="wp-block-list">
<li>Die Latenzzeit ist die Zeit, die eine Nachricht ohne Nutzdaten durch die Kommunikationsschichten und das Netzwerk braucht</li>



<li>Die Nachrichtentransferzeit errechnet sich aus Latenz + Datenmenge / Datentransferrate</li>
</ul>



<p class="wp-block-paragraph">Bei welchen Anwendungen ist Latenz, wo ist Bandbreite wichtiger?</p>



<ul class="wp-block-list">
<li>Latenz wird benötigt, wenn Informationen schnell von System A zu System B transportieren müssen</li>



<li>Bandbreite wird benötigt, wenn große Datenmengen von System A zu System B transportieren müssen</li>
</ul>



<p class="wp-block-paragraph">Warum kann die Bandbreite i.d.R. von einer Anwendung nicht voll ausgeschöpft werden?</p>



<ul class="wp-block-list">
<li>Pakete werden immer mit einem Header versehen, der selbst einen Teil der Bandbreite beansprucht</li>



<li>Die Bandbreite wird in der Regel von mehreren Anwendungen gleichzeitig beansprucht</li>
</ul>



<p class="wp-block-paragraph">Warum ist das wichtig für verteilte Systeme?</p>



<ul class="wp-block-list">
<li>Der Durchsatz von Daten im Netz ist limitiert</li>



<li>Daten müssen bei Synchronisation schnell übertragen werden</li>
</ul>



<h4 class="wp-block-heading">Netzwerkgrundlagen</h4>



<p class="wp-block-paragraph">Wie ist ein Paket aufgebaut?</p>



<ul class="wp-block-list">
<li>Protokolldaten (<em>Header</em>) besteht aus Adressen, Ports und TTL</li>



<li>Nutzdaten</li>
</ul>



<p class="wp-block-paragraph">Was ist das OSI-Schichtenmodell?</p>



<ul class="wp-block-list">
<li>7 Schichten mit funktionalen Teilaufgaben</li>



<li>Jede Schicht hat eigene Protokolle</li>



<li>Jedes Protokoll fügt seinen eigenen Header an die Pakete an</li>



<li>Nachrichten durchlaufen diese 7 Schichten</li>



<li>Verteilte Systeme arbeiten auf Schicht 4 bis 7</li>
</ul>



<p class="wp-block-paragraph">Wie funktioniert das Internet?</p>



<ul class="wp-block-list">
<li>Es besteht aus vielen heterogenen unabhängigen Netzwerken</li>



<li>Diese Netzwerke werden mit Routern verbunden</li>



<li>Die Router stehen miteinander in Verbindung</li>



<li>Pakete werden aus dem Netzwerk an den Router geleitet</li>



<li>Beim Ziel leitet ein Router die Pakete wieder in ein Netzwerk</li>
</ul>



<p class="wp-block-paragraph">Was ist Routing?</p>



<ul class="wp-block-list">
<li>Mehrere mögliche Wege zwischen Sender und Empfänger</li>



<li>Routing wählt anhand einer Metrik den besten Weg</li>



<li>Beeinflusst dadurch die Übertragungsdauer von Nachrichten</li>
</ul>



<h4 class="wp-block-heading">Protokolle</h4>



<p class="wp-block-paragraph">Was ist das IP-Protokoll?</p>



<ul class="wp-block-list">
<li>Logische IP-Adressierung</li>



<li>Arbeitet auf Layer 3</li>



<li>Verbindungslos (<em>Paketverluste möglich</em>)</li>



<li>Duplikate möglich</li>



<li>Keine Reihenfolge</li>
</ul>



<p class="wp-block-paragraph">Was ist das UDP-Protokoll?</p>



<ul class="wp-block-list">
<li>Zusätzliches Attribut &#8222;Port&#8220; für Adressierung von Diensten</li>



<li>Verbindungslos (<em>Paketverluste möglich</em>)</li>



<li>Duplikate möglich</li>



<li>Keine Reihenfolge</li>



<li>Arbeitet auf Layer 4</li>



<li>Multicast-fähig</li>



<li>Kleinerer Header (<em>schneller</em>)</li>



<li>Maximal 64 KB große Pakete</li>
</ul>



<p class="wp-block-paragraph">Was ist das TCP-Protokoll?</p>



<ul class="wp-block-list">
<li>Zusätzliches Attribut &#8222;Port&#8220; für Adressierung von Diensten</li>



<li>Verbindungsorientiert (<em>Keine Paketverluste</em>)</li>



<li>Keine Duplikate (<em>Verwerfen</em>)</li>



<li>Reihenfolge wird eingehalten</li>



<li>Arbeitet auf Layer 4</li>



<li>Kein Multicast</li>



<li>Größerer Header (<em>langsamer</em>)</li>
</ul>



<p class="wp-block-paragraph">Welches Protokoll ist für welche verteilte Anwendung am besten geeignet?</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>Anwendung</th><th>Protokoll</th></tr><tr><td>Videokonferenz</td><td>UDP</td></tr><tr><td>DNS</td><td>UDP/TCP</td></tr><tr><td>Bank-Transaktionen</td><td>TCP</td></tr><tr><td>Webserver</td><td>TCP</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Für welche Qualitätsparameter ist der Paketaufbau wichtig?</p>



<ul class="wp-block-list">
<li>Für alle Parameter, die von der Datenmenge abhängen wie die Nachrichtentransferzeit</li>
</ul>



<p class="wp-block-paragraph">Welche Probleme kann es dennoch geben?</p>



<ul class="wp-block-list">
<li>Pakete können trotz aller Maßnahmen verloren gehen</li>



<li>Pufferüberlauf oder Nichtabholen von UDP-Paketen</li>



<li>Deadlocks</li>
</ul>



<p class="wp-block-paragraph">Was macht man im Fehlerfall?</p>



<ul class="wp-block-list">
<li>Nicht blockieren</li>



<li>Timeouts</li>



<li><code>setsockopt</code> oder <code>select</code></li>
</ul>



<h4 class="wp-block-heading">Sockets</h4>



<p class="wp-block-paragraph">Was sind Sockets?</p>



<ul class="wp-block-list">
<li>Bi-direktionaler Kommunikationsendpunkt</li>



<li>Wird von UDP und TCP genutzt</li>



<li>Wird als Objekt im Speicher dargestellt</li>



<li>Besteht aus IP-Adresse und Port</li>



<li>Ports von Client und Server können unterschiedlich sein</li>
</ul>



<p class="wp-block-paragraph">Was braucht man zum Datenaustausch, um ein funktionierendes verteiltes System aufzubauen?</p>



<ul class="wp-block-list">
<li>Gemeinsames Datenformat</li>
</ul>



<p class="wp-block-paragraph">Sockets mit UDP</p>



<ul class="wp-block-list">
<li>Entwickler müssen sich selbst um Reihenfolge, Segmentierung und Fehlerkorrektur kümmern</li>



<li><code>send</code>(<em>2x 5 Byte</em>) werden als <code>recv</code>(<em>2x 5 Byte</em>) empfangen</li>



<li>Verlorene Datenpakete müssen beachtet werden</li>



<li>Ein Socket kann an viele Adressen Pakete schicken</li>
</ul>



<p class="wp-block-paragraph">Wie läuft die Kommunikation mit UDP-Sockets ab?</p>



<ul class="wp-block-list">
<li>Nachricht kleiner als 64 KB wird versendet mittels <code>sendto()</code></li>



<li>Socket empfängt mittels <code>recvfrom()</code> &#8211; alles (<em>ok</em>), nichts (<em>Verlust</em>) oder nur einen Teil (<em>Puffer zu klein</em>)</li>
</ul>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a3d32d4b0088&quot;}" data-wp-interactive="core/image" data-wp-key="6a3d32d4b0088" class="wp-block-image size-full wp-lightbox-container"><img decoding="async" width="542" height="673" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_udp.png" alt="" class="wp-image-3178" srcset="https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_udp.png 542w, https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_udp-242x300.png 242w" sizes="(max-width: 542px) 100vw, 542px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Was passiert, wenn man den Server an keine Adresse bindet?</p>



<ul class="wp-block-list">
<li>Server bzw. Dienste werden auf festen Adressen angesprochen</li>



<li>Clients wissen sonst nicht, wohin sie sich verbinden sollen</li>



<li>Das System weist dann seinem Dienst selbst einen Port zu</li>



<li>Bei Clients ist das egal, der Server antwortet bei Anfragen auf den Quellport des Clients</li>
</ul>



<p class="wp-block-paragraph">Woher weiß das UDP-Socket wie groß die Nachricht ist?</p>



<ul class="wp-block-list">
<li>Zeichen für Anfang und Ende</li>



<li>Protokoll mit Header-Informationen</li>
</ul>



<p class="wp-block-paragraph">Wie verschickt man Nachrichten größer als 64 KB?</p>



<ul class="wp-block-list">
<li>Aufteilen der Nachricht in kleinere Blöcke</li>



<li>While-Schleife mit <code>recvfrom()</code> bis alle Daten empfangen sind</li>
</ul>



<p class="wp-block-paragraph">Sockets mit TCP</p>



<ul class="wp-block-list">
<li>Verbindung muss im Programm aufgebaut werden</li>



<li>Pakete werden als Datenstrom versendet (<em>Automatische Segmentierung</em>)</li>



<li><code>send</code>(<em>2x 5 Byte</em>) werden als <code>recv</code>(<em>1x 10 Byte</em>) empfangen</li>
</ul>



<p class="wp-block-paragraph">Was passiert wenn der Server eine Anfrage akzeptiert?</p>



<ul class="wp-block-list">
<li>Erzeugt einen neuen Socket über den nun kommuniziert wird</li>



<li>Der eigentliche Socket wartet weiter auf neue Anfragen</li>
</ul>



<p class="wp-block-paragraph">Wie läuft die Kommunikation mit TCP-Sockets ab?</p>



<ul class="wp-block-list">
<li>Nachricht wird definiert und versendet mittels <code>send()</code></li>



<li>Socket auf Empfängerseite empfängt mittels <code>recv()</code> &#8211; alles (<em>ok</em>), nichts (<em>Verlust</em>) oder beliebig viele Teilnachrichten</li>
</ul>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a3d32d4b0761&quot;}" data-wp-interactive="core/image" data-wp-key="6a3d32d4b0761" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="534" height="673" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_tcp.png" alt="" class="wp-image-3179" srcset="https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_tcp.png 534w, https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_tcp-238x300.png 238w" sizes="auto, (max-width: 534px) 100vw, 534px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Was passiert in der Anwendung wenn Pakete verloren gehen oder vertauscht werden?</p>



<ul class="wp-block-list">
<li>Datenstrom verzögert oder angehalten</li>



<li>Verbindung bricht ab (<em>recv = -1</em>)</li>
</ul>



<p class="wp-block-paragraph">Woher weiß das TCP-Socket wie lang die Nachricht ist?</p>



<ul class="wp-block-list">
<li>Wenn <code>recv()</code> 0 zurück liefert, ist die TCP-Verbindung erfolgreich abgebaut und alle Pakete empfangen</li>



<li>Wenn <code>recv()</code> X > 0 zurück liefert, wurden X Byte empfangen</li>
</ul>



<p class="wp-block-paragraph">Sind Sockets synchron?</p>



<ul class="wp-block-list">
<li>Standardmäßig sind alle Aufrufe synchron bzw. blockierend</li>
</ul>



<p class="wp-block-paragraph">Wie kann man asynchrones Verhalten erreichen?</p>



<ul class="wp-block-list">
<li>Threads mit eigenen Sockets</li>



<li>Socket nicht-blockierend schalten mittels setsockopt und regelmäßig Daten pollen</li>



<li>Select-Funktion überwacht die Sockets</li>
</ul>



<p class="wp-block-paragraph">Warum ist der Einsatz von select asynchron?</p>



<ul class="wp-block-list">
<li>Es wird nur ein Thread blockiert und nicht viele Threads</li>
</ul>



<p class="wp-block-paragraph">Was bringen Sockets im Hinblick auf die Transparenzeigenschaften?</p>



<ul class="wp-block-list">
<li>Nichts</li>
</ul>



<p class="wp-block-paragraph">was bringen Sockets im Hinblick auf die anderen Ziele eines verteilten Systems?</p>



<ul class="wp-block-list">
<li>Offenheit</li>
</ul>



<h4 class="wp-block-heading">Datenformate</h4>



<p class="wp-block-paragraph">Was passiert, wenn man einen Integer über ein Socket zu einem anderen Rechner schickt und dort ausgibt?</p>



<ul class="wp-block-list">
<li>Die Bitfolge der Zahl ist invertiert</li>



<li>Die Zahl befindet sich in network byte order (<em>big endian</em>)</li>



<li>Sie muss über einen Befehl korrigiert werden</li>
</ul>



<p class="wp-block-paragraph">Welche Zahlenumwandlungen gibt es?</p>



<ul class="wp-block-list">
<li><code>ntohs</code> &#8211; network-to-host short</li>



<li><code>ntohl</code> &#8211; network-to-host long</li>



<li><code>htons</code> &#8211; host-to-network short</li>



<li><code>htonl</code> &#8211; host-to-network long</li>
</ul>



<h4 class="wp-block-heading">Remote Procedure Calls (RPC)</h4>



<p class="wp-block-paragraph">Was sind RPCs?</p>



<ul class="wp-block-list">
<li>Technik zur Realisierung von Interprozesskommunikation</li>



<li>1 Funktionsaufruf statt vieler Socketfunktionen</li>



<li>Schnittstellen verbergen Komplexität</li>



<li>Lokaler Funktionsaufruf zu einem Stub für Parameter und Rückgabewert</li>
</ul>



<p class="wp-block-paragraph">Welche Ziele guter verteilter Systeme werden erfüllt?</p>



<ul class="wp-block-list">
<li>Verteilungstransparenz</li>



<li>Einfacher Zugriff auf Ressourcen</li>
</ul>



<p class="wp-block-paragraph">Wie funktioniert ein Stub?</p>



<ol class="wp-block-list">
<li>Client ruft Funktion auf, die auf einen Stub zugreift</li>



<li>Client-Stubs erstellen aus den Parametern Nachrichten (<em>Serialisierung/marshalling</em>)</li>



<li>Stubs transportieren diese Nachrichten mittels Transportprotokoll über das Netzwerk (<em>send/recv</em>)</li>



<li>Server-Stubs werden entpackt (<em>Deserialisierung/demarshalling</em>)</li>



<li>Parameter werden rekonstruiert und die Server-Funktion aufgerufen</li>
</ol>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a3d32d4b1223&quot;}" data-wp-interactive="core/image" data-wp-key="6a3d32d4b1223" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="426" height="557" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_stub.png" alt="" class="wp-image-3180" srcset="https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_stub.png 426w, https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_stub-229x300.png 229w" sizes="auto, (max-width: 426px) 100vw, 426px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Müssen wie bei Sockets die Zahlen konvertiert werden?</p>



<ul class="wp-block-list">
<li>Nein, das passiert innerhalb der Stubs</li>



<li>RPCs liefern dafür eigene Datentypen mit</li>
</ul>



<p class="wp-block-paragraph">Was sind die Vorteile von RPCs?</p>



<ul class="wp-block-list">
<li>Bequemere, einfachere Beschreibung der Datenübertragung</li>



<li>Synchrone und asynchrone Aufrufe</li>



<li>Transportprotokolle können frei ausgewählt werden</li>
</ul>



<p class="wp-block-paragraph">Was sind die Nachteile von RPCs?</p>



<ul class="wp-block-list">
<li>Kein gemeinsamer Adressraum (<em>keine Pointer oder Referenzen</em>)</li>



<li>RPCs sind standardmäßig unverschlüsselt</li>



<li>RPCs sind weniger performant</li>



<li>Keine Fehlerbehandlung</li>



<li>Sockets sind flexibler (<em>Keine Einschränkungen</em>)</li>



<li>Viele Dinge müssen immer noch selbst erledigt werden (<em>IDL compilieren, Daemons starten und Adressierungen</em>)</li>
</ul>



<p class="wp-block-paragraph">Was ist eine Interface Definition Language (IDL)?</p>



<ul class="wp-block-list">
<li>Jede RPC-Technik hat eine eigene Beschreibungssprache (<em>Interface Definition Language</em>)</li>



<li>Definiert die unterstützen Datentypen</li>



<li>Beschreibt die RPC Funktionen (<em>nur Signatur, keine Implementierung</em>)</li>



<li>Compiler erzeugt Stubs bzw. Quellcode für Client und Server</li>



<li>Der Vorlagen-Code muss dann ergänzt werden</li>
</ul>



<p class="wp-block-paragraph">Woher kommen die Stubs?</p>



<ul class="wp-block-list">
<li>Compiler erzeugt die Stubs aus der IDL</li>
</ul>



<p class="wp-block-paragraph">Wie implementiert man Aufruf und Funktion?</p>



<ul class="wp-block-list">
<li>Werden selbst implementiert</li>
</ul>



<p class="wp-block-paragraph">Welche Programmiersprachen werden unterstützt?</p>



<figure class="wp-block-table"><table class="has-fixed-layout"><tbody><tr><th>Framework</th><th>Sprachen</th></tr><tr><td>Apache Thrift</td><td>C, C++, Java u.v.m.</td></tr><tr><td>Sun ONC-RPC</td><td>C</td></tr><tr><td>XML-RPC</td><td>RPC Aufrufe als XML codiert</td></tr><tr><td>JSON-RPC</td><td>Wie XML-RPC, nur mit JSON</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">Wie implementiert man einen Service?</p>



<ol class="wp-block-list">
<li>Schnittstelle in IDL formulieren</li>



<li>IDL compilieren</li>



<li>Funktionen auf Server implementieren</li>



<li>Funktionsaufrufe im Client implementieren</li>
</ol>



<h4 class="wp-block-heading">Apache Thrift</h4>



<p class="wp-block-paragraph">Welche Protokolle verwendet Thrift?</p>



<ul class="wp-block-list">
<li>Netzwerkprotokolle austauschbar</li>



<li>Standardmäßig wird TCP verwendet</li>
</ul>



<p class="wp-block-paragraph">Wie adressiert man den Server?</p>



<ul class="wp-block-list">
<li>IP-Adresse und Port im Client</li>
</ul>



<p class="wp-block-paragraph">Welche Datentypen kennt Thrift?</p>



<ul class="wp-block-list">
<li>bool</li>



<li>binary</li>



<li>byte</li>



<li>i16, i32 und i64</li>



<li>string</li>



<li>struct</li>



<li>list</li>



<li>set</li>



<li>map</li>
</ul>



<p class="wp-block-paragraph">Wie implementiert man die IDL bzw. Schnittstelle?</p>



<pre class="wp-block-preformatted">service Calculator {
 void ping(),  
} 

 i32 add(1: i32 num1, 2: i32 num2)</pre>



<p class="wp-block-paragraph">Wie kompiliert man die IDL?</p>



<pre class="wp-block-preformatted">$&gt; thrift gen cpp calc.thrift</pre>



<p class="wp-block-paragraph">Wie implementiert man den Server?</p>



<pre class="wp-block-preformatted">class calculatorHandler : virtual public calculatorIf 
{
	public:   
	calculatorHandler() 
	{
		// Your initialization goes here  
	}
	 
	void ping() 
	{    
		// Your implementation goes here   
		printf("ping\n");
	}   

	int32_t add(const int32_t num1, const int32_t num2) 
	{
		// Your implementation goes here    
		printf("add\n");  
	}
};  

int main(int argc, char **argv) {
	int port = 9090;  
	shared_ptr&lt;calculatorHandler&gt; handler(new calculatorHandler());  
	shared_ptr&lt;TProcessor&gt; processor(new calculatorProcessor(handler));  
	shared_ptr&lt;TServerTransport&gt; serverTransport(new TServerSocket(port));   
	shared_ptr&lt;TTransportFactory&gt; transportFactory(new TBufferedTransportFactory());  
	shared_ptr&lt;TProtocolFactory&gt; protocolFactory(new TBinaryProtocolFactory());  
	TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);  
	server.serve();  
	return 0;
}</pre>



<p class="wp-block-paragraph">Wie implementiert man den Client?</p>



<pre class="wp-block-preformatted">#include "calculator.h"

int main() 
{
	try
	{
		// Variablen initialisieren
		int n1 = 2, n2 = 3;
		
		// Verbindung auf Port 9090 öffnen
		shared_ptr&lt;TSocket&gt; socket(new TSocket("localhost", 9090)); 
		shared_ptr&lt;TTransport&gt; transport(new TBufferedTransport(socket));
		shared_ptr&lt;TProtocol&gt; protocol(new TBinaryProtocol(transport));
		CalculatorClient client(protocol); 
		transport-&gt;open();

		// Aufruf der Serverfunktion mit Rückgabewert
		int result = client.add(n1,n2);

		// Verbindung schließen
		transport-&gt;close();

		// Ausgabe
		cout &lt;&lt; n1 &lt;&lt; " + " &lt;&lt; n2 &lt;&lt; " = " &lt;&lt; result &lt;&lt; endl; 
	} 
	catch(TException &amp;tx) 
	{
		cout &lt;&lt; "error calling server: " &lt;&lt; tx.what() &lt;&lt; endl;
	} 
	return 0;
}</pre>



<p class="wp-block-paragraph">Wie implementiert man eigene Datentypen?</p>



<pre class="wp-block-preformatted">struct UserProfile { 
	1: i32 uid,  
	2: string name,  
	3: string blurb 
}

service UserStorage {  
	void store(1: UserProfile user), 
	UserProfile retrieve(1: i32 uid) 
}</pre>



<h4 class="wp-block-heading">ONC RPC</h4>



<p class="wp-block-paragraph">Was ist ONC RPC?</p>



<ul class="wp-block-list">
<li>Eine der ersten RPC Implementierungen</li>



<li>Implementiert im Network File System (NFS)</li>



<li>Entwickler schreibt IDL, Client und Server</li>



<li>Im Server wird keine IP-Adresse und kein Port angegeben</li>



<li>Server wird über einen Daemon adressiert</li>
</ul>



<p class="wp-block-paragraph">Welche Datenformate unterstützt ONC RPC?</p>



<ul class="wp-block-list">
<li>(unsigned) int</li>



<li>(unsigned) float</li>



<li>string</li>



<li>bool</li>



<li>struct</li>



<li>union</li>
</ul>



<p class="wp-block-paragraph">Wie sieht eine Schnittstelle aus?</p>



<pre class="wp-block-preformatted">/* calc.x: Remote calculator */
struct numbers {  
 int n1;
 int n2; 
};
 
 program CALCULATORPROG {
     version CALCULATORVERS {
        int add(numbers) = 1;
   } = 1;
} = 0x20000001; 

//version = 0x20000001
//program = 1</pre>



<figure data-wp-context="{&quot;imageId&quot;:&quot;6a3d32d4b20b3&quot;}" data-wp-interactive="core/image" data-wp-key="6a3d32d4b20b3" class="wp-block-image size-full wp-lightbox-container"><img loading="lazy" decoding="async" width="564" height="542" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on--click="actions.showLightbox" data-wp-on--load="callbacks.setButtonStyles" data-wp-on--pointerdown="actions.preloadImage" data-wp-on--pointerenter="actions.preloadImageWithDelay" data-wp-on--pointerleave="actions.cancelPreload" data-wp-on-window--resize="callbacks.setButtonStyles" src="https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_onc.png" alt="" class="wp-image-3181" srcset="https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_onc.png 564w, https://maximiliankrieg.de/wp-content/uploads/2026/06/20140703_vs_onc-300x288.png 300w" sizes="auto, (max-width: 564px) 100vw, 564px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			data-wp-bind--aria-label="state.thisImage.triggerButtonAriaLabel"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on--click="actions.showLightbox"
			data-wp-style--right="state.thisImage.buttonRight"
			data-wp-style--top="state.thisImage.buttonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>



<p class="wp-block-paragraph">Wie findet der Client den Server ohne Port?</p>



<ul class="wp-block-list">
<li>Man benötigt einen Mechanismus, um RPC Server adressieren zu können</li>



<li>RPC daemon (<em>rpcbind/portmap</em>) auf jedem der beteiligten Rechner (<em>Client und Server</em>)</li>



<li>Beim Start des Servers registriert sich der Server bei einem lokalen Daemon</li>



<li>Der Client muss die IDs für <code>version</code> und <code>program</code> angeben</li>



<li>Client benötigt nur die IP-Adresse des Servers</li>



<li>Port des Daemons ist festgelegt auf 111</li>
</ul>



<h4 class="wp-block-heading">XML-RPC</h4>



<p class="wp-block-paragraph">Was ist XML-RPC?</p>



<ul class="wp-block-list">
<li>XML als Datenaustauschformat</li>



<li>Große Anzahl an unterstützten Sprachen</li>



<li>HTTP als Transportprotokoll</li>



<li>Als Server kann ein Webserver dienen, der XML-RPC versteht</li>



<li>Keine Schnittstellensprache</li>
</ul>



<p class="wp-block-paragraph">Wie sieht ein Aufruf aus?</p>



<pre class="wp-block-preformatted">POST /RPC2 HTTP/1.0 
User-Agent: Frontier/5.1.2 (WinNT) 
Host: betty.userland.com 
Content-Type: text/xml 
Content-length: 181 

&lt;?xml version="1.0"?&gt;  
 &lt;methodCall&gt; 
  &lt;methodName&gt;examples.getStateName&lt;/methodName&gt; 
  &lt;params&gt; 
   &lt;param&gt; &lt;value&gt;&lt;i4&gt;41&lt;/i4&gt;&lt;/value&gt; &lt;/param
  &lt;/params&gt; 
 &lt;/methodCall&gt;  
&lt;/?xml&gt;</pre>



<p class="wp-block-paragraph">Wie sieht eine Antwort aus?</p>



<pre class="wp-block-preformatted">HTTP/1.1 200 OK 
Connection: close 
Content-Length: 158 
Content-Type: text/xml 
Date: Fri, 17 Jul 1998 19:55:08 GMT  
Server: UserLand Frontier/5.1.2-WinNT

&lt;?xml version="1.0"?&gt;  
 &lt;methodResponse&gt; 
  &lt;params&gt; 
   &lt;param&gt; &lt;value&gt;&lt;string&gt;South Dakota&lt;/string&gt;&lt;/value&gt; &lt;/param&gt;  
  &lt;/params&gt; 
 &lt;/methodResponse&gt;  
 &lt;/?xml&gt;</pre>



<p class="wp-block-paragraph">Wie sieht ein Client aus?</p>



<pre class="wp-block-preformatted">string const serverUrl("http://localhost:8080/RPC2"); 
string const methodName("sample.add");

xmlrpc_c::clientSimple myClient; 
xmlrpc_c::value result;  

// Aufruf
myClient.call(serverUrl, methodName, "ii", &amp;result, 5, 7); 

// Ergebnis
int const sum = xmlrpc_c::value_int(result); 

cout &lt;&lt; "Result of RPC (sum of 5 and 7): " &lt;&lt; sum &lt;&lt; endl;</pre>



<p class="wp-block-paragraph">Wie sieht ein Server aus?</p>



<pre class="wp-block-preformatted">class sampleAddMethod : public xmlrpc_c::method { 
public:  
 sampleAddMethod() { 
// signature and help strings are documentation -- the client 
// can query this information with a system.methodSignature and  
// system.methodHelp RPC. 
this-&gt;_signature = "i:ii"; 
// method's result and two arguments are integers 
this-&gt;_help = "This method adds two integers together";  
} 
 void execute(xmlrpc_c::paramList const&amp; paramList,  
      xmlrpc_c::value * const retvalP) { 
  int const addend(paramList.getInt(0)); 
  int const adder(paramList.getInt(1)); 
  paramList.verifyEnd(2);  
  *retvalP = xmlrpc_c::value_int(addend + adder); 
 }</pre>



<h4 class="wp-block-heading">Protocol Buffers</h4>



<p class="wp-block-paragraph">Was sind Protocol Buffers?</p>



<ul class="wp-block-list">
<li>Austauschformat für Datenstrukturen</li>



<li>Bieten Serialisierung und Deserialisierung an</li>



<li>Übertragung läuft über Sockets</li>
</ul>



<p class="wp-block-paragraph">Was sind die Vorteile?</p>



<ul class="wp-block-list">
<li>Maximale Flexibilität bei der Implementierung der Übertragung</li>
</ul>



<p class="wp-block-paragraph">Was sind die Nachteile?</p>



<ul class="wp-block-list">
<li>Netzwerkkommunikation über Sockets muss selbst erledigt werden</li>
</ul>



<p class="wp-block-paragraph"></p>
<p>Der Beitrag <a href="https://maximiliankrieg.de/2014/07/verteilte-systeme-teil-2/">Verteilte Systeme (Teil 2)</a> erschien zuerst auf <a href="https://maximiliankrieg.de">Maximilian Krieg</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://maximiliankrieg.de/2014/07/verteilte-systeme-teil-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
