Как стать автором
Обновить

Учебник по симулятору сети ns-3. Заключительные главы 8, 9

Время на прочтение 11 мин
Количество просмотров 1.6K
Туториал
Перевод
Автор оригинала: https://www.nsnam.org/documentation/
image
[главы 1,2]
[глава 3]
[глава 4]
[глава 5]
[глава 6]
[глава 7]

Глава 8 Сбор информации
8.1 Мотивация
8.2 Пример кода
8.3 GnuplotHelper
8.4 Поддерживаемые типы трасс
8.5 FileHelper
8.6 Итоги
Глава 9 Заключение
9.1 На будущее
9.2 Завершение

Глава 8 Сбор информации


В последней главе этого руководства представлены некоторые компоненты, которые были добавлены в ns‑3 в версии 3.18 и те, что сейчас находятся в стадии разработки. Этот раздел также находится в стадии разработки.

8.1 Мотивация


Одной из основных целей запуска симуляции является генерация выходных данных, либо для исследовательских целей, либо просто для изучения системы. В предыдущей главе мы представили подсистему трассировки и пример sixth.cc, который генерировал файлы PCAP или ASCII трассировок. Эти трассы ценны для анализа данных с использованием различных внешних инструментов и для многих пользователей такие выходные данные предпочтительны с точки зрения сбора данных (для анализа с помощью внешних инструментов).

Тем не менее, существуют варианты использования не только для генерации файла трассировки, они включат следующие:

  • генерация данных, которые плохо отображаются в PCAP или ASCII трассировки, данные которые не представлены в виде пакетов (например, переходы машины состояний протокола);
  • большие симуляции, для которых требования к диску по вводу/выводу во время генерации файлов трассировки являются непомерными или громоздкими;
  • необходимость сокращения или вычисления данных в режиме онлайн во время моделирования. Хороший пример этого — определение условия завершения симуляции, чтобы остановить её при получении необходимого количества данных для формирования достаточно узкого доверительного интервала вокруг оценки некоторого параметра.

Инфраструктура сбора данных ns‑3 предназначена для предоставления этих дополнительных возможностей помимо вывода на основе трассировки. Мы рекомендуем читателю, интересующемуся этой темой, обратиться к руководству по ns‑3 для более детального рассмотрения этого фреймворка. Здесь мы приведем пример программы, демонстрирующей некоторые возможности, находящиеся в разработке.

8.2 Пример кода


Учебный пример examples/tutorial/sevenh.cc напоминает пример sixth.cc, который мы ранее проработали, за исключением нескольких изменений. Во-первых, в него было добавлено переключение на поддержку IPv6 параметром командной строки:

CommandLine cmd;
cmd.AddValue ("useIpv6", "Use Ipv6", useV6);
cmd.Parse (argc, argv);

Если пользователь указывает опцию useIpv6, программа будет работать с использованием IPv6 вместо IPv4. Во всех программах ns‑3, которые поддерживают объект CommandLine, доступна опция справки. Как показано выше, она может быть вызвана следующим образом (обратите внимание на использование двойных кавычек):

./waf --run "seventh --help"

который выдаст:

ns3-dev-seventh-debug [Program Arguments] [General Arguments]
Program Arguments:
--useIpv6: Use Ipv6 [false]
General Arguments:
--PrintGlobals: Print the list of globals.
--PrintGroups: Print the list of groups.
--PrintGroup=[group]: Print all TypeIds of group.
--PrintTypeIds: Print all TypeIds.
--PrintAttributes=[typeid]: Print all attributes of typeid.
--PrintHelp: Print this help message.

Режим по умолчанию (использование IPv4, поскольку useIpv6 имеет значение false) можно изменить, переключив логическое значение следующим образом:

./waf --run "seventh --useIpv6=1"

и посмотрите на сгенерированный pcap, например, с помощью tcpdump:

tcpdump -r seventh.pcap -nn -tt

Это было короткое отступление в поддержку IPv6 и командной строки, которая также была представлена ранее в этом руководстве. В качестве отдельного примера использования командной строки, пожалуйста, смотрите src/core/examples/command-line-example.cc. Теперь вернемся к сбору данных. В директории examples/tutorial/ введем следующую команду:

diff -u sixth.cc sevenh.cc

и рассмотрим некоторые из новых строк этого diff:

+ std::string probeType;
+ std::string tracePath;
+ if (useV6 == false)
+ {
...
+ probeType = "ns3::Ipv4PacketProbe";
+ tracePath = "/NodeList/*/$ns3::Ipv4L3Protocol/Tx";
+ }
+ else
+ {
...
+ probeType = "ns3::Ipv6PacketProbe";
+ tracePath = "/NodeList/*/$ns3::Ipv6L3Protocol/Tx";
+ }
...
+ // Use GnuplotHelper to plot the packet byte count over time
+ GnuplotHelper plotHelper;
+
+ // Configure the plot. The first argument is the file name prefix
+ // for the output files generated. The second, third, and fourth
+ // arguments are, respectively, the plot title, x-axis, and y-axis labels
+ plotHelper.ConfigurePlot ("seventh-packet-byte-count",
+ "Packet Byte Count vs. Time",
+ "Time (Seconds)",
+ "Packet Byte Count");
+
+ // Specify the probe type, trace source path (in configuration namespace), and
+ // probe output trace source ("OutputBytes") to plot. The fourth argument
+ // specifies the name of the data series label on the plot. The last
+ // argument formats the plot by specifying where the key should be placed.
+ plotHelper.PlotProbe (probeType,
+ tracePath,
+ "OutputBytes",
+ "Packet Byte Count",
+ GnuplotAggregator::KEY_BELOW);
+
+ // Use FileHelper to write out the packet byte count over time
+ FileHelper fileHelper;
+
+ // Configure the file to be written, and the formatting of output data.
+ fileHelper.ConfigureFile ("seventh-packet-byte-count",
+ FileAggregator::FORMATTED);
+
+ // Set the labels for this formatted output file.
+ fileHelper.Set2dFormat ("Time (Seconds) = %.3e\tPacket Byte Count = %.0f");
+
+ // Specify the probe type, probe path (in configuration namespace), and
+ // probe output trace source ("OutputBytes") to write.
+ fileHelper.WriteProbe (probeType,
+ tracePath,
+ "OutputBytes");
+
Simulator::Stop (Seconds (20));
Simulator::Run ();
Simulator::Destroy ();

Внимательный читатель заметит, что при тестировании атрибута командной строки IPv6, описанного выше, файл sevenh.cc создал ряд новых выходных файлов:

seventh-packet-byte-count-0.txt
seventh-packet-byte-count-1.txt
seventh-packet-byte-count.dat
seventh-packet-byte-count.plt
seventh-packet-byte-count.png
seventh-packet-byte-count.sh

Они были созданы дополнительными объявлениями, представленными выше. В частности, GnuplotHelper и FileHelper.

Эти данные были получены путем подключения к источникам трассировки ns‑3 компонентов сбора и упорядочения данных для форматированного gnuplot и форматированного текстового файлов. В следующих разделах мы рассмотрим каждый из них.

8.3 GnuplotHelper


GnuplotHelper - это вспомогательный объект ns‑3, предназначенный для создания графиков gnuplot для общих случаев с минимальным, по возможности, количеством операторов.

Он подключается к источникам трассировки ns‑3 с типами данных, поддерживаемыми системой сбора данных. Некоторые типы данных источников трассировки ns‑3 не поддерживаются, но многие из общих типов трассировки, включая TracedValues с простыми старыми типами данных (POD) могут быть обработаны этим помощником.

Давайте посмотрим на вывод этого помощника:

seventh-packet-byte-count.dat
seventh-packet-byte-count.plt
seventh-packet-byte-count.sh

Первый — это файл данных gnuplot с серией меток времени, разделенных пробелами, и счетчиками байтов пакетов. Мы рассмотрим ниже как этот конкретный вывод данных был настроен, но давайте продолжим с выходными файлами. Файл seventh-packet-byte-count.plt - это файл графика gnuplot, который можно открыть в gnuplot. Читатели, которые понимают синтаксис gnuplot, могут увидеть, что он создаст отформатированный выходной файл PNG с именем seventh-packet-byte-count.png. Наконец, небольшой shell-сценарий sevenh-packet-byte-count.sh запускает этот файл графика через gnuplot для получения желаемого PNG (который можно просмотреть в редакторе изображений), после команды:

sh seventh-packet-byte-count.sh

выдаст seventh-packet-byte-count.png. Почему этот PNG не был сделан сразу? Ответ заключается в том, чтобы пользователь, если хочет, мог вручную настроить предоставленный файл plt, перед созданием PNG. Название PNG-изображения показывает, что этот график представляет собой «Число байтов пакетов в зависимости от времени» и что он отображает захваченные данные, соответствующие пути источника трассировки:

/NodeList/*/$ns3::Ipv6L3Protocol/Tx

Обратите внимание на знак подстановки в пути трассировки. Итак, этот график захвата байтов пакетов, наблюдаемых на источнике трассировки объекта Ipv6L3Protocol; в основном 596-байтовые сегменты TCP в одном направлении и 60-байтовые TCP ack в другом (два источника трассировки узлов были сопоставлены этим источником трассировки).

Как это было настроено? Должны быть предоставлены несколько объявлений. Во-первых, объект GnuplotHelper должен быть объявлен и настроен:

+ // Use GnuplotHelper to plot the packet byte count over time
+ GnuplotHelper plotHelper;
+
+ // Configure the plot. The first argument is the file name prefix
+ // for the output files generated. The second, third, and fourth
+ // arguments are, respectively, the plot title, x-axis, and y-axis labels
+ plotHelper.ConfigurePlot ("seventh-packet-byte-count",
+ "Packet Byte Count vs. Time",
+ "Time (Seconds)",
+ "Packet Byte Count");

К этому моменту пустой график был настроен. Префикс имени файла — первый аргумент, заголовок графика — второй, подпись к оси X — третий, а название оси Y — четвертый аргумент.
Следующим шагом является настройка данных, вот где перехватывается источник трассировки. Во-первых, обратите внимание выше в программе мы объявили для дальнейшего использования несколько переменных:

+ std::string probeType;
+ std::string tracePath;
+ probeType = "ns3::Ipv6PacketProbe";
+ tracePath = "/NodeList/*/$ns3::Ipv6L3Protocol/Tx";

Мы используем их здесь:

+ // Specify the probe type, trace source path (in configuration namespace), and
+ // probe output trace source ("OutputBytes") to plot. The fourth argument
+ // specifies the name of the data series label on the plot. The last
+ // argument formats the plot by specifying where the key should be placed.
+ plotHelper.PlotProbe (probeType,
+ tracePath,
+ "OutputBytes",
+ "Packet Byte Count",
+ GnuplotAggregator::KEY_BELOW);

Первые два аргумента — это имя типа захвата и путь источника трассировки. Эти двое, вероятно, труднее всего определить, когда вы пытаетесь использовать эту структуру для построения других трасс. Здесь трасса захвата — это трасса Tx источника класса Ipv6L3Protocol. Когда мы исследуем реализацию этого класса (src/internet/model/ipv6-l3-protocol.cc) мы можем видеть:

.AddTraceSource ("Tx", "Send IPv6 packet to outgoing interface.",
MakeTraceSourceAccessor (&Ipv6L3Protocol::m_txTrace))

Это говорит о том, что Tx — это имя переменной m_txTrace, которая имеет объявление:

/**
* \brief Callback to trace TX (transmission) packets.
*/
TracedCallback<Ptr<const Packet>, Ptr<Ipv6>, uint32_t> m_txTrace;

Оказывается, что эта специфическая сигнатура источника трассировки поддерживается классом Probe (что нам и нужно) класса Ipv6PacketProbe. Смотрите файлы src/internet/model/ipv6-packet-probe.{h, cc}.

Итак, в приведенном выше операторе PlotProbe мы видим, что он перехватывает источник трассировки (идентифицируемый строкой пути) с соответствующим типом захвата ns‑3 Ipv6PacketProbe. Если бы мы не поддерживали такой тип захвата (соответствие трассировки сигнатуре источника), мы не могли бы использовать это объявление (хотя могли бы быть использованы некоторые более сложные объявления более низкого уровня, как описано в руководстве).

Ipv6PacketProbe сам экспортирует некоторые источники трассировки, которые извлекают данные из исследуемого объекта Packet:

Ipv6PacketProbe::GetTypeId ()
{
  static TypeId tid = TypeId ("ns3::Ipv6PacketProbe")
  .SetParent<Probe> ()
  .SetGroupName ("Stats")
  .AddConstructor<Ipv6PacketProbe> ()
  .AddTraceSource ( "Output",
  "The packet plus its IPv6 object and interface that serve as the output for this probe",
  MakeTraceSourceAccessor (&Ipv6PacketProbe::m_output))
  .AddTraceSource ( "OutputBytes",
  "The number of bytes in the packet",
  MakeTraceSourceAccessor (&Ipv6PacketProbe::m_outputBytes));
  return tid;
}

Третий аргумент нашего оператора PlotProbe указывает, что нас интересует количество байтов в этом пакете;

в частности, источник трассировки «OutputBytes» Ipv6PacketProbe. Наконец, два последних аргумента объявления предоставляют условные обозначения для этой серии данных («Число байтов пакета») и необязательный оператор форматирования gnuplot (GnuplotAggregator :: KEY_BELOW), которым мы показываем, что хотим, чтобы легенда графика была вставлена ниже графика. Другие варианты включают NO_KEY, KEY_INSIDE и KEY_ABOVE.

8.4 Поддерживаемые типы трасс


На момент написания этой главы в Probes поддерживаются следующие трассируемые значения:

Тип TracedValue Тип Probe Файл
double DoubleProbe stats/model/double-probe.h
uint8_t Uinteger8Probe stats/model/uinteger-8-probe.h
uint16_t Uinteger16Probe stats/model/uinteger-16-probe.h
uint32_t Uinteger32Probe stats/model/uinteger-32-probe.h
bool BooleanProbe stats/model/uinteger-16-probe.h
ns3::Time TimeProbe stats/model/time-probe.h

и поддерживает следующие типы TraceSource:

Тип TracedSource Тип Probe Вывод Probe Файл
Ptr&ltconst Packet&gt PacketProbe байты network/utils/packet-probe.h
Ptr&lt const Packet&gt, Ptr&lt Ipv4&gt, uint32_t Ipv4PacketProbe байты internet/model/ipv4-packetprobe.h
Ptr&ltconst Packet&gt, Ptr&ltIpv6&gt, uint32_t Ipv6PacketProbe байты internet/model/ipv6-packetprobe.h
Ptr&ltconst Packet&gt, Ptr&ltIpv6&gt, uint32_t Ipv6PacketProbe байты internet/model/ipv6-packetprobe.h
Ptr&ltconst Packet&gt, const Address& ApplicationPacketProbe байты applications/model/applicationpacket-probe.h

Как показано, поддерживаются только несколько источников трассировки, и все они ориентированы на вывод размера пакетов (в байтах). Однако, эти помощники могут поддерживать большинство основных типов данных, доступных через TracedValue.

8.5 FileHelper


Класс FileHelper — это всего лишь вариант предыдущего примера GnuplotHelper. Пример программы обеспечивает форматированный вывод тех же данных с метками времени, например:

Time (Seconds) = 9.312e+00 Packet Byte Count = 596
Time (Seconds) = 9.312e+00 Packet Byte Count = 564

Предоставляются два файла, один для узла «0» и один для узла «1», как видно из имен файлов. Давайте посмотрим на код кусок за куском:

+ // Use FileHelper to write out the packet byte count over time
+ FileHelper fileHelper;
+
+ // Configure the file to be written, and the formatting of output data.
+ fileHelper.ConfigureFile ("seventh-packet-byte-count",
+ FileAggregator::FORMATTED);

Префикс вспомогательного файла является первым аргументом, а спецификатор формата — следующим. Другие варианты форматирования включают SPACE_SEPARATED, COMMA_SEPARATED и TAB_SEPARATED. Пользователи могут изменить форматирование (если FORMATTED указывается) такой строкой формата:

+
+ // Set the labels for this formatted output file.
+ fileHelper.Set2dFormat ("Time (Seconds) = %.3e\tPacket Byte Count = %.0f");

Наконец, должен быть подключен интересующий источник трассировки. Опять же, в этом примере используется переменные probeType и tracePath, подключается захват выхода источника трассировки «OutputBytes»:

+
+ // Specify the probe type, trace source path (in configuration namespace), and
+ // probe output trace source ("OutputBytes") to write.
+ fileHelper.WriteProbe (probeType,
+ tracePath,
+ "OutputBytes");
+

Поля подстановки в этом спецификаторе источника трассировки соответствуют двум источникам трассировки. В отличие от примера GnuplotHelper, в котором две серии данных были наложены на одном графике, здесь записываются на диск два отдельных файла.

8.6 Итоги


Поддержка сбора данных появилась начиная с ns‑3.18, была добавлена базовая поддержка вывода временных рядов. Описанный выше базовый шаблон может быть воспроизведен в рамках поддержки существующих захватов и источников трассировки. Дополнительные возможности, включая обработку статистики, будут добавлены в будущих релизах.

Глава 9 Заключение


9.1 На будущее


Этот документ предназначен для использования в качестве живого документа. Мы надеемся и ожидаем, что со временем он будет расти, чтобы охватить все больше и больше гаек и болтов ns‑3. Написание руководств и учебных пособий — это не то, что нас всех вдохновляет, но это очень важно для проекта. Если вы являетесь экспертом в одной из этих областей, рассмотрите возможность внести свой вклад в ns‑3, в соответствующей главе или же любую другую главу, которую вы считаете важной.

9.2 Завершение


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

  • Руководство по ns‑3
  • Документация библиотеки моделей ns‑3
  • ns‑3 Doxygen (документация API)
  • ns‑3 вики

— Команда разработчиков ns‑3.
Теги:
Хабы:
Всего голосов 5: ↑4 и ↓1 +3
Комментарии 0
Комментарии Комментировать

Публикации

Истории

Работа