HTTP ist darauf ausgelegt, zeichensatzbasierte Daten zu übertragen.
Das HTTP-Protokoll (HyperText Transfer Protocol) ist ein zeichensatzbasiertes Protokoll. Dies bedeutet, dass die Kommunikation zwischen Client und Server hauptsächlich in Form von Zeichenketten erfolgt, die nach bestimmten Zeichensätzen interpretiert werden. Zeichensätze sind Standards, die eine Zuordnung von binären Daten (Bits und Bytes) zu lesbaren Zeichen (Buchstaben, Ziffern, Symbole) festlegen.
Obwohl die zugrunde liegenden Daten binär sind, werden diese binären
Daten durch Zeichensätze wie ASCII (American Standard Code for
Information Interchange) oder UTF-8 in lesbare Zeichen umgewandelt. Zum
Beispiel entspricht das Byte 01000001 im ASCII-Zeichensatz
dem Buchstaben “A”.
Da HTTP ursprünglich nicht für binäre Daten ausgelegt ist, müssen nicht-zeichensatzbasierte Daten wie Bilder, Videos oder Binärdateien in ein zeichensatzbasiertes Format umgewandelt werden. Eine gängige Methode zur Umwandlung ist das Base64-Encoding.
Base64-Encoding ist eine Methode zur Kodierung binärer Daten in eine Zeichenkette aus ASCII-Zeichen. Es verwendet einen speziellen Zeichensatz, der aus den folgenden 64 Zeichen besteht: - Großbuchstaben (A-Z) - Kleinbuchstaben (a-z) - Ziffern (0-9) - Zwei zusätzliche Zeichen (+ und /)
Base64 teilt die binären Daten in 6-Bit-Gruppen auf und ordnet jede
Gruppe einem Zeichen aus dem Base64-Zeichensatz zu. Da ein Byte aus 8
Bit besteht, wird jeder 3-Byte-Block der binären Daten in 4
Base64-Zeichen umgewandelt. Falls die Anzahl der Bytes nicht durch 3
teilbar ist, werden die fehlenden Bits durch Padding (=)
ergänzt.
Angenommen, wir haben die binären Daten
01000001 01000010 01000011: 1. Teile die Daten in
6-Bit-Gruppen: 010000 010100 000101 000011 2. Ordne jeder
6-Bit-Gruppe ein Base64-Zeichen zu: - 010000 = Q -
010100 = U - 000101 = F - 000011
= D 3. Das Ergebnis ist die Base64-Zeichenkette: QUFD
Um die ursprünglichen binären Daten wiederherzustellen, wird der Prozess umgekehrt: 1. Jedes Base64-Zeichen wird in eine 6-Bit-Gruppen umgewandelt. 2. Die 6-Bit-Gruppen werden zu den ursprünglichen 8-Bit-Bytes zusammengefügt.
HTTP kann problemlos zeichensatzbasierte Daten wie HTML, CSS, JavaScript und einfache Textdateien übertragen, da diese Daten direkt in lesbare Zeichenketten umgewandelt werden können.
Nicht-zeichensatzbasierte Daten, wie Bilder, Videos und Binärdateien, müssen vor der Übertragung über HTTP in ein zeichensatzbasiertes Format umgewandelt werden, beispielsweise durch Base64-Encoding. Dies ermöglicht es HTTP, diese Daten korrekt zu übertragen, obwohl das Protokoll ursprünglich nicht für binäre Daten konzipiert wurde.
HTTP-Header: Die Header in HTTP-Nachrichten sind immer zeichensatzbasiert. Sie bestehen aus Schlüssel-Wert-Paaren, die verschiedene Metadaten zur Übertragung der Nachricht enthalten. Diese Daten sind in der Regel im ASCII- oder UTF-8-Zeichensatz kodiert.
HTTP-Body: Der Body einer HTTP-Nachricht kann sowohl zeichensatzbasierte als auch binäre Daten enthalten. Es gibt keine Beschränkung auf druckbare oder lesbare Zeichen. Binäre Daten wie Bilder, Videos oder andere Dateien können direkt im Body übertragen werden.
Direkte Übertragung: Binäre Daten können direkt in den HTTP-Body geschrieben und übertragen werden, ohne dass sie in ein zeichenbasiertes Format wie Base64 umgewandelt werden müssen.
Beispiel:
POST /upload HTTP/1.1
Host: example.com
Content-Type: application/octet-stream
Content-Length: 1024
[binäre Daten direkt im Body]Content-Type: Der
Content-Type-Header gibt an, welcher Medientyp im HTTP-Body
enthalten ist. Für binäre Daten wird häufig
application/octet-stream verwendet, während für Textdaten
Typen wie text/plain oder text/html verwendet
werden.
Bilddatei:
POST /upload HTTP/1.1
Host: example.com
Content-Type: image/png
Content-Length: 2048
[binäre Bilddaten]Video-Datei:
POST /upload HTTP/1.1
Host: example.com
Content-Type: video/mp4
Content-Length: 8192
[binäre Videodaten]Der Zeichensatz für die HTTP-Header selbst ist nicht explizit in den Headern der HTTP-Nachricht festgelegt, da die HTTP-Header gemäß den HTTP/1.1-Spezifikationen immer im US-ASCII-Zeichensatz kodiert sind. Hier sind die wichtigsten Punkte dazu:
Für den HTTP-Body können jedoch unterschiedliche Zeichensätze
verwendet werden, die im Content-Type-Header spezifiziert
werden.
Textdaten mit spezifischem Zeichensatz:
Content-Type: text/html; charset=UTF-8Dieser Content-Type-Header gibt an, dass der HTTP-Body
HTML-Daten im UTF-8-Zeichensatz enthält. Der Zeichensatz
(charset) Parameter gibt an, wie die Textdaten im Body zu
interpretieren sind.
Content-Type-Header festgelegt, der den Medientyp und
optional den Zeichensatz (charset) spezifiziert.POST /submit HTTP/1.1
Host: example.com
Content-Type: text/plain; charset=UTF-8
Content-Length: 20
Dies ist ein Text.
In diesem Beispiel sind die HTTP-Header in US-ASCII kodiert, und der
Content-Type-Header gibt an, dass der Body im
UTF-8-Zeichensatz vorliegt.