Web服务器上的资源耗尽 - 套接字基本解释

时间:2014-05-01 13:43:38

标签: sockets http tcp

我使用Internet Explorer 9连接到嵌入式系统支持的Web服务器.Windows 7位于客户端。 网页有很多标签,我浏览直到问题发生。这需要大约一分钟的时间。 嵌入式系统冻结,因此无法浏览,也无法响应ping。片刻之后,嵌入式系统将恢复,因为它旨在重新启动。我加入了一个Wireshark跟踪,你可以在其中看到92个连接(使用过滤器" tcp.stream eq 0"值为[0,91]),你会看到。我有源代码,所以我知道嵌入式系统不支持超过37个同时连接。原因是资源耗尽吗?

但我有一个更基本的问题,我真的更感谢答案。 Web服务器位于172.21.1.12端口80,客户端位于  172.21.9.70和可变端口号(参见跟踪)。因为服务器端的IP和端口没有变化,所以服务器端使用了多少个套接字?问题很重要,因为打开的套接字越多,资源就越耗尽。  如果答案只有1个套接字,那么我必须得出结论,因为它可以支持37。

我还建议您在Wireshark中使用过滤器ip.addr == 172.21.1.12。

我以为我可以上传wireshark文件。我不知道如何与你分享。请帮忙? Dropbox的?

1 个答案:

答案 0 :(得分:0)

根据您未指定嵌入式系统的警告,大多数TCP堆栈将为每个新连接创建一个新套接字,并且从套接字到连接的映射为1-1。

当数据包到达网络堆栈时,它必须将该数据包与正确的套接字关联。通常,这是通过使用从TCP 4元组到套接字的映射来实现的,其中4元组由[local-ip,local-port,remote-ip,remote-port]组成。

服务器通过侦听希望使用该服务的客户端所知的固定本地端口来使其服务可用。如您所知,这通常是Web服务器的端口80,并且大多数TCP实现的软件接口专用于套接字,以允许API对此服务的网络参数执行操作。但是,套接字没有完全连接(4元组的最后两部分设置为特殊的“未指定”值,通常是所有位0)。当接受新连接时,将创建一个新套接字,其中4元组由侦听套接字的本地信息和从发起TCP连接的SYN数据包的源地址和端口获取的远程信息组成。

服务器可以支持的连接数限制取决于操作系统的配置方式(您可以将其限制为37)。使用4元组,单个服务(固定的local-ip和local-port)的绝对限制为(2 ADDR_BITS - RESERVED_ADDRS)×(2 16 - RESERVED_PORTS)。对于IPv4,比特数是32,而对于IPv6,比特数是128。

创建连接时,客户端将指定目标地址和端口(填充4元组的远程信息),但通常不指定源信息。 TCP堆栈将根据路由选择合适的源地址,并选择一个可用的源端口(这将成为完成4元组的本地信息)。理论上,所选本地接口未用于与同一远程服务通信的任何源端口都可用作本地端口。为此,大多数堆栈将专用一组较高编号的端口(称为临时端口范围)。