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.
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.
Die Darstellungsschicht behandelt die syntaktische Struktur der Daten:
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;
}ASN.1 ist eine Standardbeschreibungssprache für Datenstrukturen:
Beispiel einer ASN.1-Definition:
Person ::= SEQUENCE {
name VisibleString,
age INTEGER,
email VisibleString OPTIONAL
}
XDR ist ein Standard für die maschinenunabhängige Datendarstellung:
TLV ist ein flexibles Encoding-Format:
Beispiel einer TLV-Struktur:
| Typ (1 Byte) | Länge (2 Bytes) | Wert (n Bytes) |
Die Darstellungsschicht behandelt die Umwandlung zwischen verschiedenen Zeichensätzen und -kodierungen.
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 |
# 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-8Die Darstellungsschicht kann Daten komprimieren, um die Übertragungseffizienz zu erhöhen.
# 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.bz2Die Darstellungsschicht kann Daten verschlüsseln, um die Vertraulichkeit zu wahren.
# 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.decDie Darstellungsschicht behandelt auch die Umwandlung zwischen verschiedenen Datenrepräsentationsformaten.
Beispiel:
<person>
<name>Max Mustermann</name>
<age>30</age>
<email>max@example.com</email>
</person>Beispiel:
{
"person": {
"name": "Max Mustermann",
"age": 30,
"email": "max@example.com"
}
}Beispiel:
person:
name: Max Mustermann
age: 30
email: max@example.comDefinitionsbeispiel (.proto):
message Person {
required string name = 1;
required int32 age = 2;
optional string email = 3;
}
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
MIME (Multipurpose Internet Mail Extensions) definiert Formate für den Datenaustausch:
type/subtype; parameter=valueBeispiele für MIME-Typen:
text/plain: Einfacher Texttext/html: HTML-Dokumentapplication/json: JSON-Datenimage/jpeg: JPEG-Bildaudio/mpeg: MP3-Audiovideo/mp4: MP4-VideoDer 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>
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# 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# 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 -nooutIm TCP/IP-Modell werden die OSI-Layer 5-7 in der Anwendungsschicht zusammengefasst:
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.