Inhalt

    Serverantwort 206 Partial Content

    Definition des Statuscodes 206 (Partial Content)

    Der HTTP-Statuscode 206 (Partial Content) zeigt an, dass der Server die partielle Anfrage des Clients erfolgreich verarbeitet hat und nur den angeforderten Teil der Ressource zurückgibt. Dieser Statuscode wird häufig verwendet, wenn der Client nur einen Teil einer Datei anfordert. Dies ist besonders nützlich beim Streaming von Daten oder beim Herunterladen großer Dateien.

    206 - Partial Content

    Ein typisches Beispiel für die Verwendung des Statuscodes 206 ist der Download großer Mediendateien, bei dem der Benutzer nur einen bestimmten Abschnitt der Datei anfordert. Weitere Situationen, in denen der Statuscode 206 Anwendung findet, sind:

    • Streaming von Videos und Audios.
    • Wiederaufnahme unterbrochener Downloads.
    • Effiziente Nutzung von Bandbreite durch Anforderung spezifischer Teile einer Datei.

    Praktische Beispiele für die Anwendung des Statuscodes 206

    Nutzung beim Herunterladen großer Dateien

    Wenn ein Client eine große Datei herunterladen möchte, kann er eine Anfrage stellen, die nur einen bestimmten Teil dieser Datei abruft. Dies geschieht in der Regel über den HTTP-Header Range.

    Beispielanfrage mit dem Range-Header

    Ein Client könnte eine Anfrage wie folgt stellen:

    GET /beispiel.mp4 HTTP/1.1
    Host: www.beispielseite.de
    Range: bytes=0-499

    Hier fordert der Client die ersten 500 Bytes der Datei an. Der Server würde dann mit dem Statuscode 206 antworten und den angeforderten Teil der Datei zurückgeben.

    Anwendung im Streaming von Video und Audio

    Bei der Übertragung von Medieninhalten wird der Statuscode 206 verwendet, um Teile eines Videos oder Audios in einer kontrollierten Art und Weise zu übertragen. Dies ermöglicht eine nahtlose Benutzererfahrung, da Daten in kleinen Abschnitten zwischengespeichert und abgespielt werden können.

    Ein Beispiel für die Implementierung auf Server- und Clientseite könnte so aussehen:

    1. Der Client sendet eine Anfrage mit dem Range-Header.
    2. Der Server überprüft die angeforderte Reichweite und sendet die entsprechenden Bytes zurück.
    3. Der Client puffert die empfangenen Daten und spielt sie ab.

    Nutzung in CDN (Content Delivery Network)

    CDNs verwenden den Statuscode 206, um die Ladezeiten für Benutzer zu optimieren. Durch die Verwendung von Partial Content können CDNs die Daten effizienter bereitstellen, indem sie nur die angeforderten Teile einer Datei an die Benutzer senden.

    Beispiele für Anfragen mit dem Range-Header

    Format des Range-Headers

    Der Range-Header wird verwendet, um den gewünschten Bereich der Daten anzugeben. Das Format sieht wie folgt aus:

    Range: bytes=start-end

    Beispielanfragen für den Erhalt bestimmter Bytebereiche einer Datei könnten sein:

    • Range: bytes=100-200 (fordert Bytes 100 bis 200 an)
    • Range: bytes=-500 (fordert die letzten 500 Bytes an)

    Ein Server würde dann mit dem Statuscode 206 antworten und die entsprechenden Header bereitstellen:

    HTTP/1.1 206 Partial Content
    Content-Range: bytes 100-200/1234

    Verarbeitung des Statuscodes 206 in verschiedenen Programmiersprachen

    PHP

    In PHP kann die partielle Dateiübertragung wie folgt implementiert werden:

    
    $file = 'beispiel.mp4';
    $size = filesize($file);
    $length = $size;
    $start = 0;
    $end = $size - 1;
    
    if (isset($_SERVER['HTTP_RANGE'])) {
        list($start, $end) = explode('-', substr($_SERVER['HTTP_RANGE'], 6), 2);
        $start = intval($start);
        $end = intval($end) ?: $size - 1;
        $length = $end - $start + 1;
        header("HTTP/1.1 206 Partial Content");
        header("Content-Range: bytes $start-$end/$size");
    } else {
        header("HTTP/1.1 200 OK");
    }
    header("Content-Length: $length");
    header("Content-Type: video/mp4");
    readfile($file);
    

    Python

    In Python kann der Flask-Framework verwendet werden, um partielle Anfragen zu verarbeiten:

    
    from flask import Flask, request, Response
    
    app = Flask(__name__)
    
    @app.route('/beispiel.mp4')
    def get_file():
        range_header = request.headers.get('Range', None)
        if not range_header:
            return Response(open('beispiel.mp4', 'rb'), mimetype='video/mp4')
        
        start, end = range_header.replace('bytes=', '').split('-')
        start = int(start)
        end = int(end) if end else None
        file = open('beispiel.mp4', 'rb')
        file.seek(start)
        
        data = file.read(end - start + 1 if end else None)
        response = Response(data, status=206, mimetype='video/mp4')
        response.headers.add('Content-Range', f'bytes {start}-{end}/{file_size}')
        return response
    

    Node.js

    In Node.js kann Express für die Verarbeitung von Anfragen mit dem Range-Header eingesetzt werden:

    
    const express = require('express');
    const fs = require('fs');
    const app = express();
    
    app.get('/beispiel.mp4', (req, res) => {
        const range = req.headers.range;
        if (!range) {
            return res.status(200).sendFile('beispiel.mp4');
        }
        
        const fileSize = fs.statSync('beispiel.mp4').size;
        const start = Number(range.replace(/\D/g, ''));
        const end = fileSize - 1;
        
        res.writeHead(206, {
            'Content-Range': bytes ${start}-${end}/${fileSize},
            'Accept-Ranges': 'bytes',
            'Content-Length': end - start + 1,
            'Content-Type': 'video/mp4',
        });
        
        const stream = fs.createReadStream('beispiel.mp4', { start, end });
        stream.pipe(res);
    });
    

    Mögliche Fehler und deren Behebung

    Bei der Implementierung des Statuscodes 206 können verschiedene Fehler auftreten, insbesondere bei der Handhabung der Range-Header. Zu den häufigsten Problemen gehören:

    • Ungültige Range-Header, die zu einem 416-Fehler (Range Not Satisfiable) führen können.
    • Fehlerhafte Berechnung der Dateigrößen und der Bereiche.

    Um diese Probleme zu vermeiden, sollten Entwickler:

    1. Die Range-Header auf Gültigkeit überprüfen und sicherstellen, dass die angeforderten Bereiche innerhalb der Dateigröße liegen.
    2. Umfassende Tests durchführen, um sicherzustellen, dass die Implementierung unter verschiedenen Bedingungen stabil funktioniert.