N — интерпретируемый язык. Программы, написанные на N, переводятся в коды для простой стековой машины. Такие программы (и, следовательно, фильтры) оказываются весьма компактными;

Что касается скорости интерпретации, то при достаточно высоком уровне базовых операций она оказывается не намного ниже, чем при выполнении скомпилированной программы. Кроме того, применяемый при интерпретации М-программ механизм ленивых вычислений позволяет избежать лишних операций, обычно сопутствующих проверке сложных условий.

В N заложены знания о структуре сетевых пакетов и протоколах более высоких уровней. Например, допустимы обращения вида ip.src, tcp.hdr или syslog.message. Возможно и обращение к произвольным частям пакетов. В принципе, на N можно написать интерпретатор любого прикладного протокола.

Приведем пример простого фильтра, выбирающего запрашиваемые клиентом по протоколу HTTP локаторы ресурсов.

.filter server tcp (client, port: 80, start: "GET", stop: " ")

record ip.src, ip.dst, tcp.sport, tcp.dport,

tcp.bytes to urIRecorder;}

Этот фильтр анализирует TCP-соединения с серверным портом 80, ищет в потоке данных цепочку символов «GET», записывает все от места совпадения до пробела в поле tcp.bytes (предполагается, что это и будет URL), после чего отправляет поддерживающему сервису исходные и целевые IP-адреса и номера ТСР-портов, а также выявленный URL.

В данном случае разыскиваемый шаблон весьма прост. Подчеркнем, что язык N позволяет сделать его сколь угодно сложным.