Sven Rautenberg: HTTP-Proxyserver programmieren

Beitrag lesen

Moin!

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

[2] Wobei ich erstens für die exakte Zahl nicht meine Hand ins Feuer lege und zweitens von dieser Zahl noch Protokoll-Overhead abgehen könnte - krumm im Verhältnis zu 1024 Byte ist diese Zahl aber in jedem Fall, und bei anderen Verbindungen als Ethernet liegt diese maximale Paketgröße noch bei ganz anderen Werten (sowohl wesentlich größer als auch kleiner.

- Sven Rautenberg

--
ss:) zu:) ls:[ fo:} de:] va:) ch:] sh:) n4:# rl:| br:< js:| ie:( fl:( mo:|