请参阅Fin Ack对“HTTP / 1.0 200 OK”数据包的响应

时间:2015-11-24 20:19:39

标签: http tcp

我正在尝试将我的程序(使用Embarcadero C ++ builder和Indy协议栈编写)连接到专有服务器。我应该发送一个HTTP命令“GET /hyd/1.s16”,此时服务器应该向我发送一堆数据。出于某种原因,我的协议栈发送了一个Fin Ack以响应“HTTP / 1.0 200 OK数据包。”

当我使用服务器模拟器运行时,一切正常:

  1. 客户端发送Syn
  2. 服务器发送Syn Ack
  3. 客户端发送Ack
  4. 客户端使用Get命令发送Psh,Ack
  5. 服务器发送Ack
  6. 服务器使用“HTTP / 1.0 200 OK数据包”发送Psh,Ack
  7. 服务器在重组的PDU中发送数据
  8. 客户端发送Ack
  9. 服务器在重组的PDU中发送数据
  10. 服务器在重组的PDU中发送数据
  11. 客户端发送Ack ...
  12. Link to good Wireshark capture

    当客户使用实际服务器运行时,我使用的协议栈不喜欢服务器发送的“HTTP / 1.0 200 OK数据包”并发送“Fin Ack”响应 - 数据包7。

    1. 客户端发送Syn
    2. 服务器发送Syn Ack
    3. 客户端发送Ack
    4. 客户端使用Get命令发送Psh,Ack
    5. 服务器发送Ack
    6. 服务器使用“HTTP / 1.0 200 OK数据包”发送Psh,Ack
    7. 客户端发送Fin,Ack ****错误****
    8. Link to bad Wireshark capture

      TIdTCPClient *TCPClient;
      
      TCPClient->Port = M3R_PORT;
      TCPClient->Host =   IntToStr((int) ipAddPt1) + "." +
                                      IntToStr((int) ipAddPt2) + "." +
                                      IntToStr((int) ipAddPt3) + "." +
                                      IntToStr((int) ipAddPt4);
      TCPClient->Connect();
      TCPClient->IOHandler->Write(m3rData);//"GET /hyd/1.s16 HTTP/1.0\x0d\x0a\x0d\x0a");
      
      while (!done) {
          readLine[x] = TCPClient->IOHandler->ReadLn();   // extension-header = ChannelId
          if (readLine[x].Length() <= 0) {
              done = true;
          }
      }
      

1 个答案:

答案 0 :(得分:0)

这里没有任何东西被拒绝。您和服务器在没有keepalive选项的情况下说HTTP 1.0。这意味着每个连接有一个请求/响应。收到响应后,您的客户端完全正确关闭连接。