基于ICMP协议的ping命令

article/2025/9/16 16:33:40

要模拟实现ping命令,就需要对ICMP协议有所了解:

ICMP:Internet控制报文协议,它是TCP/IP协议族中的一个子协议,用于在IP主机,路由之间传递信息的协议。

传输的信息包括:

1.目的不可达消息

2.超时消息

3.重定向消息

4.时间戳请求和时间戳响应消息

5.回显请求和回显响应消息。

ping命令 的机制就是回显请求和回显应答消息,具体是向网络上另一个主机上发送ICMP报文,如果指定的主机得到了这个报文,就将报文原封不动的发送回发送者。

ICMP报文格式:

类型:回显请求报文其中类型为0,代码为0

代码:回显应答报文其中类型为8,代码为0

校验和:包括数据在内整个ICMP协议数据包校验和

标识符:用于文艺标识ICMP报文,Linux中使用进程ID

序列号:报文的序列号

数据:ping中将发送报文的时间戳放入数据字段

通过下面的代码可以打印出IP协议头部的格式:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netinet/ip_icmp.h>
#include <netinet/ip.h>int main() {int sfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);if(sfd < 0){perror("socket");return 1;}int opt = 1;setsockopt(sfd, IPPROTO_IP, IP_HDRINCL, &opt, sizeof(opt));char buf[1500];while(1){memset(buf, 0x00, sizeof(buf));int ret = read(sfd, buf, 1500);if(ret <= 0){break;}struct iphdr* pip = (struct iphdr*)(buf);struct in_addr ad;ad.s_addr = pip->saddr;//printf("protocol: %hhd, %s <-----> ", pip->protocol, inet_ntoa(ad));printf("数据报为%s <===>",inet_ntoa(ad));ad.s_addr = pip->daddr;printf("%s\n", inet_ntoa(ad));}return 0;
}

打印出信息如下:

准备工作就绪,先看看系统的ping长得样子:

首先介绍几个函数:

1.得到主机的时间,精确到毫秒

int gettimeofday(struct timeval *tv, struct timezone *tz);//获取的时间为微秒级的,big存放在tv中。
struct timeval {time_t      tv_sec;     /* seconds */suseconds_t tv_usec;    /* microseconds */};这是一个线程安全的函数。

2.类似DNS的域名解析,将输入的域名解析成ip地址

struct hostent *gethostbyname(const char *name);     //函数返回给定主机名的hostent类型的结构。struct hostent {char  *h_name;            /* official name of host */char **h_aliases;         /* alias list */int    h_addrtype;        /* host address type */int    h_length;          /* length of address */char **h_addr_list;       /* list of addresses */
}

3.校验和:

校验算法可以分成两步来实现。
首先在发送端,有以下三步:
1.把校验和字段置为 0。
2.对需要校验的数据看成以 16bit 为单位的数字组成,依次进行二进制求和。
3.将上一步的求和结果取反,存入校验和字段。
其次在接收端,也有相应的三步:
1.对需要校验的数据看成以 16bit 为单位的数字组成,依次进行二进制求和,包括校验和字段。
2.将上一步的求和结果取反
3.判断最终结果是否为 0。如果为 0,说明校验和正确。如果不为 0,则协议栈会丢掉接收到的数据。

unsigned short chksum(unsigned short* addr, int len)   //校验和
{unsigned int ret = 0;while(len > 1){ret += *addr++;len -= 2;}if(len == 1){ret += *(unsigned char*)addr;}ret = (ret >> 16) + (ret & 0xffff);ret += (ret >> 16);return (unsigned short)~ret;
}

万事具备:完整代码链接

代码执行结果:

至此,整个ping命令就全部模仿出来了,ping命令基本的结构都有了。


http://chatgpt.dhexx.cn/article/0YS7p9TJ.shtml

相关文章

设置Windows防火墙以允许被ICMP Ping(两种配置方式)

本文由荒原之梦原创&#xff0c;原文链接&#xff1a;http://zhaokaifeng.com/?p1119 背景与目的 Ping测试常被用于测试网络中两台主机之间是否互相连通&#xff0c;但是&#xff0c;大多数Windows操作系统&#xff08;包括桌面版和服务器版&#xff09;默认都是只允许ping其…

ICMP报文详解之ping实现

ping是向网络主机发送ICMP回显请求(ECHO_REQUEST)分组&#xff0c;是TCP/IP协议的一部分。主要可以检查网络是否通畅或者网络连接速度快慢&#xff0c;从而判断网络是否正常。 ping命令底层使用的是ICMP&#xff0c;ICMP报文封装在ip包里。它是一个对IP协议的补充协议&#xf…

关于ICMP简介

ICMP 简介 ICMP是&#xff08;Internet Control Message Protocol&#xff09;Internet控制报文协议。 ICMP协议是一种面向无连接的协议&#xff0c;它是TCP/IP协议族的一个子协议&#xff0c;用于在IP主机、路由器之间传递控制消息。ICMP是一个网络层协议。 ICMP协议的功能主…

认识ICMP协议 —— ping命令的作用过程

目录 一、为什么需要ICMP协议&#xff1f; 二、ICMP协议的报文格式 三、ICMP协议的作用过程&#xff08;ping命令的作用过程&#xff09; 1、通过DNS解析域名 2、封装各个协议的报头 3、发送包 四、ping命令的坑 ICMP协议是一个网络层协议&#xff0c;但在IP协议之上&am…

ICMP详解和实例分析

ICMP是网际报文控制协议&#xff0c;它是一个对IP协议的补充协议。允许主机或路由器报告差错情况和异常状况。 一、ICMP报文格式和各个字段的含义 ICMP报文的格式如下&#xff1a; ICMP协议封装在ip协议中&#xff0c;ICMP有很多报文类型&#xff0c;每一个报文类型又各自不相…

ICMP

网际控制报文协议 ICMP &#xff1a; 为了提高 IP 数据报交付成功的机会,在网际层使用了网际控制报文协议 ICMP (InternetControl Message Protocol)。 ICMP 允许主机或路由器报告差错情况和提供有关异常情况的报告。ICMP 不是高层协议,而是 IP 层的协议。ICMP 报文作为 IP 层…

ping的整个流程详解(icmp)

原文&#xff1a;ping好几年 &#xff1f;今天终于把 ping 的原理搞懂了&#xff0c;打算图解教你&#xff01;_小林coding-CSDN博客 原文的大佬一整个系列都写的非常优秀&#xff0c;转载只为了个人记录 文章目录 前言正文IP协议的助手 —— ICMP 协议查询报文类型差错报文类…

icmp 报文详解

以下内容转载自&#xff1a; http://blog.csdn.net/tigerjibo/article/details/7356936 写的很好的 icmp 报文详解&#xff1a; 一.概述&#xff1a; 1. ICMP允许主机或路由报告差错情况和提供有关异常情况。ICMP是因特网的标准协议&#xff0c;但ICMP不是高层协议&#xff…

icmp超详细讲解

最近被CISSP题目中各种攻击搞得晕晕的&#xff0c;找到一个详细的介绍ICMP的&#xff0c;写的真的很好。。。 目录 1.ICMP出现的原因 2.ICMP的用途 3.ICMP作为IP的上层协议在工作 4.ICMP实现之MTU探索 5.ICMP实现之改变路由 6.ICMP实现之源点抑制 7.ICMP实现之ping命令 …

常见的使用ICMP协议的命令

本文将介绍几种使用ICMP协议的命令&#xff0c;这些命令在网络测试和排错都有重要的作用。 1、ping命令 ping命令是检查网络是否畅通的常用命令&#xff0c;使用 ping 主机ip 后返回的数据包如图&#xff1a; 我们输入ping www.baidu.com&#xff0c;电脑会自动向DNS服务器查…

ICMP的使用

大家好呀&#xff0c;我是请假君&#xff0c;今天又来和大家一起学习数通了&#xff0c;今天要分享的知识是ICMP。 RFC792定义的ICMP ( Internet Control Message Protocol&#xff0c;互联网控制消息协议)是一个网络层协议&#xff0c;基于IP运行。ICMP定义了错误报告和其它回…

ICMP详解

ICMP简介 ICMP的全称是Internet Control Message Protocol。也就是网络控制报文协议。 ICMP是一个网络层协议。用来检测IP报文是否能够正常发送&#xff0c;以及出错原因&#xff0c;以及查询主机的信息。 也就是差错查询和信息查询。 我们经常使用的ping工具就是利用ICMP实…

JMeter官网文档

JMeter官网文档API 步骤&#xff1a; 解压下载的安装包进入\apache-jmeter-5.4.1\docs\api目录打开index.html网页显示内容如下&#xff1a;

如何使用Jmeter,看完这本指南你就知道了

序言 由于公司在来年需要进行压力测试&#xff0c;所以也就借节假日的机会来学习一下压力测试的步骤&#xff0c;由于本人的学习时间比较短&#xff0c;希望各位大神朋友们能够多多的谅解并指正在下的错误&#xff0c;在此仅表敬意 适应人群 1、初入门的压力测试工程师 2、…

01-下载安装jmeter

1、前期准备&#xff1a; 下载配置好jdk&#xff1a;下载地址,点击下载 配置教程参考&#xff1a; 2、jmeter下载地址&#xff1a; 1、下载jmeter地址&#xff0c;点击进入官网下载 2、进入官网&#xff0c;会看到两种下载资源 binaries是可执行版本&#xff0c;直接下载解…

【jmeter】

目录 环境配置安装Java环境安装jmeter安装python环境数据库配置 线程组HTTPHTTP请求默认值HTTP信息头管理器 参数化用户定义的变量csv数据文件设置用户参数函数计数器函数随机数函数时间函数 直连数据库断言响应断言大小断言&#xff1a;判断字符串内容的长度。断言持续时间 逻…

1-1 JMeter官网了解

作为测试小白的我&#xff0c;在微信知识星球&#xff0c;参加了一个为期1年的21天打卡的&#xff0c;关于测试方方面面知识的星球。 听同事说JMeter似乎很强大&#xff0c;接口测试、自动化测试、性能测试都可以搞&#xff1f; 所以选择从JMeter开始&#xff0c;因为自己最近也…

JMeter下载及安装配置教程

参考&#xff1a;入门部署教程 – Jmeter中文网 本文是在win10环境下安装使用jmeter&#xff0c;jmeter可以运行在多平台上Windows和Linux。 环境准备&#xff1a; java 8 jmeter 5.1.1 jmeter环境 jmeter环境依赖JAVA环境&#xff0c;需安装JDK1.8环境&#xff0c;JDK下载地…

Jmeter下载与安装

Jmeter与JDK下载与安装 1、进入jmeter官网,下载地址:https://jmeter.apache.org/ 第一步,点击Download Releases 第二步, 点击apache-jmeter-5.1.1.zip sha512 pgp,下载完后解压 2、下载并安装JDK,下载地址:https://www.oracle.com/technetwork/java/javase/downloads…

jmeter(一)基础介绍

参考书籍&#xff1a;段念《软件性能测试与案例剖析》——第二版 推荐一本书《零成本实现web性能测试——基于Apache—jmeter》&#xff0c;主要内容是一些关于jmeter的实战使用&#xff0c;想学习的可以去看看。。。 jmeter是一款优秀的开源性能测试工具&#xff0c;目前最新版…