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帧为例 ...
随机推荐
- react-native 在新版Xcode(10+)中运行出现的问题: node_modules/react-native/third-party/glog-0.3.4 , C compiler cannot create executables
报错发生在 react-native : 0.55.4 (或存在于更低的版本) 报错: ----/node_modules/react-native/third-party/glog-0.3.4': ...
- python初体验 ——>>> 模拟体育竞技
python初体验 ——>>> 模拟体育竞技 一.排球训练营 1. 简介: 模拟不同的两个队伍进行排球的模拟比赛. 2. 模拟原理: 通过输入各自的能力值(Ⅰ),模拟比赛的进行( P ...
- python之多线程与多进程
1. 多进程与多线程 (1)背景:为何需要多进程或者多线程:在同一时间里,同一个计算机系统中如果允许两个或者两个以上的进程处于运行状态,这便是多任务.多任务会带来的好处例如用户边听歌.边上网.边打印, ...
- Counting Kangaroos is Fun 求最少可见袋鼠数
Description There are n kangaroos with pockets. Each kangaroo has a size (integer number). A kangaro ...
- Leetcode 274.H指数
H指数 给定一位研究者论文被引用次数的数组(被引用次数是非负整数).编写一个方法,计算出研究者的 h 指数. h 指数的定义: "一位有 h 指数的学者,代表他(她)的 N 篇论文中至多有 ...
- 洛谷P2870 - [USACO07DEC]最佳牛线Best Cow Line
Portal Description 给出一个字符串\(s(|s|\leq3\times10^4)\),每次从\(s\)的开头或结尾取出一个字符接在新字符串\(s'\)的末尾.求字典序最小的\(s'\ ...
- Java设计模式之(设计模式的概述)
概述: 设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众多软件开发 ...
- 巴蜀4384 -- 【模拟试题】作诗(Poetize)
Description 神犇SJY虐完HEOI之后给傻×LYD出了一题:SHY是T国的公主,平时的一大爱好是作诗.由于时间紧迫,SHY作完诗之后还要虐OI,于是SHY找来一篇长度为N的文章,阅读M次, ...
- 51nod1184 第N个质数
如题.$n \leq 1e9$. 方法零:二分,然后洲阁筛.要魔改一下的洲阁筛.跑得慢.卡卡能过.没意思. //#include<iostream> #include<cstring ...
- 《effective C++》:条款07——为多态基类声明virtual析构函数
在继承中,基类的析构函数需要定义为虚析构函数数否则: (1)当派生类对象经由一个base类指针删除时,而这个base类的析构函数不是虚函数时,其结果是未定义的. (2)这样做会导致derived类部分 ...