2

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

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

  1. 接收 SYN

  2. 发送 SYN,ACK

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

  4. 使用 HTTP GET 命令接收 ACK

  5. 发送 ACK

  6. 发送带有 HTTP 数据的 FIN、ACK(例如 200 OK)

  7. 接收 FIN,ACK <- 我没有收到这个数据包!

  8. 发送 ACK

在我发送确认和 HTTP 200 OK 消息之前,一切正常。客户端不会向这两个包发送确认,因此不会显示任何网页。我添加了一个 pcap 文件,其中包含我如何使用wireshark 记录它的序列。

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

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

4

3 回答 3

1

我认为第 6 步应该只是 FIN,没有 ACK。您在那个地方 ACKing 来自客户端的什么数据包?我也不明白为什么 4. 应该是一个 ACK​​ 而不仅仅是一个普通的数据包——客户端在 3 处确认了连接。

这张关于 TCP 状态的图表可能会有所帮助。

于 2010-04-07T11:54:00.833 回答
0

因此,IP 长度字段过多地计算了 8 位。我的计算出错了。一切现在都像魅力一样!

于 2010-05-11T09:56:38.210 回答
0

WireShark 说(关于 FIN 数据包):

损坏的 TCP:确认字段为非零,而 ACK 标志未设置

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

如果这不能解决它,您也可以尝试先发送数据,然后再发送一个单独的 FIN 数据包。将数据包含在 FIN 中是有效的,但更常见的是单独发送 FIN(如您之前发布的其他 pcap 跟踪中所示)。

此外,您可能应该在数据包中设置 PUSH 标志200 OK

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

于 2010-04-07T12:47:23.333 回答