构造填充用于PING的ICMP

ping命令是使用非常普遍的用于诊断网络连通性的工具,ping命令使用了icmp协议,icmp的完整拼写是Internet Control Message Protocol,即网络控制消息协议。

在ICMP中关于用来探测网络连通性的部分有两个,一个是类型,一个是代码,通过这两个代码完成了echo request和echo reply,也就是请求和应答。当类型为8,代码为0时,icmp进行的是echo request,当类型为0,代码也为0时,icmp进行的是echo reply。

通过抓包可以很容易的得到验证,打开Wireshark,然后在协议过滤的位置输入“icmp”,也就是查看关于ICMP的包。设置好Wireshark后,在cmd下ping其他主机的地址,然后观察Wireshark中的抓包情况,分别查看echo request和echo reply的包如下:

上面的图片是echo request的包,可以看到type为8,code为0;下面的图片是echo reply的包,可以看到type为0,code也为0。

关于ICMP的过多的细节就不讨论了,下面通过C来介绍ICMP的填充。

ICMP的定义如下:

// ICMP Header
typedef struct _ICMPHEADER
{
    unsigned char  i_type;
    unsigned char  i_code;
    unsigned short i_chsum;
    unsigned short i_id;
    unsigned short i_seq;
    unsigned long  i_timestamp;
    unsigned char  i_data[32];
}ICMPHEADER, *PICMPHEADER;

上面就是ICMP在C语言中的定义,下面介绍ICMP结构体的填充,代码如下:

// 填充ICMP包头信息
memset((LPVOID)&icmpHeader, ‘A‘, sizeof(icmpHeader));
icmpHeader.i_type      = 8;  // icmp echo
icmpHeader.i_code      = 0;
icmpHeader.i_chsum     = 0;
icmpHeader.i_id        = (unsigned short)GetCurrentProcessId();
icmpHeader.i_seq       = 0;
icmpHeader.i_timestamp = (unsigned long)::GetTickCount();

代码是基于Windows系统的,在代码中id使用了当前进程的ID,时间戳使用了GetTickCount()这个API函数来进行填充。在上面的填充当中,有一个位置是错误的,就是对i_chsum进行的赋值,该值是一个校验和,在进行校验和计算前,将该值赋值为0进行计算。计算校验和算法的代码如下:

unsigned short *buf = (unsigned short *)&icmpHeader;

// 计算校验和
int nLeft = sizeof(icmpHeader);
int sum = 0;
unsigned short crc = 0;

// 每两个字节进行循环相加
while ( nLeft > 1 )
{
    sum = sum + *(buf ++);
    nLeft -= 2;
}

// 如果还有一个字节没加,也加上
if ( nLeft == 1 )
{
    *(unsigned char *)(&crc) = *(unsigned char *)buf;
    sum += crc;
}

// 因为是16位,如果相加后超过16位
// 那么高16位与低16位相加
sum = (sum >> 16) + (sum & 0xffff);
// 上一步相加如果再次超过16位
// 那么在进行一次高16位与低16位相加
sum += (sum >> 16);
// 取反得到最终的CRC
crc = ~sum;

// 填充校验和
icmpHeader.i_chsum = crc;

校验和的是16位的无符号整型,将每个字进行相加保存到一个32位的正向当中,然后让这个32位的高16位与低16位进行相加,然后取反即是最后的校验和。将校验和填充至ICMP结构体中。

以上就是关于ICMP的填充,与ICMP校验和的计算过程,至于实现ping的话,那么使用socket创建原始套接字将构造好的ICMP进行发送即可。

时间: 2024-11-10 13:47:33

构造填充用于PING的ICMP的相关文章

traceroute ping 开放(icmp|udp)

tarceroute ping 开放(icmp|udp) tarceroute原理ICMP应用之ping ping是一个用来查询网络通不通的一个工具,是系统自带的,运行于内核,调用ICMP协议. ping的工作原理:ping通过调用echo来发送请求,通过是否收到echo-reply来查询网络层的连通性.ping的结果会给出传送的时间和TTL的数据,还可以查看主机到目的主机的路由.这是因为ICMP的ping请求数据报在每经过一个路由器的时候,路由器就会把自己的IP地址放到该数据包中,而目的主机则

Ping命令与ICMP协议

ICMP协议 ICMP是"Internet Control Message Ptotocol"(Internet控制消息协议)的缩写.它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间传递控制消息 ping命令 ping命令通常用来作为网络可用性的检查.ping命令可以对一个网络地址发送测试数据包,看该网络地址是否有响应并统计响应时间,以此测试网络. ping和ICMP的关系 ping命令发送数据使用的是ICMP协议. ping的原理 向指定的网络地址发送一定长度的数据包,

【网络协议】ICMP协议、Ping、Traceroute

    ICMP协议 ICMP常常被觉得是IP层的一个组成部分,它是网络层的一个协议.它传递差错报文以及其它须要注意的信息.ICMP报文通常被IP层或更高层(TCP.UDP等)使用,它是在IP数据报内传输的. ICMP报文大致分为两类:查询报文和差错报文. 先来看差错报文.当传送IP数据报错误发生时(比方主机不可达.网络不可达等),ICMP协议将会发送一个ICMP差错报文给源主机,好让主机做出对应的处理,也因此IP层以上的一些协议有可能做到可靠传输. 书中给出了ICMP差错报文中的一些组合(类型

Linux服务器关闭/开启ICMP协议(ping)

经常会遇到一些问题就是主机明明是在线的却ping不通的,对方可能开启了禁ping模式有时为安全问题着想,需要给我们的Linux服务器禁ping 关闭ICMP协议(禁ping) echo "1">/proc/sys/net/ipv4/icmp_echo_ignore_all cat /proc/sys/net/ipv4/icmp_echo_ignore_all 打开ICMP协议(取消禁ping) echo "0">/proc/sys/net/ipv4/ic

Ping命令的设计与实现

ping命令的设计与实现 发表于 C++ Socket TCP/IP 2016-05-15 19:07 字数: 10796 阅读量: 528 ping 命令使用的相关 TCP/IP 协议 ping 命令是用来查看网络上另一个主机系统的网络连接是否正常的一个工具. ping 命令执行后显示出被测试系统主机名和相应 IP 地址.返回给当前主机的 ICMP 报文顺序号.ttl 生存时间和往返时间 rtt(单位是毫秒,即千分之一秒). ping 命令所使用到的 TCP/IP 协议:ICMP 协议: IC

5.HCNA-HNTD——ICMP协议

Internet控制报文协议ICMP是网络层的一个重要协议.ICMP协议用来在网络设备间传递各种差错和控制信息,它对于收集各种网络信息.诊断和排除各种网络故障具有至关重要的作用.使用基于ICMP的应用时,需要对ICMP的工作原理非常熟悉. 学习目标: 1. 描述ICMP的应用场景 2. 理解常见的ICMP报文类型 3. 掌握ping和tracert的应用 ICMP是TCP/IP协议簇的核心协议之一,它用于在IP网络设备之间发送控制报文,传递差错.控制.查询等信息. ICMP Redirect重定

Linux编程之PING的实现

void icmp_pack(struct icmp* icmphdr, int seq, int length) { int i = 0; icmphdr->icmp_type = ICMP_ECHO; //类型填回送请求 icmphdr->icmp_code = 0; icmphdr->icmp_cksum = 0; //注意,这里先填写0,很重要! icmphdr->icmp_seq = seq; //这里的序列号我们填1,2,3,4.... icmphdr->icmp

1-11 ICMP协议

ICMP协议 IP不提供可靠的传输服务,也不提供端到端或点到点的确认,如果出错可以通过ICMP报告来看,它在IP模块中实现.TCP/IP协议设计了ICMP就是为了弥补IP协议的不足. 它是TCP/IP协议族的一个子协议,用于在IP主机.路由器之间专递控制消息.控制消息指网络通不通,主机可以否达,路由是否可用等.这些控制消息传递的并不是用户数据,但是对用户数据的传输起到了重要的作用. 作用:负责差错控制,拥塞控制,传输控制. 工作过程: ping是ICMP协议的工作过程. 本机发送一个ICMP E

Swift和C混合Socket编程实现简单的ping命令

这个是用Mac下的Network Utility工具实现ping命令,用Wireshark抓取的ICMP数据包: 发送ICMP数据包内容 接受ICMP数据包内容 一.icmp结构 要真正了解ping命令实现原理,就要了解ping命令所使用到的TCP/IP协议.ICMP(Internet Control Message,网际控制报文协议)是为网关和目标主机而提供的一种差错控制机制,使它们在遇到差错时能把错误报告给报文源发方.ICMP协议是IP层的 一个协议,但是由于差错报告在发送给报文源发方时可能