10 Layer 6 - Die Darstellungsschicht

10.1 Einführung: Die Übersetzungsschicht

Die Darstellungsschicht (Presentation Layer) bildet die sechste Schicht im OSI-Referenzmodell und befindet sich zwischen der Sitzungsschicht (Layer 5) und der Anwendungsschicht (Layer 7). Sie ist verantwortlich für die Transformation von Daten in ein Format, das von der Anwendungsschicht verstanden werden kann, und umgekehrt. Im TCP/IP-Modell ist die Darstellungsschicht keine separate Ebene, sondern ihre Funktionen werden in der Anwendungsschicht implementiert.

10.2 Hauptaufgaben von Layer 6

  1. Datendarstellung (Syntax): Umwandlung zwischen verschiedenen Datenformaten
  2. Datenkompression: Reduzierung der zu übertragenden Datenmenge
  3. Verschlüsselung: Schutz der Daten vor unbefugtem Zugriff
  4. Zeichencodierung: Umwandlung zwischen verschiedenen Zeichensätzen

Die Darstellungsschicht fungiert als “Übersetzer” zwischen Anwendungen und dem Netzwerk, indem sie sicherstellt, dass Daten, die von einer Anwendung gesendet werden, für die Zielanwendung verständlich sind, unabhängig von Unterschieden in der internen Datenrepräsentation.

10.3 Datendarstellung und -formatierung

10.3.1 Datenformate und -strukturen

Die Darstellungsschicht behandelt die syntaktische Struktur der Daten:

10.3.1.1 Datenstrukturen in Programmiersprachen

10.3.1.2 Datenrepräsentation auf Bitebene

Beispiel: Der 32-Bit-Integer 0x12345678 wird dargestellt als:

// C-Beispiel zur Erkennung der Byte-Reihenfolge
#include <stdio.h>

int main() {
    union {
        uint32_t i;
        uint8_t c[4];
    } u;
    
    u.i = 0x12345678;
    
    if (u.c[0] == 0x12) {
        printf("Big Endian\n");
    } else if (u.c[0] == 0x78) {
        printf("Little Endian\n");
    }
    
    return 0;
}

10.3.2 Datencodierungsstandards

10.3.2.1 ASN.1 (Abstract Syntax Notation One)

ASN.1 ist eine Standardbeschreibungssprache für Datenstrukturen:

Beispiel einer ASN.1-Definition:

Person ::= SEQUENCE {
    name        VisibleString,
    age         INTEGER,
    email       VisibleString OPTIONAL
}

10.3.2.2 XDR (External Data Representation)

XDR ist ein Standard für die maschinenunabhängige Datendarstellung:

10.3.2.3 TLV (Type-Length-Value)

TLV ist ein flexibles Encoding-Format:

Beispiel einer TLV-Struktur:

| Typ (1 Byte) | Länge (2 Bytes) | Wert (n Bytes) |

10.4 Zeichencodierung

Die Darstellungsschicht behandelt die Umwandlung zwischen verschiedenen Zeichensätzen und -kodierungen.

10.4.1 Wichtige Zeichencodierungen

10.4.1.1 ASCII (American Standard Code for Information Interchange)

10.4.1.2 ISO-8859 Familie

10.4.1.3 Unicode und UTF-Formate

Beispiel der Zeichendarstellung: | Zeichen | Unicode | UTF-8 | UTF-16 | UTF-32 | |———|———|——-|——–|——–| | A | U+0041 | 41 | 0041 | 00000041 | | € | U+20AC | E2 82 AC | 20AC | 000020AC | | 你 | U+4F60 | E4 BD A0 | 4F60 | 00004F60 |

10.4.2 Zeichencodierung in Linux-Umgebungen

# Aktuelle Locale-Einstellungen anzeigen
$ locale
LANG=de_DE.UTF-8
LC_CTYPE=de_DE.UTF-8
LC_NUMERIC=de_DE.UTF-8
[...]

# Verfügbare Zeichenkodierungen anzeigen
$ iconv --list

# Datei von ISO-8859-1 nach UTF-8 konvertieren
$ iconv -f ISO-8859-1 -t UTF-8 input.txt -o output.txt

# Zeichenkodierung einer Datei erkennen
$ file -i document.txt
document.txt: text/plain; charset=utf-8

10.5 Datenkompression

Die Darstellungsschicht kann Daten komprimieren, um die Übertragungseffizienz zu erhöhen.

10.5.1 Kompressionsarten

10.5.1.1 Verlustfreie Kompression

10.5.1.2 Verlustbehaftete Kompression

10.5.2 Kompressionsbeispiele unter Linux

# Datei mit gzip komprimieren
$ gzip large_file.txt
# Erzeugt large_file.txt.gz

# Datei mit bzip2 komprimieren
$ bzip2 large_file.txt
# Erzeugt large_file.txt.bz2

# Mehrere Dateien mit tar archivieren und gleichzeitig komprimieren
$ tar -czvf archive.tar.gz directory/
# c = create, z = gzip, v = verbose, f = file

# tar mit bzip2-Kompression
$ tar -cjvf archive.tar.bz2 directory/
# j = bzip2

# Kompressionsrate vergleichen
$ ls -lh file.*
-rw-r--r-- 1 user group 10M file.txt
-rw-r--r-- 1 user group 2.5M file.txt.gz
-rw-r--r-- 1 user group 1.8M file.txt.bz2

10.6 Verschlüsselung und Sicherheit

Die Darstellungsschicht kann Daten verschlüsseln, um die Vertraulichkeit zu wahren.

10.6.1 Verschlüsselungsarten

10.6.1.1 Symmetrische Verschlüsselung

10.6.1.2 Asymmetrische Verschlüsselung

10.6.1.3 Hybride Verschlüsselung

10.6.2 Verschlüsselungsbeispiele unter Linux

# Symmetrische Verschlüsselung mit OpenSSL/AES
$ openssl enc -aes-256-cbc -salt -in plaintext.txt -out encrypted.bin
Enter encryption password:
Verifying - Enter encryption password:

# Entschlüsseln
$ openssl enc -d -aes-256-cbc -in encrypted.bin -out decrypted.txt
Enter decryption password:

# RSA-Schlüsselpaar generieren
$ openssl genrsa -out private.key 2048
$ openssl rsa -in private.key -pubout -out public.key

# Datei mit öffentlichem Schlüssel verschlüsseln
$ openssl rsautl -encrypt -pubin -inkey public.key -in secret.txt -out secret.enc

# Datei mit privatem Schlüssel entschlüsseln
$ openssl rsautl -decrypt -inkey private.key -in secret.enc -out secret.dec

10.7 Datenrepräsentationsformate

Die Darstellungsschicht behandelt auch die Umwandlung zwischen verschiedenen Datenrepräsentationsformaten.

10.7.1 Textbasierte Formate

10.7.1.1 XML (Extensible Markup Language)

Beispiel:

<person>
  <name>Max Mustermann</name>
  <age>30</age>
  <email>max@example.com</email>
</person>

10.7.1.2 JSON (JavaScript Object Notation)

Beispiel:

{
  "person": {
    "name": "Max Mustermann",
    "age": 30,
    "email": "max@example.com"
  }
}

10.7.1.3 YAML (YAML Ain’t Markup Language)

Beispiel:

person:
  name: Max Mustermann
  age: 30
  email: max@example.com

10.7.2 Binäre Formate

10.7.2.1 Protocol Buffers (Google)

Definitionsbeispiel (.proto):

message Person {
  required string name = 1;
  required int32 age = 2;
  optional string email = 3;
}

10.7.2.2 MessagePack

10.7.2.3 BSON (Binary JSON)

10.7.3 Vergleich der Formate

Beispiel einer einfachen Struktur in verschiedenen Formaten:

JSON (82 Bytes):

{"name":"Max Mustermann","age":30,"email":"max@example.com","active":true,"tags":["developer","sysadmin"]}

XML (143 Bytes):

<person>
  <name>Max Mustermann</name>
  <age>30</age>
  <email>max@example.com</email>
  <active>true</active>
  <tags>
    <tag>developer</tag>
    <tag>sysadmin</tag>
  </tags>
</person>

Protocol Buffers (ca. 51 Bytes, binär):

Kompakter binärer Datenstrom, nicht menschenlesbar

10.8 Layer 6 in der Praxis: Analyse und Debugging

10.8.1 MIME-Typen

MIME (Multipurpose Internet Mail Extensions) definiert Formate für den Datenaustausch:

Beispiele für MIME-Typen:

10.8.2 Content-Type-Header in HTTP

Der Content-Type-Header gibt das Format der übertragenen Daten an:

# HTTP-Anfrage mit JSON-Daten
POST /api/user HTTP/1.1
Host: example.com
Content-Type: application/json; charset=utf-8

{"name":"Max Mustermann","email":"max@example.com"}

# HTTP-Antwort mit XML-Daten
HTTP/1.1 200 OK
Content-Type: application/xml; charset=utf-8

<?xml version="1.0" encoding="UTF-8"?>
<response>
  <status>success</status>
  <message>User created</message>
</response>

10.8.3 Darstellungsschichtprobleme analysieren

10.8.3.1 Zeichenkodierungsprobleme

Typische Symptome:

Diagnose:

# Zeichenkodierung einer Datei prüfen
$ file -i problematic_file.txt
problematic_file.txt: text/plain; charset=iso-8859-1

# Inhalt mit hexdump anzeigen
$ hexdump -C problematic_file.txt | head
00000000  48 61 6c 6c 6f 2c 20 64  69 65 73 20 69 73 74 20  |Hallo, dies ist |
00000010  65 69 6e 20 54 65 73 74  20 6d 69 74 20 dc 6d 6c  |ein Test mit .ml|
00000020  61 75 74 65 6e 3a 20 e4  f6 fc c4 d6 dc 73 73 2e  |auten: ......ss.|

# Mit iconv konvertieren und prüfen
$ iconv -f ISO-8859-1 -t UTF-8 problematic_file.txt | hexdump -C | head

10.8.3.2 Kompressionsanalyse

# Komprimierte Daten identifizieren
$ file mysterious_file
mysterious_file: gzip compressed data, was "original.txt", last modified: ...

# Kompressionsformate identifizieren mit Signaturen
$ hexdump -C mysterious_file | head -1
00000000  1f 8b 08 00 00 00 00 00  00 03 ec bd 07 60 1c 49  |.............`.|

# HTTP-Kompression analysieren mit curl
$ curl -sI https://example.com | grep -i content-encoding
Content-Encoding: gzip

10.8.3.3 Verschlüsselungsprobleme

# TLS-Verbindung analysieren
$ openssl s_client -connect example.com:443
CONNECTED(00000003)
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
...
---
New, TLSv1.2, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit
...

# Zertifikatsprobleme untersuchen
$ openssl x509 -in certificate.pem -text -noout

10.9 Zusammenspiel mit anderen Schichten

10.9.1 Layer 5 (Sitzungsschicht)

10.9.2 Layer 7 (Anwendungsschicht)

10.9.3 Im TCP/IP-Modell

Im TCP/IP-Modell werden die OSI-Layer 5-7 in der Anwendungsschicht zusammengefasst:

10.10 Die wichtigsten Fakten

Die Darstellungsschicht spielt eine entscheidende Rolle bei der Überbrückung der Unterschiede zwischen verschiedenen Systemen und stellt sicher, dass Daten korrekt interpretiert werden können, unabhängig von der Plattform oder dem System, auf dem sie verarbeitet werden.