Сбой сетевого адаптера при использовании node.js
У меня эта сверхъестественная проблема на работе; Я создал две небольшие программы node.js, которые взаимодействуют друг с другом через HTTP-запросы get и post. Программа B контролирует некоторые текстовые файлы и отправляет пост-запрос в Программу A в любое время, когда файлы изменяются (раз в минуту). После подтверждения этого запроса программа A затем отправляет пост-запрос программе B, которая затем записывает другой набор текстовых файлов.
Компьютер, на котором размещена программа B, в какой-то (непредсказуемый) момент дня просто перестает получать правильное сетевое соединение - мы не сможем использовать браузер, не сможем подключиться к удаленному рабочему столу, а программа узла также не сможет общаться, регистрируя с ошибками ECONNRESET. Однако он может пропинговать другие машины в сети и в Интернете. Мы подумали, что возникла проблема с сетевой картой, поэтому мы фактически переключили компьютер, на котором запущена Программа B, и у нас все еще остается та же проблема.
Мы заметили, что это происходит только тогда, когда Node.js запущен и активно отправляет запросы https в и из программы A. Перезапуск - это единственное найденное нами решение, которое возвращает все в нормальное состояние.
Нашей следующей идеей было установить Wireshark и посмотреть, что случилось. Первое, что мы заметили, это в поле "информация":
3000 → 53550 [RST, ACK] Seq = 2 Ack = 1 Win = 0 Len = 0
Это происходит раз в минуту и, кажется, происходит с компьютера, на котором установлена Программа A. Это нормальное поведение? (Wireshark выделяет его красным). На этом этапе сетевое взаимодействие все еще нормальное.
В конце концов, это нулевое окно TCP, а затем все становится хуже:
Мы начали видеть дубликаты подтверждений и большое количество повторных передач:
и, наконец, окно TCP заполняется, а затем сбрасывается:
На этом этапе сбой сетевого взаимодействия (за исключением возможности проверки связи).
Я полностью потерян. Я не знаю, является ли это проблемой в моем программировании, или в реализации сетевых инструментов на узле, или это проблема с драйверами / оборудованием или проблема с ядром.
Мы используем Windows 7 на обеих машинах. Узел 4.4.1
Любая помощь или совет о том, что это может быть, будет очень признателен.
РЕДАКТИРОВАТЬ
Вот некоторые фрагменты кода, касающиеся отправки и получения информации в программе B (я использую Express.js) .
Прием:
app.post('/eton_call', function (req, res){
logger.info("POST REQUEST: eton_call") //using winston.js to log things
reqCalls_writer.write_file(req.body); //writes the text file in a certain format
res.sendStatus(201);
})
app.post('/USERPRUN_call', function (req, res){
logger.info("POST REQUEST: userprun_call")
userPrun_writer.write_file(req.body);
res.sendStatus(201);
})
Отправка: (все они используют эту функцию-прототип. Аргументом snapshot является JSON)
Eton_file_sync.prototype.send_snapshot = function(snapshot) {
logger.info('sending snapshot');
var post_options = {
host: config.fex_server.host,
port: config.fex_server.port,
path: this.post_uri,
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': snapshot.length
}
};
var post_req = http.request(post_options, function(res) {
logger.info("STATUS: " + res.statusCode);
res.setEncoding('utf8');
res.on('data', function (chunk) {
logger.info('Response: ' + chunk);
});
});
post_req.on('error', function(e){
logger.error('Snapshot not sent. Please ensure connectivity to fex-server.js. This snapshot will be lost. Error Message: ' + e.message);
})
post_req.write(snapshot);
post_req.end();
}
Вот код для записи файлов
Eton_asc_writer.prototype.write_file = function (data_arr){
logger.info("writing file");
var buffer_data = '';
data_arr.forEach(function (data_element, index, array){
for (prop in data_element){
_.find(this, function(template_element){//finds the template_element with the correct descriptions
return template_element.description == prop; //^
}).datum = data_element[prop];//copies over datum to template element
}
//finds the first then second then third.. nth field.
for (var field_order = 1; field_order < this.length; field_order++){
var current_field = _.find(this, function(template_element){
return template_element.field_order == field_order;
});
if (!current_field.datum && (current_field.datum != 0)){
current_field.datum = "";
}
var required_padding_amount = current_field.required_length - current_field.datum.toString().length;
assert(required_padding_amount >= 0, "invalid length on " + current_field.description);
//assert(current_field.type == typeof current_field.datum, "datum types don't match");
for (var padding = ''; padding.length < required_padding_amount;)
padding += ' ';
if (current_field.type == "string"){
current_field.padded_datum = current_field.datum + padding + ';';
}
else {
current_field.padded_datum = padding + current_field.datum + ';';
}
buffer_data += current_field.padded_datum;
}
buffer_data += '\r\n';//buffer newline
}, this.template_in_use);
//console.log(buffer_data);
write_buffer = new Buffer(buffer_data, 'utf8');
var file = fs.createWriteStream(this.filename);
file.write(write_buffer);
file.end();
}
Для Программы A единственные запросы на публикацию, которые будут происходить в это время, поступают из этого: (req_calls - это массив объектов, которые имеют одинаковые пары ключ / значение)
function exportReqCalls(req_calls){
if (req_calls.length == 0){
return;
}
exported_req_calls = JSON.stringify(req_calls);
var post_options = {
host: config.eton_agent.host,
port: config.eton_agent.port,
path: '/eton_call',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': exported_req_calls.length
}
};
var post_req = http.request(post_options, function(res) {
logger.info("STATUS: " + res.statusCode);
res.setEncoding('utf8');
res.on('data', function (chunk) {
//console.log('Response: ' + chunk);
});
});
post_req.on('error', function(e){
logger.error('ReqCall not sent. Please ensure connectivity to eton-agent.js. Error Message: ' + e.message);
});
post_req.write(exported_req_calls);
post_req.end();
}