Webclient vergisst sporatisch Dateien vom Webserver abzufordern?

Hallo,
ich habe mit einem Mega+Ethernetshield einen Webserver aufgebaut. Die einzelnen Dateien der Webseite(html, css, js, gif) liegen auf der SD-Karte. Funktioniert soweit.

Allerdings habe ich dabei ein Problem, welches allerdings nur sporatisch auftritt:

Es kommt halt mitunter vor, dass beim Laden einer Webseite z.Bsp. ein kleines gif nicht angezeigt wird.
Mittels eines Tools, wo man die http-Header zwischen Server und Client mittracen kann, habe ich gesehen, dass der Client die Datei gar nicht vom Arduino abfordert. Aber warum nicht?

Am clientseitigen caching kann es ja nicht liegen, oder? Ich meine, falls der Client wirklich meint, er muss die Datei nicht erneut anfordern, würde er sie ja trotzdem korrekt anzeigen. Im html-header habe ich im Arduino nichts zum Thema caching gesetzt.

Wenn ich dann im Webbrowser auf das nicht angezeigte Bild klicke und dieses mittels "Bild anzeigen" neu anfordere, wird das Bild auch neu angefordert und angezeigt. Also ist das Bild auch vorhanden und der html-code korrekt.

Leider kenne ich mich in den Einzelheiten des Browser-Parsing nicht aus. Ich lade in den html-Dateien im head-Bereich die css-Datei und am Ende vor dem die js-Dateien.

Hat von Euch noch jemand eine Idee, warum dies sporatisch nicht klappt? Das Problem tritt bei längeren html-Dateien auf. Wenn die Datei aber gar nicht angefordert wird, kann es ja eigendlich gar nicht am Webserver (Arduino) liegen, oder?

Viele Grüsse, paulinchen

Mittels eines Tools, wo man die http-Header zwischen Server und Client mittracen kann, habe ich gesehen, dass der Client die Datei gar nicht vom Arduino abfordert. Aber warum nicht?

Welches Tool hast Du denn verwendet?

Hast Du im Browser auch mal die Entwickler-Erweiterung (Firebug beim Firefox, im Chrome beeits eingebaut) eingeschaltet? Was sagt diese?

Ich hatte die Erweiterung "Live HTTP headers" installiert.

Jetzt habe ich im Firefox mal die "Web-Konsole" eingeschaltet und da sieht es folgendermaßen aus:

funktioniert:
GET http://192.168.1.188/sensoren.htm [HTTP/1.1 200 OK 2654ms]
GET http://192.168.1.188/logo.gif [HTTP/1.1 200 OK 265ms]
GET http://192.168.1.188/global.js [HTTP/1.1 200 OK 1234ms]

logo.gif wird nicht angezeigt:
GET http://192.168.1.188/sensoren.htm [HTTP/1.1 200 OK 2654ms]
GET http://192.168.1.188/logo.gif [265ms]
GET http://192.168.1.188/global.js [HTTP/1.1 200 OK 1234ms]

Also kommt im 2. Beispiel für die logo.gif keine Response vom Webserver. Kann es sein, das da der Arduino gerade noch mit einer anderen Datei beschäftigt ist? Ich glaube mal gelesen zu haben, daß zuerst die html-Datei gelesen wird und dann im Hintergrund parallel die benötigten *.css, *.gif usw. nachgeladen werden. Nur die js-Dateien werden wohl einzeln nacheinander geladen.

Fordert der Browser vieleicht sogar mehrere Dateien gleichzeitig vom Webserver ab?

Wie könnte man dies verhindern?

Fragen über Fragen...

Viele Grüße, paulinchen

Meine Standardantwort: Arduino ist als Webserver untermotorisiert. Mit hoher Wahrscheinlichkeit hast Du das was man eine "Race Condition" nennt als Ursache. Solche Fehler sind schwierig einzugrenzen und oft auch sehr schwer zu beheben. Die einfachste Lösung ist es ein stärkeres System als Server zu nutzen und den Arduino nur als IO Expander zu nehmen.

Was das Debuggen angeht: falls Du unter Windows unterwegs ist würde ich für sowas einen Debug Proxy wie "Fiddler" nehmen. Unter anderen Betriebssystemen wird oft auch auf Wireshark zurückgegriffen. Halte ich aber für zuviel des Guten. Unter Unix gibt es auch noch Webscarab, aber Fiddler2 ist deutlich bequemer.

Fordert der Browser vieleicht sogar mehrere Dateien gleichzeitig vom Webserver ab?

Ja, heutige Browser tun dies in aller Regel.

Wie könnte man dies verhindern?

Beim Firefox kann man die Detail-Einstellung mit about:config aufrufen und dort den Wert von "network.http.pipelining.maxrequests" auf 1 setzen, dann werden keine parallelen Requests mehr geschickt.

Versuche mal den Netzwerk-Verkehr mit einem Tool wie WireShark (http://www.wireshark.org) aufzuzeichnen. Die Ausgabe Deines Tools liefert leider zu wenig Daten, um eine Aussage machen zu können, was passiert. Mit WireShark siehst Du, ob überhaupt eine Anfrage an den Arduino geschickt wird und falls ja, ob sie korrekt beantwortet wird.
Allenfalls kann ein Tools wie Firebug (eine Firefox-Erweiterung) auch schon viele Infos liefern, das ist auch etwas weniger Low-Level als WireShark.