IPv4

IPv4 addresses assignment

为了在网络上使用IPv4,首先要做的是分配IPv4地址。

任何支持IPv4的ns-3节点都至少有一个NetDevice:ns3 :: LoopbackNetDevice。 环回设备地址是127.0.0.1。 所有其他NetDevice将有一个(或多个)IPv4地址。

需要注意的是,和今天一样,ns-3没有NAT模块,也没有遵循关于过滤私有地址(RFC 1918)的规则:10.0.0.0/8,172.16.0.0/12和192.168.0.0/16。 这些地址被路由为任何其他地址。 这种行为在未来可能会改变。

IPv4全局地址可以是:

  • 手动分配
  • 通过DHCP分配

ns-3可以同时使用这两种方法,理解这两者的含义是相当重要的。

Manually assigned IPv4 addresses

这是最简单也是用的最多的。例子:

Ptr n0 = CreateObject ();
Ptr n1 = CreateObject ();
NodeContainer net (n0, n1);
CsmaHelper csma;
NetDeviceContainer ndc = csma.Install (net);

NS_LOG_INFO ("Assign IPv4 Addresses.");
Ipv4AddressHelper ipv4;
ipv4.SetBase (Ipv4Address ("192.168.1.0"), NetMask ("/24"));
Ipv4InterfaceContainer ic = ipv4.Assign (ndc);

这种方法会将两个全局IPv4地址添加到节点。

请注意,地址是按顺序分配的。 因此,第一个节点/网络设备将具有“192.168.1.1”,第二个“192.168.1.2”等等。

可以重复上述操作,将多个地址分配给一个节点。 但是,由于Ipv4AddressHelper的单例本质,首先应该分配一个网络的所有地址,然后更改网络基础(SetBase),然后重新分配一个。

或者,可以将一个特定的地址分配给一个节点:

Ptr n0 = CreateObject ();
NodeContainer net (n0);
CsmaHelper csma;
NetDeviceContainer ndc = csma.Install (net);

NS_LOG_INFO ("Specifically Assign an IPv4 Address.");
Ipv4AddressHelper ipv4;
Ptr device = ndc.Get (0);
Ptr node = device->GetNode ();
Ptr ipv4proto = node->GetObject ();
int32_t ifIndex = 0;
ifIndex = ipv4proto->GetInterfaceForDevice (device);
Ipv4InterfaceAddress ipv4Addr = Ipv4InterfaceAddress (Ipv4Address ("192.168.1.42"), NetMask ("/24"));
ipv4proto->AddAddress (ifIndex, ipv4Addr);

DHCP assigned IPv4 addresses

Tracing in the IPv4 Stack

互联网堆栈在其各种协议实现中提供了许多跟踪源。 这些跟踪源可以使用自己的自定义跟踪代码来挂钩,或者在某些情况下可以使用我们的帮助函数来安排跟踪启用。

ARP提供两个跟踪挂钩,一个在缓存中,一个在三层协议中。 缓存中的跟踪访问者被命名为“Drop”。当数据包通过需要ARP的接口传输时,首先排队等待在ARP缓存中传输,直到解析所需的MAC地址。 尝试获取地址时可能会进行多次重试,如果超过最大重试次数,则所涉及的数据包将被ARP丢弃。 如下情况,ARP缓存中的第一个跟踪挂钩被调用:

  • 如果出站数据包放置在ARP高速缓存挂起地址解析中,并且在最大重试次数内不能进行解析,则会丢弃出站数据包并触发此跟踪;

第二个跟踪挂钩在ARP L3协议(也称为“Drop”)中,并且可能由于多种原因而被调用:

  • 如果收到一个不等待回复的条目的ARP应答,则ARP应答包被丢弃,并且这个跟踪被触发;
  • 如果收到一个不存在的条目的ARP应答,则ARP应答包被丢弃,并且这个跟踪被触发;
  • 如果ARP高速缓存条目处于DEAD状态(超时)并收到ARP应答数据包,则回复数据包将被丢弃,并触发此跟踪。
  • 每个ARP高速缓存条目都有一个未决数据包的队列。 如果超出队列的大小,则会丢弃出站数据包,并触发此跟踪。

IPv4三层协议提供三个跟踪挂钩。 这些是“Tx”(ns3 :: Ipv4L3Protocol :: m_txTrace),“Rx”(ns3 :: Ipv4L3Protocol :: m_rxTrace)和“Drop”(ns3 :: Ipv4L3Protocol :: m_dropTrace)跟踪源。

“Tx”跟踪在许多情况下被触发,所有这些都表明给定的数据包将被发送到给定的ns3 :: Ipv4Interface:

  • 在发往广播地址的数据包的情况下,对Ipv4InterfaceList进行迭代,并且对于每个接口处于启用状态并且可以对数据包进行分段或者具有足够大的MTU来传输数据包的情况下,跟踪被命中。 请参阅ns3 :: Ipv4L3Protocol :: Send。
  • 在需要路由的数据包的情况下,可以在将分组发送到适合于默认网关的接口之前触发“Tx”跟踪。 请参阅ns3 :: Ipv4L3Protocol :: SendRealOut。
  • 同样在需要路由的分组的情况下,“Tx”跟踪可以在分组被发送到适合于发现的路由的输出接口之前被触发。 请参阅ns3 :: Ipv4L3Protocol :: SendRealOut。

当数据包从设备传递到ns3 :: Ipv4L3Protocol :: Receive函数时,将触发“Rx”跟踪:

  • 在接收函数中,迭代Ipv4InterfaceList,如果接收设备对应的Ipv4Interface处于UP状态,则触发跟踪。

丢弃数据包的任何情况下(发送和接收路径)都会触发“Drop”跟踪:

  • 在ns3 :: Ipv4Interface :: Receive函数中,如果接收设备对应的接口处于DOWN状态,则丢弃数据包并触发丢弃跟踪。
  • 同样在ns3 :: Ipv4Interface :: Receive函数中,如果发现校验和不正确,则数据包将被丢弃并触发放置轨迹。
  • 在ns3 :: Ipv4L3Protocol :: Send中,为广播地址绑定的传出数据包将被丢弃,如果设置了“不分段”位并且分段可用且需要,则会触发“丢弃”跟踪。
  • 同样在ns3 :: Ipv4L3Protocol :: Send中,如果分段不可用并且是必需的(MTU <分组大小),则丢弃以广播地址为目的地的传出分组并且“丢弃”跟踪被命中。
  • 在广播地址的情况下,为每个输出接口克隆输出数据包。如果任何接口处于DOWN状态,则“Drop”跟踪事件将引用复制的数据包。
  • 在需要路由的数据包的情况下,如果没有找到到远程主机的路由,则丢弃外出数据包,并且触发“丢弃”跟踪事件。
  • 在ns3 :: Ipv4L3Protocol :: SendRealOut中,丢弃正在路由的传出数据包,如果设置了“不分段”位并且分段可用且需要,则会触发“丢弃”跟踪。
  • 在ns3 :: Ipv4L3Protocol :: SendRealOut中,如果分段不可用并且是必需的(MTU <分组大小),则将丢弃正在路由的传出分组,并且命中“丢弃”跟踪。
  • 如果所需的Ipv4Interface处于DOWN状态,将丢弃正在路由的传出数据包,并触发“Drop”跟踪事件。
  • 如果数据包正在被转发,并且超过了TTL(请参阅ns3 :: Ipv4L3Protocol :: DoForward),则数据包将被丢弃,并触发“Drop”跟踪事件。

你可能感兴趣的:(IPv4)