2013-02-23 193 views
0

我在调试运行在Microchip嵌入式平台上的Web服务器。除了固件源允许我完全控制编码所有TCP/IP通信之外,嵌入式部分不应相关。各个HTTP GET文件请求之间的浏览器延迟

特别是在Internet Explorer中,呈现服务器内容之前所需的所有GET请求之间的延迟时间均为3到10秒。当它第一次访问网站并且没有任何内容被缓存时,通常有大约5个文件需要检索(htm,css,js),所以在用户看到页面前15秒以上。

Wireshark捕获表明,它肯定是引入延迟的客户端,因为Web服务器在收到每个连接请求后立即响应。连接完成后双方都发送了FIN/ACK,这是我看到客户端发送下一个SYN连接下一个GET之前的最少3秒暂停时间。从SYN到FIN/ACK的完整连接没有问题,需要半秒钟。

我验证了每一方都确认对方的FIN标志,因为其最终ACK分组的确认号相应增加。我甚至扩大了捕获范围,以显示涉及客户端MAC地址的所有流量,并且在延迟期间没有任何类型的流量。

任何人有一个想法发生了什么? HTTP头文件等任何服务器端会导致这种情况吗?谢谢你的帮助。

回答

1

我确定问题在于Web服务器只运行一个侦听TCP套接字。

Internet Explorer等客户端显然希望能够使多个并发请求并行检索文件,这很可能使用独立线程。当一个线程占用一个监听套接字时,第二个尝试获取第二个文件的线程必须等到第一个线程释放套接字为止。当第二个线程的第一次连接尝试失败时,似乎必须在3秒后超时才能再次尝试。

由于算法超时,在返回到监听状态之前,套接字仅占用半秒无关紧要。第二个线程在超时之前不会再尝试,因此文件请求之间的延迟。

客户端没有把第二个文件请求转交给第一个线程的复杂性,第一个线程处于最好的位置,意识到套接字可以再次使用。这样的功能可以优化诸如我的情况下的吞吐量。