这是一个有点专业的问题,因为它涉及一个非常小的嵌入式 Web 服务器,而不是传统的 Web 服务器(例如 Apache、IIS),并且它更多地与通过 ISP 的路由有关。
我是一名程序员,负责在硬件产品中实现嵌入式 Web 服务器。这基本上是位于客户场所的消费设备。客户可以选择使用内部 Web 服务器进行配置,当然,如果他们愿意,他们可以通过路由器进行端口转发,以便通过互联网从外部访问它。
我正在尝试调查一种奇怪的情况,即安装在特定场所的设备可以完全正常地响应.htm
和文件的请求,并且当请求不存在的文件时,它也会像应该做的那样响应。但是,如果请求、、或(毫无疑问还有许多其他请求),则会发生 HTTP 请求无限期挂起并最终超时。此时,浏览器仅显示它在那段时间之后能够加载的内容,通常只是原始 HTML,没有任何图像、样式或脚本资源。(我使用 Firebug 中的“net”选项卡查看所有这些。).cgi
404
.png
.jpg
.css
.js
我所知道的有关该设备的所有信息是,它位于一所显然使用 Virgin Media ISP 的房子里,后面是一个相当标准的家用调制解调器/路由器。不幸的是,目前我无法找到更多信息,而且我本人也无法亲自接触它。
HTTP 服务器当前配置为端口 80。
安装程序告诉我,在本地访问 HTTP 服务器时,访问完全没问题;也就是说,所有图像等都可以无问题地加载。此外,我以前从未遇到过该产品的此类问题。更奇怪的是,我们之前安装的产品内部有几乎相同的 Web 服务器 - 并且根本没有这个问题。所以我不知道这是否是巧合。
ISP 是否有可能对传入的 HTTP 请求进行过滤或以其他方式进行操控?目前,这是我唯一能想到的办法。
使用的 Web 服务器是作为 Keil MDK-ARM 库的一部分提供的 HTTP 服务器。该产品基本上是带有 ARM 处理器的一小块定制硬件,运行轻量级 Keil RTOS,该操作系统也是 MDK-ARM 的一部分。我认为我无法说出有关该盒子实际功能的任何相关信息。
编辑:额外的Wireshark线索
当我尝试直接请求“问题”文件类型(例如.css
或.js
文件之一)时,我一直在获取 Wireshark 日志。我发现的是:
除了常见的 ACK 数据包外,我并没有看到由一个或多个 TCP 数据包组成的有效 HTTP 响应流,而是只看到一个 TCP 数据包,其中包含被认为是 HTTP 响应的一部分。Wireshark 将此数据包标记为“连续或非 HTTP 流量 [格式错误的数据包]”,因为数据包中缺少 HTTP 标头,它无法判断它是什么。
经过进一步检查,我发现每当我请求有问题的文件类型时,我收到的这些单个“格式错误”的数据包实际上只包含实际请求的 HTTP 文件的四个字节的有效负载。例如,数据包的四字节有效负载可能是ID=b
,这对应于我所请求的文件ID=blahblah
开头的。(我编造了这个特定的例子,但这是我在请求和文件.js
时看到的一致行为)。.css
.js
因此,简而言之,我不是在一个或多个 TCP 数据包中获取完整的 HTTP 响应并包含 HTTP 标头,而是仅获取一个有效负载只有四个字节的数据包,我知道这四个字节是所请求的原始文件的四个字节。
编辑2:除上述内容外,我意识到任何以字节为单位非常小的图像(例如小于 1K)都可以成功返回。只要响应适合一个 TCP 数据包,几乎就可以了。任何大于该大小的图像,就会发生上述奇怪的问题。但对于 .htm 或 .cgi,响应可以任意大,并且有效。
答案1
是的,这是有可能的,但他们不太可能以这种方式去做。
(在给 ISP 打电话之前,请确保没有其他任何问题。也可能是资源的 MIME 类型错误,导致您的服务器和客户端(甚至是后者)之间存在某种障碍)。