Русский
Русский
English
Статистика
Реклама

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

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Сбор информации


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

8.1Мотивация


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

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

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

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

8.2Пример кода


Учебный примерexamples/tutorial/sevenh.ccнапоминает примерsixth.cc, который мы ранее проработали, за исключением нескольких изменений. Во-первых, в него было добавлено переключение на поддержку IPv6 параметром командной строки:
CommandLine cmd;cmd.AddValue ("useIpv6", "Use Ipv6", useV6);cmd.Parse (argc, argv);

Если пользователь указывает опциюuseIpv6, программа будет работать с использованием IPv6 вместо IPv4. Во всех программахns3, которые поддерживают объект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.txtseventh-packet-byte-count-1.txtseventh-packet-byte-count.datseventh-packet-byte-count.pltseventh-packet-byte-count.pngseventh-packet-byte-count.sh

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

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

8.3GnuplotHelper


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

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

Давайте посмотрим на вывод этого помощника:
seventh-packet-byte-count.datseventh-packet-byte-count.pltseventh-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-байтовые TCPackв другом (два источника трассировки узлов были сопоставлены этим источником трассировки).

Как это было настроено? Должны быть предоставлены несколько объявлений. Во-первых, объект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мы видим, что он перехватывает источник трассировки (идентифицируемый строкой пути) с соответствующим типом захватаns3Ipv6PacketProbe. Если бы мы не поддерживали такой тип захвата (соответствие трассировки сигнатуре источника), мы не могли бы использовать это объявление (хотя могли бы быть использованы некоторые более сложные объявления более низкого уровня, как описано в руководстве).

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указывает, что нас интересует количество байтов в этом пакете;

в частности, источник трассировки OutputBytesIpv6PacketProbe. Наконец, два последних аргумента объявления предоставляют условные обозначения для этой серии данных (Число байтов пакета) и необязательный оператор форматирования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.5FileHelper


Класс FileHelper это всего лишь вариант предыдущего примераGnuplotHelper. Пример программы обеспечивает форматированный вывод тех же данных с метками времени, например:
Time (Seconds) = 9.312e+00 Packet Byte Count = 596Time (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Итоги


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

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


9.1На будущее


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

9.2Завершение


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

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


Команда разработчиков ns3.
Источник: habr.com
К списку статей
Опубликовано: 23.06.2020 06:21:42
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

*nix

C++

Анализ и проектирование систем

Программирование

Сетевые технологии

Ns-3

Симулятор сети

Wifi

Csma

Ppp

Моделирование

Категории

Последние комментарии

© 2006-2020, personeltest.ru