Stock Browser, der HTTP-POST-Anforderungen in separate TCP-Segmente aufteilt

Aktuell teste ich verschiedene Webbrowser und Geräte auf Kompatibilität mit einem entwickelten Webinterface. Wir haben festgestellt, dass wir ein Problem mit Code haben, der sich bereits in der Produktion befindet. Der Fehler tritt auf, weil alle HTTP-POST-Anforderungen, die vom Android-Browser gesendet werden (sowohl auf einem Galaxy Nexus (mit JB) als auch mit einem Galaxy Tab (mit ICS)) an der Grenze der HTTP-Header und des HTTP-POST in zwei TCP-Segmente aufgeteilt werden Daten.

Interessanterweise zeigt Chrome für Android nicht dasselbe Verhalten, sondern die gesamte Anfrage wird als ein Paket gesendet.

Wir sind noch nicht einmal nahe daran, die MTU zu erreichen, also ist das kein Problem.

Meine Fragen sind:

  1. Gibt es eine Konfiguration, die geändert werden kann, um dies zu verhindern?
  2. Ich weiß, dass sowohl der integrierte Android-Browser als auch Chrome Webkit verwenden, von dem ich den Eindruck hatte, dass es in das Android-Betriebssystem integriert wurde. Warum also das unterschiedliche Verhalten zwischen den Browsern?
  3. Schließlich, was ist gewonnen oder was ist die Absicht dahinter?

Antworten (1)

Der Browser steuert das nicht direkt; es ist die Wahl des Kernels, da im Kernel die TCP-Implementierung lebt. Eine Möglichkeit, wie die Anwendung darauf Einfluss nehmen kann, besteht jedoch darin, die TCP_NODELAYOption auf dem Socket zu setzen, die den Kernel auffordert , Nagles Algorithmus zu deaktivieren und jeden Datenblock so schnell wie möglich zu senden.

Dies kann eine Optimierung sein: Da viele HTTP-Anfragen nur Header und keinen Body enthalten, ist es für den Kernel besser, sofort ein Paket mit den Headern zu senden, anstatt eine Weile zu warten, um zu sehen, ob der Browser weitere Daten produziert, die hineinpassen könnten das gleiche Paket.