参考
一、构建一个总线网络的拓扑结构
ns-3提供了一个网络设备和信道模型,即CSMA(载波感知多址),为以太网采用的模型CSMA/CD的一个子集。
我们将通过在右侧挂起一个总线(bus)网络来扩展我们的点对点示例(first.cc)。如果将nCsma设置为1,则局域网(CSMA信道)上总共有两个节点——一个必需节点(n1)和一个“额外”节点。默认情况下,有三个“额外的”节点(n2,n3,n4),如下所示:
// Default Network Topology
//
// 10.1.1.0
// n0(client) -------------- n1 n2 n3 n4(sever)
// point-to-point | | | |
// ================
// LAN 10.1.2.0
二、second.cc结构及功能分析
1. 脚本基本结构
- 代码规范
- 头文件
- 命名空间
- 日志
- 主函数声明
- 主函数准备工作
- 构建网络拓扑
- 安装TCP/IP协议族
- 安装应用层
- 设置路由
- 数据追踪
- 启动与结束
2. 主函数详细分析
2.1 主函数准备工作
//使用一个详细的标志来确定是否启用了客户端应用程序和客户端服务器应用程序日志记录组件
bool verbose = true;
uint32_t nCsma = 3;
//配置可在命令行修改脚本参数
CommandLine cmd(__FILE__);
cmd.AddValue("nCsma", "Number of \"extra\" CSMA nodes/devices", nCsma);
cmd.AddValue("verbose", "Tell echo applications to log if true", verbose);
cmd.Parse(argc, argv);
//日志记录
if (verbose)
{
LogComponentEnable("UdpEchoClientApplication", LOG_LEVEL_INFO);
LogComponentEnable("UdpEchoServerApplication", LOG_LEVEL_INFO);
}
//保证最少有一个额外节点
nCsma = nCsma == 0 ? 1 : nCsma;
2.2 构建网络拓扑
//创建两个P2P节点
NodeContainer p2pNodes;
p2pNodes.Create(2);
//声明一个节点容器,从P2P的两节点中取编号为1的节点,将其配置为CSMA节点,其中包含总线(CSMA)网络的3个额外节点
NodeContainer csmaNodes;
csmaNodes.Add(p2pNodes.Get(1));
csmaNodes.Create(nCsma);
//配置P2P信道的延迟及数据传输速率
PointToPointHelper pointToPoint;
pointToPoint.SetDeviceAttribute("DataRate", StringValue("5Mbps"));
pointToPoint.SetChannelAttribute("Delay", StringValue("2ms"));
//安装P2P网卡到P2P网络节点
NetDeviceContainer p2pDevices; //创建网络设备
p2pDevices = pointToPoint.Install(p2pNodes); //连接节点与信道
//创建CSMA设备并连接CSMA设备到信道
CsmaHelper csma;
//设置CSMA传输速率和传播延迟,注意数据传输速率由channel属性指定,而非device属性,因为CSMA不允许同一信道上有多个不同数据率的设备
csma.SetChannelAttribute("DataRate", StringValue("100Mbps"));
csma.SetChannelAttribute("Delay", TimeValue(NanoSeconds(6560)));
//安装CSMA网卡到CSMA网络节点
NetDeviceContainer csmaDevices;
csmaDevices = csma.Install(csmaNodes);
2.3 安装TCP/IP协议族
//安装TCP/IP协议栈
InternetStackHelper stack;
stack.Install(p2pNodes.Get(0));
stack.Install(csmaNodes);
//为设备接口分配IP地址
Ipv4AddressHelper address;
//为两个10.1.1.0网段的P2P设备分配IP
address.SetBase("10.1.1.0", "255.255.255.0");
Ipv4InterfaceContainer p2pInterfaces;
p2pInterfaces = address.Assign(p2pDevices);
//为三个10.1.2.0网段的CSMA设备分配IP
address.SetBase("10.1.2.0", "255.255.255.0");
Ipv4InterfaceContainer csmaInterfaces;
csmaInterfaces = address.Assign(csmaDevices);
2.4 安装应用层
在有CSMA设备的节点上实例化服务器,在P2P节点上实例化客户端
//配置服务器端口号为9
UdpEchoServerHelper echoServer(9);
//在节点4中安装服务端程序
//csmaNodes节点容器中包含一个P2P节点和nCsma个CSMA节点,要Get的是最后一个extra节点,csmaNodes中的第0个节点是P2P节点
ApplicationContainer serverApps = echoServer.Install(csmaNodes.Get(nCsma));
serverApps.Start(Seconds(1.0));
serverApps.Stop(Seconds(10.0));
//配置客户端程序属性
UdpEchoClientHelper echoClient(csmaInterfaces.GetAddress(nCsma), 9);
echoClient.SetAttribute("MaxPackets", UintegerValue(1));
echoClient.SetAttribute("Interval", TimeValue(Seconds(1.0)));
echoClient.SetAttribute("PacketSize", UintegerValue(1024));
//在节点0中安装客户端程序
ApplicationContainer clientApps = echoClient.Install(p2pNodes.Get(0));
clientApps.Start(Seconds(2.0));
clientApps.Stop(Seconds(10.0));
2.5 设置路由
因为网络拓扑存在不同网段的IP地址,两个网络属于不同的子网,这就需要连接两个子网的p2pNodes.Get(1)节点具有路由功能,这样才能正确转发从P2P子网发往CSMA子网的分组。
ns-3有线网络最常用的路由协议之一是全局路由。全局路由通过开放式最短路径优先(OSPF)路由算法计算有线网络拓扑中每两个节点的最短路径,并为每个节点生成路由表。
对于IPv4协议,全局路由设置一般是通过在脚本中调用助手类Ipv4GlobalRoutingHelper的PopulateRoutingTables()函数完成的。
Ipv4GlobalRoutingHelper::PopulateRoutingTables();
2.6 PCAP数据追踪
pointToPoint.EnablePcapAll("second");
//ture:采用混杂模式嗅探数据包
csma.EnablePcap("second", csmaDevices.Get(1), true);
从CSMA网络中收集跟踪信息有两种基本方案:
第一种方法是为每个网络设备(Device)创建一个跟踪文件,并只存储该网络设备发出或消耗的数据包;
第二种方法是选择其中一个设备,并将其置于混杂模式(promiscuous mode )下。然后该单一设备会“嗅探”网络中的所有数据包,并将它们存储在一个pcap文件中,即tcpdump的工作方式。
2.7 运行和清理
Simulator::Run();
Simulator::Destroy();
3. 仿真结果分析
与文档中的输出不一致,why??
3.1 LOG结果分析
3.2 数据记录文件分析
tcpdump -nn -tt -r second-0-0.pcap
tcpdump -nn -tt -r second-1-0.pcap
tcpdump -nn -tt -r second-2-0.pcap
链接类型EN10MB代表以太网
总线网络需要ARP,即地址解析协议(Address Resolution Protocol),是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
Node1知道它需要将数据包发送到IP地址10.1.2.4的Node,但它不知道相应Node的MAC地址。它在CSMA网络上(ff:ff:ff:ff:ff:ff)上进行广播,询问IP地址为10.1.2.4的设备。最右边的Node回复说,它在MAC地址00:00:00:00:00:06。
注意,Node2并没有直接参与此交换,而是在嗅探网络并报告它所看到的所有流量。