快乐虾

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协议的更多相关文章

  1. NS3网络仿真(6): 总线型网络

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载.但请保留作者信息 在NS3提供的第一个演示样例first.py中,模拟了一个点对点的网络,接下来的一个演示样例代码模 ...

  2. NS3网络仿真(7): Wifi节点

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在上一节中.我们仿真了一个总线型网络,这一节尝试将上一节中的n0变成一个无线的AP.再连上几个节点 ...

  3. NS3网络仿真(2):first.py

    1    安装基本模块 11  安装Python 12  安装PTVS 13  加入对python-279的支持 2    在vs2013下编译NS3 3    编译NetAnim 4    在vs2 ...

  4. NS3网络仿真(11): ARP

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 ARP(Address ResolutionProtocol,地址解析协议)协议的基本功能就是通过 ...

  5. NS3网络仿真(9): 构建以太网帧

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3使用了一个叫Packet的类来表示一个数据帧,本节尝试用它构造一个以太网帧. 以下是一个典 ...

  6. NS3网络仿真(3): NetAnim

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在NS3提供的演示样例first.py中,并没有生成NetAnim所须要的xml文件,本节我们尝试 ...

  7. NS3网络仿真(4): DataRate属性

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载,但请保留作者信息 在first.py中创建了一个点到点的信道,且配置了两个属性: pointToPoint = ns ...

  8. 网络教程(12) TCP协议

    IP协议的限制 IP协议需要 datalink帧来包装它 Ethernet或者PPP 一般都有1500byte字节或者大小的限制 可能会出现的问题 Packet loss – retransmit R ...

  9. NS3网络仿真(10): 解析以太网帧

    快乐虾 http://blog.csdn.net/lights_joy/ 欢迎转载.但请保留作者信息 解析以太网帧的过程是构建以太网帧的逆过程,当我们接收到一个以太网帧时,仍然以上一节中的ARP帧为例 ...

随机推荐

  1. Ubuntu下压缩与解压各种文件的命令

    1.压缩与解压xz文件 (1)压缩 xz -z  filename (2)解压 xz -d  filename.xz 2.压缩与解压tar文件 (1)压缩 tar -cvf  filename(压缩到 ...

  2. 详解Spring面向切面编程(AOP)三种实现

    一.什么是AOP AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善. ...

  3. PHP基于phpqrcode类生成二维码的方法详解

    前期准备: 1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是 ...

  4. 条款7:为多太基类声明virtual析构函数

    NOTE: 1.polymorphic(多态性质的)base classes 应该声明一个virtual 析构函数.如果class带有任何virtual函数,它就应该拥有一个virtual析构函数. ...

  5. Mysql 锁总结

    锁 部分总结参考博客 http://b.codejs.cc/articles/2017/10/23/1508749325215.html http://blog.csdn.net/cug_jiang1 ...

  6. Android开发——Activity生命周期

    Android开发--Activity生命周期 Activity作为四大组件之首,也是使用最频繁的一种组件.本文将主要讲解Activity生命周期,包括正常情况下的Activity生命周期和异常情况下 ...

  7. 理解js的几个关键问题(1):全局变量new和关于hasOwnPropery和PropertyIsEnumerable 等

    一.作用域和全局变量 var test=function(){ var a=1; setTimeout(function(){ console.log(a); a=2; },1000); a=3; s ...

  8. intellij idea2016

    注册server http://idea.imsxm.com

  9. NLS_LANG在客户端不能确定,字符集转变将造成不可预期的后果

    原因:1,没有客服端配置字符集2,客户端字符集跟服务端字符集不一致 解决:1,打开plsql 帮助-支持信息看看uls_lang是否设置 2,查看服务器端字符集 Select *from V$NLS_ ...

  10. bzoj5090组题 分数规划

    组题 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 542  Solved: 114[Submit][Status][Discuss] Descript ...