7 HTTP und Zeichensatzbasierte Übertragung

HTTP ist darauf ausgelegt, zeichensatzbasierte Daten zu übertragen.

7.1 Was bedeutet zeichensatzbasiert?

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.

7.2 Binäre Daten und Zeichensätze

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”.

7.3 Übertragung von nicht-zeichensatzbasierten Daten

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.

7.4 Base64-Encoding

7.4.1 Was ist 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 /)

7.4.2 Funktionsweise des Base64-Encoding

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.

7.4.2.1 Beispiel:

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

7.4.3 Dekodierung von Base64

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.

7.5 Übertragung von Daten mit HTTP

7.5.1 Zeichensatzbasierte Daten

HTTP kann problemlos zeichensatzbasierte Daten wie HTML, CSS, JavaScript und einfache Textdateien übertragen, da diese Daten direkt in lesbare Zeichenketten umgewandelt werden können.

7.5.2 Nicht-zeichensatzbasierte Daten

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.

7.6 HTTP-Header vs. HTTP-Body

7.6.1 Binäre Daten im HTTP-Body

7.6.2 Beispiele für Binärdaten im HTTP-Body

7.7 HTTP Zeichensatz

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:

7.7.1 Zeichensatz der HTTP-Header

7.7.2 Zeichensatz des HTTP-Body

Für den HTTP-Body können jedoch unterschiedliche Zeichensätze verwendet werden, die im Content-Type-Header spezifiziert werden.

7.7.2.1 Beispiel für Content-Type mit Zeichensatz

Dieser 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.

7.7.3 Zusammenfassung

7.7.4 Beispiel für eine vollständige HTTP-Nachricht

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.