LTE用户文档
(如有不当的地方,欢迎指正!)
14 Evolved Packet Core (EPC)
我们现在讲解如何编写一个仿真程序——除了 LTE 无线接入网外,还允许仿真 EPC。 EPC 允许使用 IPv4 网络与 LTE 设备连接。换句话说,可以在 LTE 上使用常规的 ns-3 应用和 IPv4 sockets ,并且能够把 LTE 网络与仿真中的任何 IPv4 网络相连接。
首先,除了我们已经在 Basic simulation program 中介绍过的 LteHelper 之外 ,你还需要使用一个额外的 EpcHelper 类——负责创建 EPC 实体和网络拓扑。 注意,你不能直接使用 EpcHelper ,因为它是一个抽象基类;相反,你需要使用它的一个子类——提供不同的 EPC 拓扑实现。 本例中,我们会考虑 PointToPointEpcHelper, 基于点对点链路实现 EPC 。为了使用它,首先需要在仿真程序中插入下列代码:
Ptr<LteHelper> lteHelper = CreateObject<LteHelper> (); Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();
然后,你需要告诉 LTE helper 接下来要使用 EPC:
lteHelper->SetEpcHelper (epcHelper);
上面一步是很有必要的, LTE helper 将触发合适的 EPC 配置与一些相关的重要配置,例如当一个基站或用户添加到仿真中时或者创建一个EPS 承载时。另外,所有这些实现都不受用户的干预。
调用 lteHelper->SetEpcHelper (epcHelper) 会使能 EPC 起作用,同时具有副作用——创建的任何新的 LteEnbRrc 所拥有的 EpsBearerToRlcMapping 属性设置为 RLC_UM_ALWAYS 而不是 RLC_TM_ALWAYS(原文档中写的是RLC_SM_ALWAYS,有误!) ,如果后者是默认的话;否则,属性不会改变(例如,如果你修改默认属性为 RLC_AM_ALWAYS, 它将不会变动)。
注意, EpcHelper 也会自动地创建 PGW 节点并配置它,以便它可以合适地处理来自/去往 LTE 无线接入网的业务。不过,你需要添加一些明确的代码来连接 PGW 到其他的 IPv4 网络(例如因特网)。这里有一个非常简单的例子——如何通过点对点链路连接单个远程主机到 PGW :
Ptr<Node> pgw = epcHelper->GetPgwNode (); // 创建一个远程主机 NodeContainer remoteHostContainer; remoteHostContainer.Create (1); Ptr<Node> remoteHost = remoteHostContainer.Get (0); InternetStackHelper internet; internet.Install (remoteHostContainer); // 创建 internet PointToPointHelper p2ph; p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s"))); p2ph.SetDeviceAttribute ("Mtu", UintegerValue (1500)); p2ph.SetChannelAttribute ("Delay", TimeValue (Seconds (0.010))); NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost); Ipv4AddressHelper ipv4h; ipv4h.SetBase ("1.0.0.0", "255.0.0.0"); Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign (internetDevices); // 接口 0 为本地主机,1 为 p2p 设备 Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress (1);
指定路由很重要,以便远程主机可以到达 LTE 用户。实现这的一个方式是利用这样一个事实——PointToPointEpcHelper 默认会分配 LTE 用户一个7.0.0.0 网络的 IP 地址。只要考虑到这一点就足够了:
Ipv4StaticRoutingHelper ipv4RoutingHelper; Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ()); remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);
现在,你应该继续并创建 LTE 基站和用户(参考前面章节)。 当然,你可以配置 LTE 的其他方面,例如路径损耗和衰落模型。 一旦你创建完用户,你应该也给它们配置 IP 网络。按照下面的方式实现。我们假定你有一个装用户和基站节点的容器,类似于:
NodeContainer ueNodes; NodeContainer enbNodes;
配置一个只有 LTE 的仿真,你通常会这样做:
NetDeviceContainer ueLteDevs = lteHelper->InstallUeDevice (ueNodes); lteHelper->Attach (ueLteDevs, enbLteDevs.Get (0));
为了给用户配置 IP 网络,你只需要额外添加这些:
// 在用户上安装 IP 协议栈 InternetStackHelper internet; internet.Install (ueNodes); // 给用户分配 IP 地址 for (uint32_t u = 0; u < ueNodes.GetN (); ++u) { Ptr<Node> ue = ueNodes.Get (u); Ptr<NetDevice> ueLteDevice = ueLteDevs.Get (u); Ipv4InterfaceContainer ueIpIface = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueLteDevice)); // 为用户设置默认网关 Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ue->GetObject<Ipv4> ()); ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1); }
EPC 的承载激活与 LTE-only 仿真稍微不同。首先,当使用 EPC 时,不再使用 ActivateDataRadioBearer 方法。其次,使用 EPC ,当你调用 LteHelper::Attach () 时,默认的 EPS 承载将自动激活。第三,如果你想设置专用的 EPS 承载,你可以使用方法 LteHelper::ActivateDedicatedEpsBearer () 来实现。 该方法被看作一个参数 Traffic Flow Template (TFT,业务流模板)——一个定义业务(会被映射到专用的 EPS 承载上)类型的结构体。下面一个例子讲的是,当用户在端口 1234 通信时,如何为应用设置专用的无线承载:
Ptr<EpcTft> tft = Create<EpcTft> (); EpcTft::PacketFilter pf; pf.localPortStart = 1234; pf.localPortEnd = 1234; tft->Add (pf); lteHelper->ActivateDedicatedEpsBearer (ueLteDevs, EpsBearer (EpsBearer::NGBR_VIDEO_TCP_DEFAULT), tft);
你当然也可以使用自定义的 EpsBearer 和 EpcTft 配置,请参考 doxygen 文档来学习如何实现它。
最后,你可以在 LTE 用户节点上安装应用,通过因特网与远程应用进行通信。这可以通过一般的ns3 过程实现。 接下来是一个简单的例子,一个远程主机,如何设置下行通信,远程主机上有一个 UdpClient 应用,LTE 用户(与前面的代码片段使用相同的变量名)上有一个 PacketSink。
uint16_t dlPort = 1234; PacketSinkHelper packetSinkHelper ("ns3::UdpSocketFactory", InetSocketAddress (Ipv4Address::GetAny (), dlPort)); ApplicationContainer serverApps = packetSinkHelper.Install (ue); serverApps.Start (Seconds (0.01)); UdpClientHelper client (ueIpIface.GetAddress (0), dlPort); ApplicationContainer clientApps = client.Install (remoteHost); clientApps.Start (Seconds (0.01));
好了,现在你可以像往常一样开始你的仿真:
Simulator::Stop (Seconds (10.0)); Simulator::Run ();
参考文献
https://www.nsnam.org/docs/models/html/lte-user.html