【问题标题】:Building a webserver, client doesn't acknowledge HTTP 200 OK frame构建网络服务器,客户端不确认 HTTP 200 OK 帧
【发布时间】:2011-02-05 05:32:35
【问题描述】:

我正在根据教程构建自己的网络服务器。 我找到了一种启动 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

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

【问题讨论】:

  • pcap 文件中发生的情况与上述描述不符:捕获显示 SYN 握手,然后是 GET,然后是一堆 HTTP 数据 (65.208.228.233 -> 145.254.160.237)。发送了许多数据包(17,940 字节),全部由客户端确认。 200 ok 自己在一个数据包中发送,得到 ACK'd,然后每路发送一个 FIN+ACK 并完成连接。捕获数据错误??
  • Jep,这是错误的数据。对不起。这是正确的:cl.ly/5f5
  • 您在服务器中实现的 HTTP 协议是 1.0 还是 1.1,您是否支持持久连接?
  • 您是否可以访问完整的 TCP 堆栈和标准套接字 API,或者您基本上是在没有任何操作系统的情况下直接在金属上从头开始编写所有内容?

标签: http tcp wireshark


【解决方案1】:

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

This TCP 状态图可能会有所帮助。

【讨论】:

  • 我对数字 4 没有任何影响,那是客户端(在这种情况下是带有 firefox 的 windows xp)。但是,我尝试在第 6 步中仅使用 FIN 标志。但这没关系。是否与延迟确认有关?
  • 实际上,基本上所有 TCP 数据包也是 ACK - ACK 序列 #/window size 字段始终存在于标头中,因此无论何时发送一些数据,“搭载”当前确认信息。
【解决方案2】:

WireShark 说(关于 FIN 数据包):

断开的 TCP:确认字段是 未设置 ACK 标志时非零

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

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

另外,您可能应该在带有200 OK 的数据包中设置 PUSH 标志

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

【讨论】:

  • 正确,我尝试过使用这些标志,这就是为什么它在这次捕获中不正确。我已将其恢复为 psh/ack。我已经构建了一个单独的 fin 数据包并将其传输给客户端。客户端以 fin/ack 响应,但确认号错误(仍为 1)。看起来客户端没有看到 HTTP 数据包,否则确认号将是我在 http 200 OK 数据包中发送的字节数对吧?我想知道这是什么原因造成的?您对 fin 数据包重传是正确的。我马上停止了。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    相关资源
    最近更新 更多