Как получить количество потерянных пакетов с помощью TCP в NS-3? (пример 80211n + MIMO)

Я использую этот пример: https://github.com/nsnam/ns-3-dev-git/blob/master/examples/wireless/80211n-mimo.cc . Для UDP в UdpServer есть функция GetLost(), которая возвращает количество потерянных пакетов, а для TCP — нет. Я спрашиваю, есть ли какое-либо решение для решения этой проблемы, пожалуйста. Спасибо

      /* Setting applications */
      ApplicationContainer serverApp;
      if (udp)
        {
          //UDP flow
          uint16_t port = 9;
          UdpServerHelper server (port);
          serverApp = server.Install (wifiStaNode.Get (0));
          serverApp.Start (Seconds (0.0));
          serverApp.Stop (Seconds (simulationTime + 1));

          UdpClientHelper client (staNodeInterface.GetAddress (0), port);
          client.SetAttribute ("MaxPackets", UintegerValue (4294967295u));
          client.SetAttribute ("Interval", TimeValue (Time ("0.00001"))); //packets/s
          client.SetAttribute ("PacketSize", UintegerValue (payloadSize));
          ApplicationContainer clientApp = client.Install (wifiApNode.Get (0));
          clientApp.Start (Seconds (1.0));
          clientApp.Stop (Seconds (simulationTime + 1));
        }
      else
        {
          //TCP flow
          uint16_t port = 50000;
          Address localAddress (InetSocketAddress (Ipv4Address::GetAny (), port));
          PacketSinkHelper packetSinkHelper ("ns3::TcpSocketFactory", localAddress);
          serverApp = packetSinkHelper.Install (wifiStaNode.Get (0));
          serverApp.Start (Seconds (0.0));
          serverApp.Stop (Seconds (simulationTime + 1));

          OnOffHelper onoff ("ns3::TcpSocketFactory",Ipv4Address::GetAny ());
          onoff.SetAttribute ("OnTime",  StringValue ("ns3::ConstantRandomVariable[Constant=1]"));
          onoff.SetAttribute ("OffTime", StringValue ("ns3::ConstantRandomVariable[Constant=0]"));
          onoff.SetAttribute ("PacketSize", UintegerValue (payloadSize));
          onoff.SetAttribute ("DataRate", DataRateValue (1000000000)); //bit/s
          AddressValue remoteAddress (InetSocketAddress (staNodeInterface.GetAddress (0), port));
          onoff.SetAttribute ("Remote", remoteAddress);
          ApplicationContainer clientApp = onoff.Install (wifiApNode.Get (0));
          clientApp.Start (Seconds (1.0));
          clientApp.Stop (Seconds (simulationTime + 1));
        }        

    Simulator::Stop (Seconds (simulationTime + 1));
      Simulator::Run ();

      uint64_t nb = 0;
      uint64_t lost = 0;
      if (udp)
        {
          //UDP
          nb = DynamicCast<UdpServer> (serverApp.Get (0))->GetReceived ();
          lost = DynamicCast<UdpServer> (serverApp.Get (0))->GetLost();
          double window = DynamicCast<UdpServer> (serverApp.Get (0))->GetPacketWindowSize();
          std::cout << "Window Size :" << window << std::endl;
        }
      else
        {
          //TCP
          uint64_t totalPacketsThrough = DynamicCast<PacketSink> (serverApp.Get (0))->GetTotalRx ();
          nb = totalPacketsThrough / payloadSize ;

          /*need help here to get the number of lost packets using TCP Thanks*/

        }
      dataset1.Add (d, nb);
      dataset2.Add (d, lost);
      std::cout << nb << " Received packets" << std::endl;
      std::cout << lost << " Lost packets" << std::endl;
      d += step;
      Simulator::Destroy ();
    }
  plot1.AddDataset (dataset1);
  plot2.AddDataset (dataset2);
}

person Lu_U    schedule 07.08.2019    source источник
comment
Просто сравнить totalPacketsThrough с общим количеством отправленных пакетов?   -  person V-Red    schedule 08.08.2019
comment
Можете ли вы включить в свой вопрос раздел кода, где вы устанавливаете приложение TCP?   -  person V-Red    schedule 08.08.2019
comment
Привет @V-Red, спасибо за ваш ответ, я включил раздел кода, в котором установлено приложение. мне нужно знать, пожалуйста, как получить общее количество отправленных пакетов с использованием TCP. или если есть какое-либо другое решение для получения количества потерянных пакетов. В очередной раз благодарим за помощь.   -  person Lu_U    schedule 08.08.2019


Ответы (1)


Используйте трассировку «Tx» для OnOffApplication, чтобы вызывать функцию каждый раз при передаче пакета —

void SourceUdpTrace(Ptr<const Packet> pkt)
{
  nPacketsSent++;
}

Внутри main() используйте следующий оператор Config::Connect, чтобы настроить трассировку и связать ее с SourceUdpTrace. Этот оператор должен быть помещен перед Simulator::Run()

Config::ConnectWithoutContext("/NodeList/*/ApplicationList/*/$ns3::ManualOnOffApp/Tx",MakeCallback(&SourceUdpTrace));

Как только вы узнаете количество отправленных пакетов, вы можете легко определить количество потерянных пакетов, сравнив его со значением nb, найденным вашей строкой кода — nb = totalPacketsThrough / payloadSize;.

person V-Red    schedule 09.08.2019
comment
Привет, @V-Red, я заменил «ns3::ManualOnOffApp» на «ns3::OnOffApplication», и все заработало отлично. Еще раз большое спасибо, вы многому меня научили о NS-3. это было очень полезно. - person Lu_U; 09.08.2019