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:
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_NODELAY
Option 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.