为什么NodeJS KeepAlive似乎没有按预期工作?

FGR*_*eau 5 sockets tcp node.js

引自TCP keepalive HowTo:

为了理解什么是TCP keepalive(我们将调用keepalive),你只需要读取名称:保持TCP活着.这意味着您将能够检查连接的套接字(也称为TCP套接字),并确定连接是否仍在运行或是否已断开.

那么,为什么以下代码在互联网连接断开时不会抛出某些东西?

var tls = require('tls');

var socket = tls.connect(443, "google.com", function connected() {
  console.log('connected');
});

socket.setNoDelay(true);
socket.setKeepAlive(true, 0);
socket.setTimeout(0, function(){
  console.log('timeout');
});
socket.on('data', function(data) {
  console.log(data);
});
socket.on('close', function() {
  console.error("close");
});
socket.on('error', function(err) {
  console.error("error", err);
});
Run Code Online (Sandbox Code Playgroud)

使用NodeJS v0.10.17在MacOS/Debian上测试

FGR*_*eau 6

引用男人7 tcp:

tcp_keepalive_time(整数;默认值:7200;自Linux 2.2起)

TCP开始发送保持活动探测之前连接需要空闲的秒数.只有在启用SO_KEEPALIVE套接字选项时才会发送保持活动.默认值为7200秒(2小时).在启用保持活动后大约额外的11分钟(9个探测间隔75秒间隔)后,空闲连接终止.

所以大约10分钟后(在MacOS 10.8上)节点发出错误:

error { [Error: read ETIMEDOUT] code: 'ETIMEDOUT', errno: 'ETIMEDOUT', syscall: 'read' }
Run Code Online (Sandbox Code Playgroud)