DavidWal: CGI falsch programmiert??

Hey Leute,
mit ist etwas sehr komisches aufgefallen. Ich setze ein httprequest ab auf meinen apache ( bla/cgi-bin/bla) Dieses (in c++) gibt mir eine Datenarray per json zurück. Content-type ist auch ok. Daten werden per js auch abgearbeitet. Jetzt das Verückte!!! In Wireshark sehe ich immer nach meine antwort (passt in ein tpc paket) eine zweites Paket mit 5 bytes!!! Als Info Text gubt WS "Continuation or non-HTTP traffic" - Was ist das, was soll mir das sagen???

mfg david

  1. Als Info Text gubt WS "Continuation or non-HTTP traffic" - Was ist das, was soll mir das sagen???

    Das soll dir sagen, dass ein zweiten Paket gesendet wird welches kein
    HTTP-Traffic ist. Und da deine Angaben sehr wage sind, fällt die Antwort genauso aus.

    1. Hallo,

      Als Info Text gubt WS "Continuation or non-HTTP traffic" - Was ist das, was soll mir das sagen???

      Das soll dir sagen, dass ein zweiten Paket gesendet wird welches kein
      HTTP-Traffic ist.

      Das wäre zwar theoretisch denkbar, aber extrem unwahrscheinlich. Die Betonung liegt hier auf dem "Continuation". Dazu siehe mein anderes Posting.

      Viele Grüße,
      Christian

      1. Das wäre zwar theoretisch denkbar, aber extrem unwahrscheinlich. Die Betonung liegt hier auf dem "Continuation". Dazu siehe mein anderes Posting.

        Stimmt, das hab ich erst nachher gesehen.
        Wie stellst du fest, das deine Daten in einem Paket platz haben? Kann es sein, dass der Overhead so gross ist, dass ein weiteres Paket geschickt wird? Da reicht schon, wenn es nut um ein Byte zu lang ist.

        1. Hallo,

          Wie stellst du fest, das deine Daten in einem Paket platz haben? Kann es sein, dass der Overhead so gross ist, dass ein weiteres Paket geschickt wird? Da reicht schon, wenn es nut um ein Byte zu lang ist.

          Eine Anwendung muss das gar nicht feststellen. Das macht das Betriebssystem - und zwar in zwei Schritten bei TCP: MSS und Fragmentierung.

          MSS bezeichnet die Maximum Segment Size und gibt an, wie groß die Nutzdaten in einem TCP-Paket maximal sein kann. Sie ist immer so groß wie MTU - IP-Header-Größe - TCP-Header-Größe. Die MTU (Maximum Transmission Unit) ist eine Angabe, die zur Netzwerkschnittstelle gehört und angibt, wie groß ein Paket, das über diese Schnittstelle geht, maximal sein darf. Das ist hardwareabhängig (bei Ethernet z.B. 1500 Bytes), allerdings kann man manuell durchaus einen geringeren Wert einstellen.

          Wenn nun also eine Anwendung dem Betriebssystem sagt "sende über eine bestehende TCP-Verbindung", dann sendet das Betriebssystem daraufhin für jeden Aufruf genau ein Paket*, solange die Daten reinpassen. Wenn sie das nicht tun, teilt das Betreibssystem automatisch auf, je nach der aktuellen MTU.

          Wenn nun auf der Zwischenstrecke zwischen den beiden Kommunikationspartnern eine Strecke ist, die eine noch geringere Maximalkapaizität hat (MTU/MSS gelten ja nur für den direkten Anschluss an den Rechner, die können ja nicht wissen, was dazwischen liegt), so tritt das Phänomen der Fragmentierung ein: Die Router dazwischen teilen TCP-Pakete selbst wieder in nochmal kleinere Häppchen auf, die dann am anderen Ende der Leitung wieder zu einem ganzen TCP-Paket zusammengesetzt werden, das dann verarbeitet werden kann.

          * Wenn die Netzwerkschnittstelle gerade zu viel zu tun hat und Daten warten müssen, kann es auch mal sein, dass Daten zusammengefasst werden, idR. ist aber ein Aufruf von send() mindestens ein Paket.

          Viele Grüße,
          Christian

          1. Eine Anwendung muss das gar nicht feststellen. Das macht das Betriebssystem - und zwar in zwei Schritten bei TCP: MSS und Fragmentierung.

            Ich hab die Frage versehentlich an dich gerichtet, meinte eigentlich den OP.
            Ich bin eben auch der Meinung, die Fragmentierung hängt vom System ab, meine Frage bezog sich auf den OP mit der Aussage

            (passt in ein tpc paket)

            Ich hab deshalb gefragt, weil es evtl. interessant sein könnte, auf Basis dieses Wissens evtl. den Datenverkehr zu optimieren. Mir ist aber kein Weg bekannt, sowas plattformübergreifend auszuwerten und zu beeinflussen.

  2. Hallo,

    mit ist etwas sehr komisches aufgefallen. Ich setze ein httprequest ab auf meinen apache ( bla/cgi-bin/bla) Dieses (in c++) gibt mir eine Datenarray per json zurück. Content-type ist auch ok. Daten werden per js auch abgearbeitet. Jetzt das Verückte!!! In Wireshark sehe ich immer nach meine antwort (passt in ein tpc paket) eine zweites Paket mit 5 bytes!!! Als Info Text gubt WS "Continuation or non-HTTP traffic" - Was ist das, was soll mir das sagen???

    Netzwerkprotokolle arbeiten mit Paketen. Mehrere TCP-Pakete bilden einen zusammenhängenden Datenstrom. Wie bzw. ob der Datenstrom nun auf mehrere TCP-Pakete aufgeteilt wird hängt von mehreren Faktoren ab. Der wichtigste Faktor ist die größe der Daten: Passen die Daten noch in ein Paket (wie groß das maximal sein darf hängt von der zu Grunde liegenden Netzwerkhardware ab, bei Ethernet sind das 1500 Bytes, die jedoch schon den TCP/IP-Header beinhalten müssen), so wird in der Regel nur ein Paket verschickt. Passen die Daten nicht mehr in ein einziges Paket, werden sie aufgeteilt.

    Du hast hier also 2 Pakete für Deinen Datenstrom: Das erste Paket mit dem Anfang der Antwort und dann noch 5 Bytes, die entweder nicht in das erste Paket hineingepasst haben oder aus irgend einem anderen Grund separat verschickt wurden. Dafür steht das "Continuation". Das "or non-HTTP traffic" ist nur ein Hinweis dass weil Wireshark mit den Daten nichts anfangen kann und es Dir damit nicht mit letztendlicher Sicherheit sagen kann, dass es wirklich nur eine Fortsetzung des vorigen Datenstroms ist oder irgend etwas komplett anderes.

    Wenn Du die Gesamtantwort sehen willst, kannst Du bei einem beliebigen TCP/IP-Paket das Kontextmenü öffnen und auf "Follow TCP Stream" gehen - dann siehst Du dort den Inhalt des kompletten Datenstroms und kannst die komplette Antwort schön für Dich zusammengesetzt sehen.

    (Beachte aber, dass "Follow TCP Stream" im Paketfenster automatisch auch einen Filter auf den spezifischen TCP-Stream setzt, den Du hinterher löschen solltest, wenn Du später auch noch andere Pakete inspizieren willst.)

    Viele Grüße,
    Christian