94-ICMP 协议(回显请求与应答)

当 ICMP 首部 type = 8, code = 0,该 ICMP 是回显请求报文。当 type = 0, code = 0 时,是回显应答报文。

1. 回显请求与应答报文

1.1 首部格式


这里写图片描述
图1 ICMP 回显请求与应答报文首部

当 ICMP 报文是回显请求与应答报文时,我们可以看到首部的第 4、5 两个字节是标识符字段,第 6、7 两个字节是序号字段。

1.2 结构体

该结构体定义在 unp/program/include/icmp.h 中。

// icmp 回显报文头部
struct icmp_echo {
  uint8_t icmp_type;
  uint8_t icmp_code;
  uint16_t icmp_cksum;
  uint16_t icmp_id;
  uint16_t icmp_seq;
  char icmp_data[0];
};

2. 回显请求与应答过程

应用进程可以发送一个 type = 8, code = 0 的 ICMP 回显请求报文给目标主机,目标主机收到该 ICMP 报文后,将该报文的 type 字段值改为 0(回显应答报文),原封不动的发送回去。


这里写图片描述
图2 ICMP 回显请求与应答

如图 2,主机 A 上的进程发送一个回显请求报文(type = 8),同时附带数据 "hello",发送到主机 B. 主机 B 收到该报文后,主动发送回显应答给主机 A.

3. 程序设计

3.1 本文程序路径

本文使用的程序托管在 gitos 上:http://git.oschina.net/ivan_allen/unp

如果你已经 clone 过这个代码了,请使用 git pull 更新一下。本节程序所使用的程序路径是 unp/program/icmp/icmpecho.

3.2 设计思路

之前已经练习过接收 ICMP 报文了,但是我们还没有写过如何发送 ICMP 报文,其实发送也很简单。不过要注意,要不要我们自己构造 IP 数据报?

回答:默认情况下,我们不需要自己构造,直接构造好 IP 数据报的内容发出去就行了。如果你想自己构造,可以使用 setsockotp 函数指定选项 IP_HDRINCL,像下面这样:

int onoff = 1;
setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &onoff, sizeof(onoff));

在这里,我们并不想自己构造 IP 数据报,因此也不用开启 IP_HDRINCL 选项。所以我们只需要构造一个 ICMP 回显请求报文就行了。

char sendbuf[4096];
struct icmp_echo *icmp_echo = (struct icmp_echo*)sendbuf;
// 开始填充 icmp_echo
icmp_echo->icmp_type = 8; // 类型为 8,表示回显请求
icmp_echo->icmp_code = 0;
icmp_echo->icmp_cksum = 0; // 注意,这个字段一定要正确填写
icmp_echo->icmp_id = getpid() & 0xffff; // 这个字段随便你填,我就填一个进程的 id 号。
icmp_echo->icmp_seq = 0; // 这个字段也是随便你填什么的。
strcpy(icmp_echo->data, "hello"); 

// 计算整个 icmp 报文的长度(首部长度 + 数据部分长度)
icmplen = sizeof(struct icmp_echo) + strlen("hello");

// 所有字段填写完成后,就开始计算校验和
icmp_echo->icmp_cksum = cksum((unsigned short*)sendbuf, icmplen);

如果校验和填不对,这个 IP 数据报会直接被你的主机一声不吭的丢弃。校验和的算法叫 one’s complement sum,中译名为二进制反码求和,如果你感兴趣可以自行搜索它的算法。这里直接给出代码:

unsigned short cksum(unsigned short *addr, int len){
  unsigned int sum = 0;  
  while(len > 1){ 
    sum += *addr++;
    len -= 2;
  }

  // 处理剩下的一个字节
  if(len == 1){ 
    sum += *(unsigned char*)addr;
  }

  // 将32位的高16位与低16位相加
  sum = (sum >> 16) + (sum & 0xffff);
  sum += (sum >> 16);

  return (unsigned short) ~sum;
}

3.3 程序框架(伪代码)

void handler(int sig) {
  // 每隔一秒发送一个回显请求报文给目标主机
  sender();
  alarm(1);
}


int main() {
  registSignal(SIGALRM, handler);
  alarm(1);

  recver();
}

void sender() {
  // 构造 ICMP 回显请求报文发送给目标主机
  // ...
}

void recver() {
  // 接收 IP 数据报,并解析出 ICMP 报文
  // 过滤出 ICMP 回显应答报文(type = 0, code = 0)
  // 打印 ICMP 报文中的数据部分
}

当然你也可以使用线程的方式发送 ICMP 报文……无所谓啦。

4. 实验

程序 icmp/icmpecho 每隔一秒发送一个 ICMP 请求报文给目标主机 baidu.com,同时接收 baidu.com 发送回来的回显应答报文,然后将接收到的回显数据打印出来。


这里写图片描述
图1 发送回显请求与接收回显应答

从上面的结果可以看到,我们的程序给主机 baidu.com 发送了一个回显请求,然后又接收到了 baidu.com 的回显应答。

5. 总结

很开心,我们离 ping 命令的实现非常接近了,你完全可以将本程序稍作修改,它就是一个 ping 命令。

  • 掌握 ICMP 回显报文的构造
  • 掌握发送 ICMP 报文的方法
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
网络安全实验---NMAP扫描全文共8页,当前为第1页。网络安全实验---NMAP扫描全文共8页,当前为第1页。实验目的和要求 网络安全实验---NMAP扫描全文共8页,当前为第1页。 网络安全实验---NMAP扫描全文共8页,当前为第1页。 了解信息搜集的一般步骤 学会熟练使用ping命令 学会利用Nmap等工具进行信息搜集 实验内容和原理 1.信息搜集的步骤 攻击者搜集目标信息一般采用七个基本的步骤: (1) 找到初始信息,比如一个IP地址或者一个域名; (2) 找到网络地址范围,或者子网掩码; (3) 找到活动机器; (4) 找到开放端口和入口点; (5) 弄清操作系统; (6) 弄清每个端口运行的是哪种服务; (7) 画出网络结构图。 2.ping命令探测技巧 使用ping可以测试目标主机名称和IP地址,验证与远程主机的连通性,通过将ICMP回显请求数据包发送到目标主机,并监听来自目标主机的回显应答数据包来验证与一台或多台远程主机的连通性,该命令只有在安装了TCP/IP协议后才可以使用。 ping命令格式:ping [选项] 目标主机。常用选项见表19-1-1。 表19-1-1 ping命令常用选项 选项功能 Windows Linux 对目标主机进行连续的ping操作 -t 无参数 将地址解析为计算机名(适用Windows系统) -a -- 指定发送ICMP回显请求数据包个数 -n -c 指定回显请求数据负载(ICMP负载)大小 -l -s 指定发送数据包的TTL生存时间 -i -t 指定超时时间(毫秒) -w -- 指定发送时间间隔 -- -i 网络安全实验---NMAP扫描全文共8页,当前为第2页。网络安全实验---NMAP扫描全文共8页,当前为第2页。洪泛ping 网络安全实验---NMAP扫描全文共8页,当前为第2页。 网络安全实验---NMAP扫描全文共8页,当前为第2页。 -- -f 指定回显数据包记录路由的最大量 -r -- 记录路由 -- -R 指定回显数据包按列表路由 -j/-k -- 生存时间(TTL):指定数据报被路由器丢弃之前允许通过的网段数量。TTL是由发送主机设置的,以防止数据包在网络中循环路由。转发IP数据包时,要求路由器至少将TTL减小1。 TTL字段值可以帮助我们猜测操作系统类型,如表19-1-2所示。 表19-1-2 各操作系统ICMP回显应答TTL对照 操作系统 Unix及类Unix Windows NT/2K/03 Windows 95/98/ME Linux Kernel 2.6.x TTL字段值 255 128 32 64 3.Nmap介绍 nmap是一个网络探测和安全扫描程序,系统管理者和个人可以使用这个软件扫描大型的网络,获取哪台主机正在运行以及提供什么服务等信息。nmap支持很多扫描技术,例如:UDP、TCP connect()、TCP SYN(半开扫描)、ftp代理(bounce攻击)、反向标志、ICMP、FIN、ACK扫描、圣诞树(Xmas Tree)、SYN扫描和null扫描。nmap还提供了一些高级的特征,例如:通过TCP/IP协议栈特征探测操作系统类型,秘密扫描,动态延时和重传计算,并行扫描,通过并行ping扫描探测关闭的主机,诱饵扫描,避开端口过滤检测,直接RPC扫描(无须端口映射),碎片扫描,以及灵活的目标和端口设定。 nmap运行通常会得到被扫描主机端口的列表。nmap总会给出well known端口的服务名(如果可能)、端口号、状态和协议等信息。每个端口的状态有:open、filtered、unfiltered。open状态意味着目标主机能够在这个端口使用accept()系统调用接受连接。filtered状态表示:防火墙、包过滤和其它的网络安全软件掩盖了这个端口,禁止nmap探测其是否打开。unfiltered表示:这个端口关闭,并且没有防火墙/包过滤软件来隔离nmap的探测企图。通常情况下,端口的状态基本都是unfiltered状态,只有在大多数被扫描的端口处于filtered状态下,才会显示处于unfiltered状态的端口。 根据使用的功能选项,nmap也可以报告远程主机的下列特征:使用的操作系统、TCP网络安全实验---NMAP扫描全文共8页,当前为第3页。网络安全实验---NMAP扫描全文共8页,当前为第3页。序列、运行绑定到每个端口上的应用程序的用户名、DNS名、主机地址是否是欺骗地址、以及其它一些东西。 网络安全实验---NMAP扫描全文共8页,当前为第3页。 网络安全实验---NMAP扫描全文共8页,当前为第3页。 4.Nmap常用命令选项 执行命令:nmap[扫描类型][扫描选项]。常用命令选项见表19-1-3。 表19-1-3

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值