Axel Richter: HTTP-Proxyserver programmieren

Beitrag lesen

Hallo,

Bei PHP _weiß_ der Server von der Langsamkeit. Der Server liefert erst das durch PHP gelaufene HTML via HTTP aus. Der Client merkt von _dieser_ Langsamkeit nichts. Er sieht einen langsamen Server.

Bei einem Proxy denkt der Server, er liefere an einen User-Agent. Der Client meint, er erhielte von einem Server. Keiner der beiden nimmt Rücksicht auf Verzögerungen im Proxy.

Sorry, aber meiner Meinung nach erzählst du hier ziemlichen Unsinn.

Es ist alltäglichstes Brot einer asynchronen Datenverbindung, dass Daten nicht gleichmäßig schnell übertragen werden, sondern per Handshake in Häppchen, so schnell, wie die Gegenseite sie verarbeiten kann, abgefordert werden.

Denn ein Webserver mag zwar an einer 100MBit-Karte hängen, aber was ist, wenn ein Modem-Benutzer ankommt? Der zieht Stück für Stück seine IP-Pakete vom Server, und zwar höllisch langsam. Der Server aber wird ja nicht deswegen die Karte auf ultra-slow schalten, sondern weiterhin alle paar Sekunden ein IP-Paket für den Modemuser in maximaler Geschwindigkeit ausgeben.

Dieses Datenpaket wird zum zentralen Router gelangen, der es über den Provider-Uplink auf einer 1-GBit-Glasfaserleitung weiterleitet - es wird also nochmal beschleunigt. Und so nimmt das Datenpaket den Weg durchs Internet, bis es im Modemschrank des Zugangsproviders landet. Dort kommt es in einen Puffer und wartet darauf, langsam über die Telefonleitung versendet zu werden. Wenn es angekommen ist, wird ein Quittungspaket (bei TCP) zum Server versendet, der daraufhin das nächste Paket losschickt. [1]

[1] Weil das etwas lang dauern kann, haben die Netzwerker die Technik soweit entwickelt, dass der Sender zunächst eine ganze Anzahl von Paketen ohne Bestätigung senden kann. Wenn keines verloren geht, beschleunigt das die Übertragung ganz schön.

Ja, aber der Stream wird insgesamt flüssiger. Nicht:

  • l a n g e   P a u s e -4096Byte, sondern:
    -kurze Pause-1024Byte-kurze Pause-1024Byte-kurze Pause-1024Byte-kurze Pause-1024Byte

Aber bringt das was? Bestimmt nicht dem Server, denn der schickt ganz andere Pakete. Bei Ethernet beispielsweise 1500 Bytes im Block[2].

Ja, aber hier geht es gar nicht um die Geschwindigkeit der _Netzwerkübertragung_, sondern es wurde eine Software, der Java-Proxy, zwischengeschaltet, die die HTTP-Daten, im speziellen Problem den BODY, abfängt, manipuliert und dann erst an den Client weiterreicht. Die HTTP HEADER sind lange weg. Beim direkten Durchreichen funktionierte es ja. Für den Client sieht das dann so aus (Proxy gedanklich ausgeblendet):

GET -> Server sendet HEADER
Pause, weil der Proxy erstmal 4096 Byte in String wandelt, eine Ersetzung durchführt, wieder in Byte[] wandelt ...
-> Server sendet 4096 Byte BODY

Meine Vermutung war nun, dass diese Pause zu lang ist. Die letzte, jetzt funktionierende, Lösung ist, wie ich es verstanden habe, diese Arbeitsweise des Proxys bei text/html:

-alles Zeilenweise einlesen und dabei gleich manipulieren
-HEADER komplettieren mit neuer Content-Length(??)
-HEADER senden
-BODY senden

Auch hier ist die Pause zwischen Header und Body nun weg. Die Frage ist, ob das der Grund für das funktionieren ist, oder, wie Andreas glaubt, der "richtige" Content-Length-HEADER, der aber, meiner Meinung nach, bei text/html _wirklich_ keine Bedeutung hat.

viele Grüße

Axel