Учебник по симулятору сети ns-3. главы 1,2

Места продаж и диапазон цен

Ценники автомасла имеют большой разбег, причем ощущается он непосредственно внутри самой группы товаров. Так, при покупке литровой канистры Nissan CVT NS 2 придется выложить почти 2 000 рублей, при покупке четырехлитровой – 3 800 рублей. При заправке большого объема траснмиссионки выгоднее брать пятилитровый формат, так как стоить такая тара будет в районе 4 200 рублей.

Тем автомобилистам, кому прописано масло Ниссан NS 3, повезло не больше. Литровая упаковка смазывающего вещества стоит в районе 1 100 рублей, четырехлитровая – 4 250, а пятилитровая – 4 500, что опять подтверждает выгоду приобретения большей фасовки.

Как отличить подделку

Отличить оригинальное масло для вариатора Ниссан от подделки можно по внешнему виду канистры

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

  • сложное исполнение крышки;
  • на логотипе четко проработаны детали, виден переход цвета и тени; пиксели видны быть не должны;
  • на этикетке присутствует эффект объемной печати, особенно в зоне расположения лого;
  • все цвета на этикетке яркие и насыщенные, не затемнены;
  • тиснение на канистре выполнено в едином стиле.

Также следует обратить внимание на наличие подтеков, следов вскрытия и механических манипуляций с канистрой. Если такие следы есть, от покупки лучше отказаться

Adding a Sample Script¶

At this point, one may want to try to take the basic scaffolding defined above
and add it into the system. Performing this step now allows one to use a simpler
model when plumbing into the system and may also reveal whether any design or
API modifications need to be made. Once this is done, we will return to building
out the functionality of the ErrorModels themselves.

Add Basic Support in the Class

/* point-to-point-net-device.h */
  class ErrorModel;

  /**
   * Error model for receive packet events
   */
  Ptr<ErrorModel> m_receiveErrorModel;

Add Accessor

void
PointToPointNetDevice::SetReceiveErrorModel (Ptr<ErrorModel> em)
{
  NS_LOG_FUNCTION (this << em);
  m_receiveErrorModel = em;
}

   .AddAttribute ("ReceiveErrorModel",
                   "The receiver error model used to simulate packet loss",
                   PointerValue (),
                   MakePointerAccessor (&PointToPointNetDevice::m_receiveErrorModel),
                   MakePointerChecker<ErrorModel> ())

Plumb Into the System

void PointToPointNetDevice::Receive (Ptr<Packet> packet)
{
  NS_LOG_FUNCTION (this << packet);
  uint16_t protocol = ;

  if (m_receiveErrorModel && m_receiveErrorModel->IsCorrupt (packet) )
    {
//
// If we have an error model and it indicates that it is time to lose a
// corrupted packet, don't forward this packet up, let it go.
//
      m_dropTrace (packet);
    }
  else
    {
//
// Hit the receive trace hook, strip off the point-to-point protocol header
// and forward this packet up the protocol stack.
//
      m_rxTrace (packet);
      ProcessHeader(packet, protocol);
      m_rxCallback (this, packet, protocol, GetRemote ());
      if (!m_promiscCallback.IsNull ())
        {           m_promiscCallback (this, packet, protocol, GetRemote (),
                      GetAddress (), NetDevice::PACKET_HOST);
        }
    }
}

Источники информации

2.3 WAF

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

В проекте ns-3 используется система сборки Waf. Она из нового поколения систем сборки на основе Python. Для сборки существующей системы ns-3, Вам не понадобится знать Python.

2.4 Среда разработки

Как уже упоминалось выше, сценарии в ns-3 выполняются на C++ или Python. Большая часть API ns-3 доступна на Python, но модели в любом случае написаны на C++. Это руководство предполагает, что вы знакомы с объектно-ориентированным программированием на C++. По мере изложения, мы посвятим некоторое время обзору наиболее продвинутых концепций и, возможно, незнакомых особенностей языка таких как идиомы и шаблоны дизайна. Мы не хотим, чтобы это руководство превратилось в учебник по C++, поэтому мы ожидаем базового владения языком. Существует множество источников информации о C++ доступных в Интернете или в печати.

Симулятор ns-3 использует gcc, GNU binutils и gdb. В то же время, мы не используем для сборки проекта ни make, ни autotools из инструментов GNU. Для этих функций мы используем Waf.

MinGW в настоящее время официально не поддерживается. Другой альтернативой Cygwin является установка виртуальной среды, такой как VMware server, где установить Linux.

2.5 Программирование сокетов

В примерах, использованных в этом руководстве, мы будем использовать базовые возможности API-интерфейса сокетов Беркли (Berkeley Sockets). Если вы новичок в сокетах, мы рекомендуем ознакомиться с API и некоторыми распространенными случаями их использования. В качестве хорошего обзора программирования сокетов TCP/IP мы рекомендуем использовать: «TCP/IP Sockets in C», Donahoo and Calvert.

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

Design Approach¶

Consider how you want it to work; what should it do. Think about these things:

  • functionality: What functionality should it have? What attributes or
    configuration is exposed to the user?
  • reusability: How much should others be able to reuse my design? Can I
    reuse code from ns-2 to get started? How does a user integrate the model
    with the rest of another simulation?
  • dependencies: How can I reduce the introduction of outside dependencies on
    my new code as much as possible (to make it more modular)? For instance,
    should I avoid any dependence on IPv4 if I want it to also be used by IPv6?
    Should I avoid any dependency on IP at all?

Do not be hesitant to contact the ns-3-users or ns-developers list if you have
questions. In particular, it is important to think about the public API of your
new model and ask for feedback. It also helps to let others know of your work in
case you are interested in collaborators.

Add a Subclass¶

The trivial base class ErrorModel does not do anything interesting, but it
provides a useful base class interface (Corrupt () and Reset ()), forwarded to
virtual functions that can be subclassed. Let’s next consider what we call a
BasicErrorModel which is based on the ns-2 ErrorModel class (in
).

What properties do we want this to have, from a user interface perspective? We
would like for the user to be able to trivially swap out the type of ErrorModel
used in the NetDevice. We would also like the capability to set configurable
parameters.

Here are a few simple requirements we will consider:

  • Ability to set the random variable that governs the losses (default is
    UniformVariable)
  • Ability to set the unit (bit, byte, packet, time) of granularity over which
    errors are applied.
  • Ability to set the rate of errors (e.g. 10^-3) corresponding to the above unit
    of granularity.
  • Ability to enable/disable (default is enabled)

Scaffolding¶

Let’s say that you are ready to start implementing; you have a fairly clear
picture of what you want to build, and you may have solicited some initial
review or suggestions from the list. One way to approach the next step
(implementation) is to create scaffolding and fill in the details as the design
matures.

This section walks through many of the steps you should consider to define
scaffolding, or a non-functional skeleton of what your model will eventually
implement. It is usually good practice to not wait to get these details
integrated at the end, but instead to plumb a skeleton of your model into the
system early and then add functions later once the API and integration seems
about right.

Note that you will want to modify a few things in the below presentation for
your model since if you follow the error model verbatim, the code you produce
will collide with the existing error model. The below is just an outline of how
ErrorModel was built that you can adapt to other models.

Review the ns-3 Coding Style Document

At this point, you may want to pause and read the ns-3 coding style document,
especially if you are considering to contribute your code back to the project.
The coding style document is linked off the main project page: ns-3 coding
style.

Decide Where in the Source Tree the Model Should Reside

All of the ns-3 model source code is in the directory . You will need
to choose which subdirectory it resides in. If it is new model code of some
sort, it makes sense to put it into the directory somewhere,
particularly for ease of integrating with the build system.

In the case of the error model, it is very related to the packet class, so it
makes sense to implement this in the module where ns-3
packets are implemented.

waf and wscript

ns-3 uses the Waf build system.
You will want to integrate your new ns-3 uses the Waf build system. You will
want to integrate your new source files into this system. This requires that you
add your files to the file found in each directory.

Let’s start with empty files error-model.h and error-model.cc, and add this to
. It is really just a matter of adding the .cc file to the
rest of the source files, and the .h file to the list of the header files.

Now, pop up to the top level directory and type “./test.py”. You
shouldn’t have broken anything by this operation.

Состав и свойства продуктов

Трансмиссионное масло NS1 Nissan CVT оптимально подходило для автомобилей, выпущенных до 2006 года. Считаясь устаревшим продуктом, оно не могло задерживаться на рынке, поэтому на смену ему пришло две новых смазывающих жидкости.

NISSAN CVT Fluid NS-2

Автомобильное масло Nissan CVT Fluid NS 2 – это синтетический смазочный материал, специально разработанный для вариаторных коробок Nissan и Ifinity. Продукт обладает переходными характеристиками, что делает его пригодным для работы на большинстве автомобилей с вариаторными трансмиссиями.

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

NISSAN CVT Fluid NS-3

Масло NS 3 CVT для Ниссан – это самый современный синтетический смазочный материал, специально разработанный для вариаторов последнего поколения. Состав продукта подобран таким образом, что обеспечивает оптимальные фрикционные характеристики, препятствуя проскальзыванию цепи (ремня) вариатора. Автомасло не агрессивно по отношению к сальникам и эластомерным уплотнителям и не вызывает коррозию элементов трансмиссии, изготовленных из цветных металлов.

Initial Implementation¶

At this point, we’re still working on some scaffolding, but we can begin to
define our classes, with the functionality to be added later.

Inherit from the Object Class?

This is an important design step; whether to use class as a
base class for your new classes.

As described in the chapter on the ns-3 , classes that
inherit from class get special properties:

  • the ns-3 type and attribute system (see )
  • an object aggregation system
  • a smart-pointer reference counting system (class Ptr)

Classes that derive from class } get the first two
properties above, but do not get smart pointers. Classes that derive from class
get only the smart-pointer reference counting system.

In practice, class is the variant of the three above that
the ns-3 developer will most commonly encounter.

In our case, we want to make use of the attribute system, and we will be passing
instances of this object across the ns-3 public API, so class
is appropriate for us.

Initial Classes

One way to proceed is to start by defining the bare minimum functions and see if
they will compile. Let’s review what all is needed to implement when we derive
from class Object.:

#ifndef ERROR_MODEL_H
#define ERROR_MODEL_H

#include "ns3/object.h"

namespace ns3 {

class ErrorModel  public Object
{
public
  static TypeId GetTypeId (void);

  ErrorModel ();
  virtual ~ErrorModel ();
};

class RateErrorModel  public ErrorModel
{
public
  static TypeId GetTypeId (void);

  RateErrorModel ();
  virtual ~RateErrorModel ();
};
#endif

A few things to note here. We need to include . The convention in
ns-3 is that if the header file is co-located in the same directory, it may be
included without any path prefix. Therefore, if we were implementing ErrorModel
in directory, we could have just said “”.
But we are in , so we must include it as “”. Note also that this goes outside the namespace declaration.

Second, each class must implement a static public member function called
.

Third, it is a good idea to implement constructors and destructors rather than
to let the compiler generate them, and to make the destructor virtual. In C++,
note also that copy assignment operator and copy constructors are auto-generated
if they are not defined, so if you do not want those, you should implement those
as private members. This aspect of C++ is discussed in Scott Meyers’ Effective
C++ book. item 45.

Let’s now look at some corresponding skeletal implementation code in the .cc
file.:

#include "error-model.h"

namespace ns3 {

NS_OBJECT_ENSURE_REGISTERED (ErrorModel);

TypeId ErrorModel::GetTypeId (void)
{
  static TypeId tid = TypeId ("ns3::ErrorModel")
    .SetParent<Object> ()
    .SetGroupName ("Network")
    ;
  return tid;
}

ErrorModel::ErrorModel ()
{
}

ErrorModel::~ErrorModel ()
{
}

NS_OBJECT_ENSURE_REGISTERED (RateErrorModel);

TypeId RateErrorModel::GetTypeId (void)
{
  static TypeId tid = TypeId ("ns3::RateErrorModel")
    .SetParent<ErrorModel> ()
    .SetGroupName ("Network")
    .AddConstructor<RateErrorModel> ()
    ;
  return tid;
}

RateErrorModel::RateErrorModel ()
{
}

RateErrorModel::~RateErrorModel ()
{
}

What is the function? This function does a few things. It
registers a unique string into the TypeId system. It establishes the hierarchy
of objects in the attribute system (via ). It also declares that
certain objects can be created via the object creation framework
().

The macro is needed also once for
every class that defines a new GetTypeId method, and it does the actual
registration of the class into the system. The chapter
discusses this in more detail.

Logging Support

Here, write a bit about adding |ns3| logging macros. Note that
LOG_COMPONENT_DEFINE is done outside the namespace ns3