我正在调试在Microchip嵌入式平台上运行的Web服务器。嵌入式部分不应该相关,除了固件源允许我完全控制所有TCP / IP通信的编码。
特别是在Internet Explorer上,在呈现服务器内容之前所需的所有GET请求之间存在3到10秒的延迟。当它第一次访问该站点并且没有任何缓存时,通常会有大约5个要检索的文件(htm,css,js),因此在用户看到该页面之前的时间超过15秒。
Wireshark捕获显示它肯定是引入延迟的客户端,因为Web服务器在收到每个连接请求后立即响应。在连接完成并且双方都发送了它们的FIN / ACK之后,我在这里看到了在客户端发送下一个SYN以连接下一个GET之前的最小3秒暂停。从SYN到FIN / ACK的完整连接没有问题,需要不到半秒钟。
我验证了每一方都在确认另一方的FIN标志,因为其最终ACK数据包的确认号相应地增加。我甚至扩大了捕获范围,以显示涉及客户端MAC地址的所有流量,并且在延迟期间没有任何类型。
有人知道发生了什么吗?服务器端如HTTP头是否会导致这种情况?谢谢你的帮助。
答案 0 :(得分:1)
我已经确定问题在于Web服务器只运行一个侦听TCP套接字。
Internet Explorer等客户端显然希望能够并行检索多个并发请求,最常见的是使用独立线程。当一个线程占用一个侦听套接字时,尝试获取第二个文件的第二个线程必须等到第一个线程释放套接字。当第二个线程的第一次连接尝试失败时,它似乎必须在3秒后超时再重试。
因为算法要超时,所以套接字在返回监听状态之前只占用了半秒并不重要。第二个线程在超时之前不会再次尝试,因此文件请求之间会有延迟。
客户端没有将第二个文件请求移交给第一个线程的复杂性,第一个线程最有可能意识到套接字再次可用。这样的功能可以在我的情况下优化吞吐量。