TOP

Netzwerk Glasfaserverkabelung

Aufbau
Kern (leitet das Licht)
Silizium-Germanium-Oxid (Glasart) oder neuer auch div. Kunststoffe
Kunststoffhülle (umgibt den Kern)
Gelmantel (ermöglicht geringfügige Biegung des Kerns)
Schutzhülle (mechanischer Schutz)
Geschwindigkeit
100 MBit/s bis 1GigaBit/s (üblich) je nach Hardware auch bis zu 10 GigaBit/s

(experimentell sind bereits Geschwindigkeiten von bis zu 1000 TerraBit/s erreicht worden)
Maximale Länge
Abhängig von Faser- / Sender- / Detektortyp bis zu 120 km ohne Verstärker
mit Verstärker > 1000 km

Physikalische Funktionsweise
Der Lichtstrahl bewegt durch Totalreflektion durch das Kabel. Eine Totalreflektion kann nur funktionieren, wenn das Licht innerhalb eines bestimmten Winkel (Aperturkegel) auf die Grenzschicht trifft. Anderenfalls wird das Licht nach außen gebrochen.

Stufenindexfaser (Art des Faserkerns)
Da die Reflexion oder Brechung nur an dem Übergang zweiter Schichten möglich ist, ist de Faserkern aus zwei Schichten aufgebaut. Sie haben unterschiedliche Brechungsindices ( n = \frac{c_0}{c}  \geq 1 ). Es gilt n_{Kern} > n_{Mantel} .

Störeinflüsse bei Glasfaserkabeln
Es gibt eine Dämpfung des Signal aufgrund von Absorption und Streuung. Des weiteren ist auch der Faserkern nicht komplett rein, dort befinden sich auch OH Verbindungen, welche das Licht besonders stark absorbieren. Deshalb ist es wichtig, Anschlussstellen und Glasfaserkabel von Wasser fern zu halten.
Weiterhin kann eine zu starke Biegung des Kabels den Weg der Reflektion stören und dadurch zu Verlusten führen.

Moden und Modendispersion
Die Wellen, welche ein Glasfaserkabel transportieren kann werden auch Moden genannt. Diese sind Abhängig vom Kerndurchmesser und dem Brechungsindex. Dies sind pro Kabel i.d.R. 10^3 bis 10^7 Stück. Moden werden durch den Winkel zur optischen Achse unterschieden. Da diese mit verschiedenen Winkeln in das Kabel geschickt werden, kommt es zu Laufzeitunterschieden des Signals. Der maximale Varianz der Moden beschränkt die Länge des Signals ohne das es zu einem Zusammenfließen der verschiedenen Moden kommt (dies wird auch als Modendispersion bezeichnet).
(Weitere Dispersionsarten: Polarisationsdispersion, chromatische Dispersion)

Gradientenindexfaser (Art des Faserkerns)
Um die Laufzeitunterschiede zu minimieren wird der Faserkern mit Fremdatomen dotiert. Als Folge besitzt er nun keinen konstanten Brechungsindex mehr, sondern dieser nimmt von außen nach innen immer mehr zu. Der Mantel bleibt dabei unverändert.
Nun benötigen Signale, welche sich im Zentrum des Kernes bewegen länger als diese am Rand. Dies korrigiert die Modendispersion.

Mono- und Singlemode-Faser
Möchte man die Dispersion vollkommen vermeiden, so kann man nur noch einen Mode zulassen. Dann spricht man von Mono- oder Singlemode-Fasern.

Optimierung zur Geschwindigkeitserhöhung

Wavelength Dispersion Multiplexing (WDM)
Dabei werden Laser mit verschiedenen Wellenlängen parallel verwendet. Die Laser sollten einen Wellenlängenabstand von 20 nm haben. Pro Laser lässt sich ca. 2,5 GigaBit/s übertragen. Am Detektor (Empfänger) werden die Wellenlängen wieder durch Filter aufgeteilt.

Dense Wavelength Division Multiplexing (DWDM)
Ist im Vergleich zu WDM deutlich aufwändiger und teurer. Es wird hauptsächlich auf sehr langen Strecken eingesetzt. Dabei muss der Abstand der Wellenlänge nur noch 1 nm betragen. Dabei werden Datenraten von 40 GBit/s erreicht.

Read More
TOP

Netzwerkverkabelung mit metallischen Kabeln

Thin Wire (veraltet)
Material
Koaxialkabel
Stecker
T-Stücke und BNC-Stecker
Geschwindigkeit
10 MBit/s (50 MBit/s theoretisch möglich)
Maximale Länge:
180m pro Strang + 4 Vestärker = 900m
Wellenwiderstand
50 Ω
Besonderheiten
Alle offenen oder auch nicht benutzten Enden müssen mit einem Terminatorwiderstand von 50Ω abgeschlossen werden.

Vorteile:

Schrimung
Durch die gute Schirmung eines Koaxialkabels (Faraday’scher Käfig) kann es auch in hoher Strahlenbelastung verlegt werden. In letzter Zeit übernimmt aber dieses Einsatzgebiet das Glasfaserkabel.

Nachteile:

Ausfallrisiko
Wenn eine Strang unterbrochen, beschädigt oder der Terminatorwiderstand entfernt wird ist der ganze Strang außer Betrieb gesetzt.
Universelle Gebäudeverkabelung
Material
4 jeweils ineinander verdrillte Aderpaare mit Schrimung je nach Kabeltyp (Cat)
Die Verdrillung soll entstehende Magnetfelder neutralisieren (NEXT Near End Crosstalk vermeiden).
Stecker
8-polige Westernstecker
Geschwindigkeit
100 MBit/s (max. zwei Geräte pro Kabel)
1000 MBit/s (ein Gerät pro Kabel 4x 250 MBit/s Kanäle )
Maximale Länge:
100m pro Segment + 4 Vestärker = 500m
Wellenwiderstand
100 Ω
Besonderheiten
Werden zwei Endgeräte (Hub/PC) direkt miteinander verbunden, so wird ein Cross Over Kabel benötigt. (Pin 1->2 und Pin 3->6).
Dies wird jedoch durch Geräte/Netzwerkkarten, welche MDI-Autosensing besitzen umgangen.

Vorteile:

State of the Art / Universelle Verwendbarkeit
Die Verwendung von Universeller Gebäudeverkablung ermöglicht die einmal verlegten Kabel flexibel einzusetzen (Telefon, Türsprechstelle, etc.).

Nachteile:

Störungsempfindlichkeit gegenüber EMP
In Umgebungen mit starker elektromagnetischer Strahlung kann es zu Störungen oder Ausfällen kommen.
Read More
TOP

Sortieralgorithmen: SelectionSort

Vorgehensweise:
Der SelectionSort sucht sich das kleinste Element in einer Liste (Array) und setzt dieses an den Anfang. Dies wird nun für die verbleibenden Elemente wiederholt. Die Bereits an den Anfang gesetzten Elemente werden dabei nicht noch einmal durchlaufen.

Implementierung

  public static int[] selectionSort(int[] array) {
 
    // Für alle Elemente im Array.
    for (int i = 0; i < array.length; i++) {
 
      /*
       * Nehme an, dass die erste verbleibende Zahl in der
       * unsortierten Menge die kleinste ist. Wenn nicht wird dies
       * später korrigiert.
       */
      int idx_min = i;
 
      // Für alle noch nicht sortierten Elemente.
      for (int j = i + 1; j < array.length; j++) {
 
        /*
         * Wenn das aktuelle Element kleiner ist als das aktuelle
         * Minimum.
         */
        if (array[j] < array[idx_min]) {
          // Speichere die Position des neuen Minimums.
          idx_min = j;
        }
      }
 
      /*
       * Nach dem Durchlauf aller verbliebenen unsortierten
       * Elemente sind wir sicher, dass die Zahl in idx_min das
       * kleinste Element beinhaltet. Dies wird nun mit dem an der
       * ersten unsortierten Stelle gespeicherten Element
       * getauscht.
       */
      array = swap(array, i, idx_min);
 
    }
    return array;
  }

Zeitkomplexität:
Der Algorithmus besteht zum Großteil aus zwei for Schleifen. Dies legt die Vermutung nahe, dass es sich um einen Alogrithmus der Zeitkomplexität von O(n^2) handelt.

In der hier implementierten Form wird die erste Schleife bei einem zu sortierenden Array mit n einträgen n mal durchlaufen.
Die zweite Schleife jedoch nur n-1 mal. Bei der Laufzeitbetrachtung dürfen jedoch alle Konstanten weggelassen werden. (siehe Blog Artikel über Komplexität).

Es gilt also: Selection Sort: O(n^2)

Anmerkungen/Verbesserungsmöglichkeiten:

Eigentlich müsste die erste Schleife nur array.length-1 mal durchlaufen werden, da das letzte Element zwangsläufig das größte ist. Dies Fällt jedoch nur bei extrem kleinen Arrays ins Gewicht, bei denen aber wohl die Laufzeit sowie so egal ist.

Eine weiter mögliche Optimierung besteht darin unnötige swap abzufangen. Bei einem zum Großteil vorsortierten Array würde das Element mit sich selbst ersetzt werden wenn es wirklich bereits das nächst größte ist. Die kann jedoch mit einer Abfrage ob sich idx_min geändert hat umgangen werden. Aber da diese Abfrage auch Resourcen kostet ist die Optimierung je nach erwarteten Arrays (vorsortiert, teilsortiert) abzuwägen.

  if (idx_min != i)
      array = swap(array, i, idx_min);
Read More
TOP

Begriff der Komplexität

Der Begriff der Komplexität (auch Zeitkomplexität) wird in der Informatik verwendet, um das Laufzeitverhalten eines Algorithmus abzuschätzen.
Es ist nur sehr schwer möglich die wahre Laufzeit eines Programmes zu berechnen, da dies von sehr vielen Faktoren abhängt, wie beispielsweise dem Prozessor, dem Speicher oder auch dem Betriebssystem. Deshalb begnügt man sich damit, die Komplexität in verschiedene Klassen einzuteilen. Die Klassen heißen O-Notationen (auch BigO Funktion).

T = O ( 1 )
konstante Zeitkomplexität (unabhängig von der Problemgröße)
T = O ( \log n )
logarithmische Zeitkomplexität
T = O ( n )
lineare Zeitkomplexität
T = O ( n\log n )
linear logarithmische Zeitkomplexität
T = O (n^2 )
quadratische Zeitkomplexität
T = O ( n^3 )
kubische Zeitkomplexität
T = O ( n^k )
polynomiale Zeitkomplexität
T = O ( 2^n )
exponentielle Zeitkomplexität
T = O ( k^n )
exponentielle Zeitkomplexität

Aus der Sicht eines Informatikers sind die O-Notationen welche am Anfang der Tabelle stehen besser als die am Ende. Oftmals sind exponentielle Probleme/Algorithmen praktisch nicht mehr berechenbar (siehe div. Verschlüsselungsalgorithmen, welchen einen exponentiellen Aufwand zum “knacken” benötigen).

Eine weitere Begrifflichkeit ist dabei der average-, worst- und best case. Diese beschreiben die durchschnittliche Laufzeit (average), die ungünstigste Laufzeit (worst) und die best mögliche Laufzeit (best). Die Betrachtung des best cases ist zur Risikoabschätzung unnötig. Der best case wird manchmal auch als \Omega( ) bezeichnet.

Die Berechnung der Zeitkomplexität kann durchaus sehr kompliziert sein, ich will das Grundprinzip aber hier anhand einiger einfacher Beispiele erläutern.

Summenformel:
\sum\limits_{i=1}^{n}i =  1 + 2 + 3 + \dots (n-1) + n

Eine Umsetzung in Programmcode würde dementsprechend so aussehen:

public int summe(int n ) {
  int sum = 0;
  for( int i=1; i<=n; i++) {
    sum += i;
  }
  return sum;
}

Daraus lässt sich erkennen, das die Schleife n-mal durchlaufen werden muss, bis das Ergebnis feststeht. Daher kann man sagen, dass dieser Algorithmus eine Laufzeit von O( n ) – also eine lineare Zeitkomplexität hat.

Nun könnte aber jemand erwidern, dass man die Summenformel auch nach dieser Methode ausrechnen könnte:

\sum\limits_{i=1}^{n}i = \frac{n(n+1)}{2}
(warum dies Funktioniert? siehe kleiner Gauß)

public int summe(int n ) {
 return (n * (n-1))/2;
}

Wäre Carl Friedrich Gauß nicht bereits vor uns darauf gekommen könnten wir nun mit Stolz sagen, wir haben die optimale Lösung (zumindest bzgl. der Zeitkomplexität) der Summenfunktion gefunden. Es leuchtet ein, das egal wie groß die Zahl n ist, diese Funktion nur einmal abgearbeitet werden muss um das Ergebnis zu erhalten. Also hat diese Formel eine Laufzeit von O(1) – also eine konstante Zeitkomplexität.

Mit dem nächsten Beispiel möchte ich euch eine einfache Funktion der Zeitkomplexität O( n^2 ) zeigen. Angenommen wir wollen alle Elemente einer n x n Matrix auf addieren:

public int summiere( int[][] matrix ) {
  int sum = 0;
  for( int i=0; i<n; i++ ) {
    for( int j=0; j<n; j++ ) {
      sum += matrix[i][j]
    }
  }
}

Die erste for-Schleife wird nun n-mal durchlaufen, die zweite ebenfalls. Daraus kann man schließen, das die Zeitkomplexität dieser Funktion von n \cdot n = n^2 abhängt. Dies bedeutet sie hat eine quadratische Laufzeit O(n^2) .

Auf diese weiße lassen sich einfache Funktionen bereits sehr gut bestimmen.

Bei einer Analyse kann durchaus auch einmal folgendes herauskommen:

t = 4\cdot n^3 + 3 \cdot n + 10^n + 1000

Hier gilt nun, dass erst einmal alle konstanten Faktoren sowie Summanden weggelassen werden dürfen. Nun bleibt folgendes übrig:

 t = n^3 +  n + 10^n

Die zweite wichtige Regel lautet, dass nur das am stärksten wachsende Glied berücksichtigt werden muss. Ein Blick auf die Aufstellung der O-Notationen hilft uns dabei zu erkennen, dass in diesem Fall nur das Glied 10^n ausschlaggebend ist. Es wächst am schnellsten. (Wir erinnern uns, die Tabelle ist von geringer Laufzeit aufsteigend geordnet.) Es gilt also O(10^n) – eine exponentielle Zeitkomplexität.

Weiterführende Literatur (Amazon):

Read More
TOP

Zweite IP Adresse für vServer einrichten

Mein Provider war so freundlich mir kostenlos eine zweite IP Adresse für meine vServer zur Verfügung zu stellen. Über diese war dann aber die Webseite nicht erreichbar. Nach einigem überlegen ist mir klar geworden, dass der Server ja noch gar nichts von der neuen Adresse weiß.

Um einen zweite IP Adresse für eine Netzwerkkarte einzurichten muss die Datei /etc/network/interfaces bearbeitet werden. Am einfachsten kopiert man einfach die Konfiguration der ersten IP Adresse, ersetzt eth0 durch eth0:1 und trägt die neue IP unter address ein. Nach einem Neustart des Netzwerkprozesses durch /etc/init.d/networking restart ist der Server auch unter der zweiten IP erreichbar.
Ob alle Einstellungen korrekt übernommen wurden lässt sich mit ifconfig eth0 überprüfen.

/etc/network/interfaces:

auto eth0
iface eth0 inet static
        address 79.142.51.211
        [...] // hier die weitere Konfiguration
 
auto eth0:1
iface eth0:1 inet static
        address 79.241.55.110
        [...] // hier die weitere Konfiguration
Read More