Hi Mark & all,

After using the Jpcap (java sniffer tool) to watch the http packets, We
Finally
found out the root cause of this problem is indeed the keep-live BUG of
Internet
Explorer, below is our finding for your reference :

Finding 1 : When using AJAX to make http requests, Internet Explorer always
sends
            http header and body separately in 2 (or more) IP packets. and
in our
            case the header is always sent in the first packet since the
header
            length is never greater than 1460 bytes(Maximum packet data
size).

Finding 2 :

          1) When apache httpd server detects the keep-live timeout, it will
send
             a Fin (finish) Packet to Client (IE) telling it to close the
connection,
             but at meanwhile Client is preparing to send another POST
request to Apache,
             for unknown reasons (IE BUG!) IE still keeps sending the POST
head & body instead
             of closing connection immediately.

          2) Apache server will ignore the POST request. and send the ACK
Packet back
             to Client.

          3) and next, the Client sends a Fin(Finished) Packet to apache
server to confirm
             closing connection.

          4) Apache server sends an ACK packet to confirm ending this
connection.


          5) Next, Client resend the POST header again to Apache server.

          6) Apache Server confirm receiving the header.

          7) after about 1.5 minutes, Client send a RST (Reset) packet to
Apache
             Server asking reset the connection. In this case the POST body
is
             never sent to Apache server that causes the request parameters
is
             missing.

Following is the Packet flow for your reference : (Time format hhms.S)


   Time              From        to          SEQ         ACK
Flag        remark
   ========  ======   ======  =======  =========  ====
====================================
   071249.751   Client   Apache  1088748537   1807070026           previous
conversion sent from Client
   071304.243   Apache   Client  1807070026  1088748537
FIN     time-out(idle 15 seconds)
   071304.467   Client   Apache  1088748537  1807070026  PSH   Client still
sends POST header
   1807070027   Apache   Client  1807070027  1088749235
   1088749235   Client   Apache  1088749235  1807070026  PSH   Client still
sends POST body
   071304.479   Apache   Client  1807070027  1088749316
   071304.720   Client   Apache  1088749316  1807070027
   071304.721   Client   Apache  1088749316  1807070027  Fin     Finish the
connection
   071304.722   Apache   Client  1807070027  1088749317            Server
confirm ending the connection

   071304.737   Client   Apache  1959299521  1807484246  PSH   Client resend
the Post header in another connection
   071304.737   Apache   Client  1807484246  1959300219            Apache
confirm receiving this header
   071425.235   Client   Apache  1959300219  1807484246  RST   after about
1.5 minutes, Client request to reset the connection
In conclusion, the problem  only happens when Keep-Alive is timeout, that's
why it's related to the apache keep-alive
setting, smaller keep-alive timeout will raise the timeout frequency and
cause more missing body part errors as well.

Unfortunately, so far there is no solution yet unless Microsoft fix the BUG.


Thanks
James.

>
>
>

Reply via email to