构建Web服务器时,客户端不会确认HTTP 200 OK帧

时间:2010-04-07 11:43:42

标签: http tcp wireshark

我正在根据教程构建自己的网络服务器。 我找到了一种简单的方法来启动TCP连接并发送一段http数据(网络服务器将在微控制器上运行,因此它将非常小)

无论如何,以下是我需要经历的顺序:

  1. 收到SYN

  2. 发送SYN,ACK

  3. 收到ACK(现已建立连接)

  4. 使用HTTP GET命令

  5. 接收ACK
  6. 发送确认

  7. 使用HTTP数据发送FIN,ACK(例如200 OK)

  8. 收到FIN,ACK< - 我没收到这个包!

  9. 发送确认

  10. 一切正常,直到我发送确认和HTTP 200 OK消息。 客户端不会向这两个包发送确认,因此 没有显示任何网页。 我添加了一个pcap文件的序列,我用wireshark记录它。

    Pcap文件:http://cl.ly/5f5/httpdump2.pcap

    所有序列和确认号都正确,校验和正常。旗帜也是对的。 我不知道出了什么问题。

3 个答案:

答案 0 :(得分:1)

我认为第6步应该只是FIN,没有ACK。来自客户端的数据包是你在那个地方确认的?另外我不明白为什么4.应该是ACK而不仅仅是正常的数据包 - 客户端在3处确认连接。

关于TCP状态的

This图可能会有所帮助。

答案 1 :(得分:0)

WireShark说(FIN数据包):

  

TCP TCP断开:确认字段为   非标志未设置

时非零

我不确定是什么导致了您的问题,但如果WireShark不喜欢该数据包,也许客户端也不喜欢。因此,它应该是FIN + ACK,或者您应该将确认字段设置为0。

如果这不能解决问题,您可能还会先尝试发送数据,然后再单独发送FIN数据包。将数据包含在FIN中是有效的,但更常见的是自己发送FIN(如前面发布的其他pcap跟踪中所示)。

此外,您可能应该使用200 OK

在数据包中设置PUSH标志

最后,我没有看到FIN数据包的任何重传尝试 - 是因为你立即停止了捕获?

答案 2 :(得分:0)

IP长度字段因此过多计数8位。我的计算错了。 Everythings现在就像一个魅力!