事故的起因: 我发现我的nodejs项目ajax请求中, 当请求的数据返回不到1K,几百B大小的时候,在 局域网的另一台电脑访问的时候,需要200多毫秒一个请求, 而当我ajax请求中返回的数据量是大于2K的时候,却反而只需要20毫秒一个请求??!! 于是,我做了下面的测试.以排除前端javascript等等的影响.
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337);
console.log('Server running at http://127.0.0.1:1337/');
这是nodejs官网的例子,我拷贝下来,运行,用chrome浏览器本地127.0.0.1访问, 打开调试窗口Developer tools中的Network面板,看到Receiving访问所需要的时间是2ms或者1ms
这里,没发现问题,解释数据需要1毫秒是正常的
但是,问题来了,当我用同一个局域网上的另一台机器的chrome访问这个http服务的时候 发现: Receiving需要的时间却是165ms 到 200ms之间 这,同一个局域网,速度差别这么大,这已经有点诡异了,
更诡异的事情还在下面:
当我修改这个例子的源代码,把Hello World字符串改成一串很长很长的字符,长到超过2K大小的字符串, 重启http服务,再次刷新页面(注意是局域网中的另一条电脑),多次刷新观察Network面板,发现Receiving需要的时间却只需要13ms到18ms !!!
???求高手答疑解惑!不甚感激!!
1.服务器端似乎是底层nagle算法引起的,数据量少的时候自动缓存数据。可加入socket.setNoDelay(true)验证。
var http = require('http');
var server=http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(1337);
server.on('connection',function(socket){
socket.setNoDelay(true);
});
console.log('Server running at http://127.0.0.1:1337/');
2.客户端的话,换个浏览器试试?
不对啊,高手, socket.setNoDelay([noDelay])# Disables the Nagle algorithm. By default TCP connections use the Nagle algorithm, they buffer data before sending it off. Setting true for noDelay will immediately fire off data each time socket.write() is called. noDelay defaults to true. 官网的文档上说,这个noDelay的默认值本来就是true啊?!为什么还要设置成true? 难道,nodejs搞错了?