xmlHttpRequest不会关闭连接

时间:2015-11-11 21:10:42

标签: javascript ajax linux

我发出一个AJAX请求,根据答案,我将刷新当前页面,代码如下:

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4 && xhttp.status == 200) {
  var res = xhttp.responseText;
  if (res.length > 0) {
      window.location = res;
  }
}
}
xhttp.open("POST", "getlink.php", true);
xhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xhttp.send('id='+id);

但是我注意到服务器上没有关闭连接。运行此命令时:

netstat -anl | grep 80 | awk '/^tcp/ {t[$NF]++}END{for(state in t){print state, t[state]} }'

我在TIME_WAIT状态下看到很多连接:

LAST_ACK 4
LISTEN 2
SYN_RECV 2
ESTABLISHED 1421
FIN_WAIT1 9
FIN_WAIT2 17
TIME_WAIT 2250

似乎xmlHttpRequest不会关闭连接,从而在服务器上造成很多问题。

1 个答案:

答案 0 :(得分:4)

这不是一个错误,它是一个功能!

它被称为Connection keep-alive,是HTTP协议的一个特性,适用于所有HTTP连接,而不仅仅是XMLHttpRequest创建的连接。

所以基本上这个想法是打开TCP连接是一件复杂的事情,因为你需要进行昂贵的三次握手来建立连接并分配系统资源。但是,大多数网页一次加载许多资源。每个图像都有一个请求,每个CSS文件有一个请求,依此类推。为了加速加载和减少服务器负载,HTTP允许与服务器的连接保持打开状态,并且可以重复用于后续请求。

使用来自服务器的标头来控制行为,该标头指定客户端应在最大时间打开的连接数以及应该关闭连接的空闲时间的秒数。如果您发现连接太多的服务器上存在问题,则应调整这些标头,这些标头通常可以在Web服务器配置文件中进行配置。