Warum kann der Browser keine gzip-Anfrage senden?

68

Wenn der Webserver eine gzip-Antwort senden kann, warum kann der Browser dann keine gzip-Anfrage senden?

Ihr Mann
quelle

Antworten:

61

Der Client und der Server müssen sich auf die Kommunikation einigen. Ein Teil davon ist, ob die Kommunikation komprimiert werden kann. HTTP wurde als Anforderungs- / Antwortmodell konzipiert, und die ursprüngliche Erstellung sollte mit ziemlicher Sicherheit immer kleine Anforderungen und potenziell große Antworten enthalten. Für die Implementierung von HTTP ist keine Komprimierung erforderlich . Es gibt sowohl Server als auch Clients, die dies nicht unterstützen.

Die HTTP-Komprimierung wird vom Client implementiert und gibt an, dass sie die Komprimierung unterstützen kann. Wenn der Server dies in der Anforderung sieht und die Komprimierung unterstützt, kann er die Antwort komprimieren. Um die Anforderung zu komprimieren, müsste der Client eine "Voranforderung" haben, die tatsächlich ausgehandelt hat, dass die Anforderung komprimiert werden soll, ODER es müsste eine Komprimierung als unterstützte Codierung für ALLE Anforderungen erforderlich sein.

* UPDATE Feb '17 * Es sind 8 Jahre vergangen, aber wie @ Phil_1984_ feststellt, besteht eine dritte mögliche Lösung darin, dass Client und Server die Komprimierungsunterstützung aushandeln und diese dann für nachfolgende Anforderungen verwenden. Tatsächlich funktionieren Dinge wie HSTS genau so mit dem Client-Caching, dass der Server erwartet, nur TLS zu sprechen und unverschlüsselte Links zu ignorieren. HTTP wurde explizit als zustandslos konzipiert, aber wir sind an dieser Stelle darüber hinausgegangen.

Peter Oehlert
quelle
Ein Server fällt also einfach aus, wenn er dann keine Komprimierung unterstützt?
jjxtra
2
"Die Spezifikation erfordert keine Komprimierung. Es gibt sowohl Server als auch Clients, die dies nicht unterstützen." Der Kunde beginnt mit den Worten: "Hey, ich spreche Französisch, oder?" Der Server antwortet und antwortet entweder auf Englisch oder Französisch, je nachdem, ob er Französisch kann oder nicht. Französisch in diesem Beispiel ist Komprimierung. Wenn der Client auf Anfrage des OP sofort mit dem Sprechen auf Französisch beginnen könnte, müssten alle Server Französisch sprechen, oder das System würde ausfallen. Das System erlaubt nur komprimierte Antworten, gerade weil es verhandeln muss und beide Systeme übereinstimmen.
Peter Oehlert
1
Sehr gut erklärt. Keine Komprimierung mit kleiner Anforderung übertrifft (normalerweise) die Komprimierung mit Aushandlung vor der Anforderung.
Ron
1
Eine dritte Option (die bequemerweise übersehen wird) besteht darin, dass sich der Client / Browser daran erinnert, dass der Server die Komprimierung akzeptiert und komprimierte Daten später in der Verbindung veröffentlicht, wenn dies erforderlich ist. Das Posten großer Nutzdaten ist ohnehin nie das allererste, was ein Browser tut, wenn er eine Verbindung zu einem Server herstellt.
Phil
1
@ Phil_1984_ Ich denke, der historische Kontext ist hilfreich; Es kann leicht sein zu vergessen, wie weit wir gekommen sind. 1989, als HTTP als zustandslos konzipiert wurde, wurde der 486 mit satten 20 MHz angekündigt, der jedoch erst im folgenden Frühjahr verfügbar sein würde. Das Internet war nicht wirklich aus einem akademischen Raum herausgewachsen, der Universitäten und Regierungen miteinander verband. Staatenlos machte damals sehr viel Sinn. Da Agenten (Browser) in den letzten 28 Jahren immer komplexer wurden, ist es sinnvoll, mehr Stateful-Funktionen hinzuzufügen, insbesondere um bestimmte Anwendungsfälle zu implementieren, aus denen HSTS stammt.
Peter Oehlert
27

Ein Client kann nicht im Voraus wissen, dass ein Server eine komprimierte Anforderung verstehen würde, aber der Server kann wissen, dass der Client eine akzeptiert.

Paul Dixon
quelle
25
Nicht wahr. Content-Encoding ist ein zulässiger Header, den der Client bereitstellen kann. Der RFC sagt: "Wenn die Inhaltscodierung einer Entität in einer Anforderungsnachricht für den Ursprungsserver nicht akzeptabel ist, sollte der Server mit einem Statuscode von 415 (nicht unterstützter Medientyp) antworten." - per Nick Johnson
Pacerier
11
Was Sie sagen, ist ein bisschen anders als das, worauf ich gefahren bin. Sie können versuchen , eine gezippte Anfrage zu senden, wie Sie es vorschlagen, aber es gibt keine Möglichkeit, vorher zu wissen, dass der Server sie akzeptiert (ohne mit dem Server zu sprechen). Das heißt, Ihr Punkt ist gut gemacht: Wenn Sie versuchen, eine komprimierte Anfrage zu senden, werden Sie möglicherweise feststellen, dass der Server dies unterstützen kann.
Paul Dixon
6
Es gibt viele Stellen, an denen Sie im Voraus wissen, dass der Server dies unterstützt. Zum Beispiel und mobile App, die mit dem Backend spricht.
Guillermo
1
Gibt es eine Liste von Servern, die tatsächlich eine komprimierte Anforderung unterstützen?
Eric
gibt es irgendwelche Browser , die es unterstützen würde?
Brady Moritz
7

Es könnte, vorausgesetzt es könnte garantieren, dass der Server es akzeptieren würde. Dies kann die Verwendung einer OPTIONS-Anforderung bedeuten.

Es gibt eine Menge Dinge, die Webbrowser tun könnten (zum Beispiel Pipelining), die sie nicht tun. Webbrowser-Entwickler berücksichtigen die Auswirkungen einer Änderung auf die Kompatibilität.

In einer heterogenen Umgebung gibt es viele verschiedene Webserver und Konfigurationen. Wenn Sie die Arbeitsweise eines Kunden ändern, können einige davon beschädigt werden.

Möglicherweise akzeptiert nur 1% der Server komprimierte Anforderungen, aber möglicherweise geben einige von ihnen dies an, können dies jedoch nicht korrekt akzeptieren. Daher wird Benutzern das Hochladen von Dateien auf diese Websites verweigert.

In der Vergangenheit gab es viele fehlerhafte Client / Server-Implementierungen - lange Zeit waren komprimierte Antworten in den wichtigsten Webbrowsern fehlerhaft (zum Glück sind diese jetzt größtenteils verschwunden).

Sie würden also schwarze Listen von Benutzeragenten oder Servern (oder Domänennamen) erhalten, auf denen diese Optionen automatisch deaktiviert wurden, was unangenehm ist.

MarkR
quelle
3

Weil es nicht weiß, dass der Server es akzeptieren kann. Bei einer HTTP-Transaktion wird eine einzelne Anforderung vom Client gesendet, gefolgt von einer Antwort. Der Client sendet unter anderem, welche Codierung / Komprimierung er unterstützen kann. Der Server kann dann entscheiden, wie die Antwort komprimiert werden soll. Der Kunde hat diesen Luxus nicht.

Yuliy
quelle
Wenn der Server feststellen kann, ob der Browser dies unterstützt oder nicht, kann es eine Implementierung geben, die der Browser zu finden versucht, ob der Server den Inhalt mit G-ZIP verstehen kann oder nicht. wenn Entwickler daran arbeiten.
David Refoua
Der Server stellt fest, dass der Browser gzip unterstützt, da der Browser dies gerade über einen Accept-Encoding-Anforderungsheader mitgeteilt hat. Sie benötigen eine andere Möglichkeit, damit der Browser a priori weiß, welche Funktionen der Server bietet. Dies zu tun, liegt außerhalb dessen, was HTTP / 1.1 Ihnen bietet.
Yuliy
@Yuliy Sie meinen (zum Beispiel), den Browserspeicher zu verwenden, um sich an eine Antwort zu erinnern, die die Codierung akzeptiert?
Phil
2

Wenn Sie eine Webanwendung schreiben, gehe ich davon aus, dass Sie die Kontrolle darüber haben, was an den Client gesendet und was vom Client zurückgesendet wird.

Es wäre einfach genug, eine gzip-Implementierung in Javascript zu schreiben, die die an den Server gesendeten Post-Daten komprimiert. Der Server könnte einen Filter (j2ee-Begriff) haben, der weiß, dass Clientdaten komprimiert gesendet werden. Dieser Filter dekomprimiert die Daten und übergibt die Daten dann an das Servlet (oder die Aktionsklassen in Struts), das die Daten wie gewohnt liest, z. B. request.getParameter ( ...).

Dies scheint vollkommen logisch und machbar, wenn Sie die Kontrolle haben. Wie in anderen Beiträgen erwähnt, können Sie sich nicht darauf verlassen, dass der Browser dies automatisch ausführt. Da Sie jedoch die Webseiten schreiben, können Sie den Browser dazu bringen, die gewünschte Komprimierung durchzuführen (mit ein wenig Arbeit).

Andy.


quelle
0

HTTP ist folgendermaßen aufgebaut:

  • Der Kunde sagt seine Anfrage im Klartext (einschließlich, wenn er komprimierte Antworten verstehen kann)
  • Der Server antwortet mit der richtigen Codierung (komprimiert oder nicht)

ABER IN DIESEM DESIGN kann der Client keine komprimierten Anforderungen senden, da er nicht weiß, ob der Server dies im Voraus versteht.

Jairo Andres Velasco Romero
quelle