NS3网络仿真(12): ICMPv4协议
快乐虾
http://blog.csdn.net/lights_joy/
欢迎转载,但请保留作者信息
ICMP的全称是 Internet ControlMessage Protocol 。
其目的就是让我们可以检測网络的连通状况。ICMP主要是透过不同的类别(Type)与代码(Code) 让机器来识别不同的连接状况。本节利用NS3学习一下此协议。
1.1 报文格式
ICMP的报文格式例如以下:
即ICMP报文是IP报文的数据。而IPv4报文的格式例如以下:
在网上抓一个ping包来看看:
这是一个从192.168.24.1到192.168.24.129的ping包。再看看192.168.24.129的回应:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
非常easy和前面的报文格式相应上。
1.2 用NS3生成ICMP的请求包
接下来试试用NS3生成上面的ICMP的请求包。
依照NS3数据包的生成规则,首先须要准备ICMP请求的数据部分,即报文中的abcde...:
// 填充的数据内容
uint8_t buffer[2048] = { 0 };
for (int i = 0; i < m_nCurPacketLen; i++)
{
buffer[i] = 'a' + (i % 23);
}
Ptr<Packet> data = ns3::Create<Packet>(buffer, m_nCurPacketLen);
接下来填充Icmp Echo的包头:
// 生成要发送的数据包列表
Ptr<Packet> pkt = ns3::Create<Packet>(); // 加入icmp echo头
Icmpv4Echo eh;
eh.SetData(data);
eh.SetSequenceNumber(0x0019/*m_nCurPacketSeq*/);
eh.SetIdentifier(1);
pkt->AddHeader(eh);
这里的seq是一个可变的整数,仅仅只是我们为了与上面的数据包一致写入了一个固定的数值。
接下来填充Icmp Header:
// 加入icmp头
Icmpv4Header ih;
ih.SetCode(0);
ih.SetType(Icmpv4Header::ECHO);
ih.EnableChecksum();
pkt->AddHeader(ih);
这里唯一须要注意的是EnableChecksum必须在AddHeader前调用,否则不会生成校验和。
再加上IP包头:
// 加入IP头
Ipv4Header iph;
iph.SetDestination((const char*)dest_ip);
iph.SetSource((const char*)src_ip);
iph.SetIdentification(0x49fb);
iph.SetTtl(64);
iph.SetProtocol(Icmpv4L4Protocol::PROT_NUMBER);
iph.SetPayloadSize(pkt->GetSize());
iph.EnableChecksum();
pkt->AddHeader(iph);
最后加上以太网包头:
// 加入以太网头
EthernetHeader eeh;
eeh.SetDestination((const char*)dest_mac);
eeh.SetSource((const char*)src_mac);
eeh.SetLengthType(ns3::Ipv4L3Protocol::PROT_NUMBER);
pkt->AddHeader(eeh);
int len = pkt->CopyData(buffer, 2048);
大功告成!看看我们生成的数据包内容:
与前面从网上抓下来的包一模一样。
1.3 用NS3分析ICMP请求包
分析包的过程和构造包的过程刚好相反。从最外面的以太网包一直分析到数据:
/* Callback function invoked by libpcap for every incoming packet */
void CCommonIcmpSendDlg::packet_handler(void *_param, const void *_header, const void *_pkt_data)
{
uint8_t buffer[2048], *p;
p = (uint8_t *)_pkt_data + 12;
if (p[0] != 8 || p[1] != 0)
return; const struct pcap_pkthdr *header = (const struct pcap_pkthdr *)_header;
Ptr<Packet> pkt = ns3::Create<Packet>((uint8_t*)_pkt_data, header->len); // ip 包
EthernetHeader eh;
Ipv4Header iph;
pkt->RemoveHeader(eh);
pkt->RemoveHeader(iph);
if (iph.GetProtocol() != Icmpv4L4Protocol::PROT_NUMBER)
return; Icmpv4Header ih;
Icmpv4Echo ieh;
SIcmpPacket* ppkt;
pkt->RemoveHeader(ih);
if (ih.GetType() == Icmpv4Header::ECHO_REPLY)
{
pkt->RemoveHeader(ieh);
if (ieh.GetIdentifier() != dlg->m_nIcmpId)
return;
int seq = ieh.GetSequenceNumber();
.....
return;
}
}
1.4 winpcap发包的问题
在发送ICMP包时,使用了pcap_sendpacket函数进行发包,但此函数的发包延迟较大,从函数调用到从网卡上抓到这个包可以有几百个毫秒的延迟。
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" />
暂且记下来以供后继參考。
NS3网络仿真(12): ICMPv4协议的更多相关文章
- NS3网络仿真(6): 总线型网络
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载.但请保留作者信息 在NS3提供的第一个演示样例first.py中,模拟了一个点对点的网络,接下来的一个演示样例代码模 ...
- NS3网络仿真(7): Wifi节点
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在上一节中.我们仿真了一个总线型网络,这一节尝试将上一节中的n0变成一个无线的AP.再连上几个节点 ...
- NS3网络仿真(2):first.py
1 安装基本模块 11 安装Python 12 安装PTVS 13 加入对python-279的支持 2 在vs2013下编译NS3 3 编译NetAnim 4 在vs2 ...
- NS3网络仿真(11): ARP
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 ARP(Address ResolutionProtocol,地址解析协议)协议的基本功能就是通过 ...
- NS3网络仿真(9): 构建以太网帧
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3使用了一个叫Packet的类来表示一个数据帧,本节尝试用它构造一个以太网帧. 以下是一个典 ...
- NS3网络仿真(3): NetAnim
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3提供的演示样例first.py中,并没有生成NetAnim所须要的xml文件,本节我们尝试 ...
- NS3网络仿真(4): DataRate属性
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在first.py中创建了一个点到点的信道,且配置了两个属性: pointToPoint = ns ...
- 网络教程(12) TCP协议
IP协议的限制 IP协议需要 datalink帧来包装它 Ethernet或者PPP 一般都有1500byte字节或者大小的限制 可能会出现的问题 Packet loss – retransmit R ...
- NS3网络仿真(10): 解析以太网帧
快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载.但请保留作者信息 解析以太网帧的过程是构建以太网帧的逆过程,当我们接收到一个以太网帧时,仍然以上一节中的ARP帧为例 ...
随机推荐
- UVa-401-Palindromes(回文)
这一题的话我们可以把映像字符的内容给放入一个字符串常量里面,然后开辟一个二维的字符串常量数组,里面放置答案. 对于回文实际上是很好求的,对于镜像的话,我们写一个返回char的函数,让它接收一个char ...
- linux中的vi命令
linux的重要的几个命令如下: ①,光标的操作 1,gg,G,nG,:n gg移到文档的开头一行,G移动到最后一行,nG移动到第n行,到指定的行. 2,H,M,L 光标分别移动到这个界面的最上边,中 ...
- 记第一次开发安卓应用——IT之家RSS阅读器
这个学期学校开了安卓的课程,因为自己一直学习wp的开发,一直用的是.net和Silverlight这一套,也着实没有太多时间投入安卓的方向去,因为想着毕业也不从事安卓的工作,所以也一直没有怎么研究.但 ...
- robot framework常见错误:RIDE运行一次后不显示log
在使用RIDE进行web自动化测试时,会发现经常运行第二遍不显示下方log,如下 原因: 代码使用的是谷歌浏览器.IE浏览器测试,运行一次后chromedriver.exe,IEDriverServe ...
- Android CircleImageView圆形ImageView
Android CircleImageView圆形ImageView CircleImageView是github上一个第三方开源的实现圆形ImageView的项目.其在github上的项目主页 ...
- [Go]链表的相关知识
切片有着占用内存少喝创建便捷等特点,但它本质上还是数组.切片的一大好处是可以通过窗口快速地定位并获取或者修改底层数组中的元素.不过当删除切片中的元素的时候就没那么简单了.元素复制一般是免不了的,就算只 ...
- bzoj 1503[NOI 2004] 郁闷的出纳员
题目大意: 给4种操作 I:添加一个员工工资信息 A:增加所有员工的工资 S:减少所有员工的工资 F:询问工资第k高的员工的工资情况 自己做的第一道splay树的题目,初学找找感觉 #include ...
- HDU1711 最基础的kmp算法
Problem Description Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], .... ...
- [luoguP1947] 笨笨当粉刷匠_NOI导刊2011提高(10)(DP)
传送门 f[i][j][k]表示前i行,最后一行前j个,选k次最优解 ntr[i][j][2]表示当前行区间i~j涂0或1所能刷的正确格子 #include <cstdio> #defin ...
- 【链表】2017多校训练三 HDU 6058 Kanade's sum
acm.hdu.edu.cn/showproblem.php?pid=6058 [题意] 给定一个排列,计算 [思路] 计算排列A中每个数的贡献,即对于每个ai,计算有ni个区间满足ai是区间中的第k ...