Сбой сетевого адаптера при использовании 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

Мы начали видеть дубликаты подтверждений и большое количество повторных передач: Повторные

и, наконец, окно 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();   
}

0 ответов

Другие вопросы по тегам