Linux ping简单实现

需要在局域网内探测目标主机是否存在,基于icmp协议实现。

1.icmp协议概述

我们平时用ping命令来查看网络上的另一个主机是否可达。工作原理:向目标主机发送icmp报文,目标主机得到后会把报文的数据加上icmp帧头传回给源主机。

当然,icmp协议的典型应用除了ping还有traceroute(侦测主机到目的主机之间所经路由情况),这里就不详细说了。

ICMP(Internet Control Message,网际控制报文协议)是为网关和目标主机而提供的一种差错控制机制,使它们在遇到差错时能把错误报告给报文源发方。ICMP协议是IP层的一个协议,但是由于差错报告在发送给报文源发方时可能也要经过若干子网,因此牵涉到路由选择等问题,所以ICMP报文需通过IP协议来发送。ICMP数据报的数据发送前需要两级封装:首先添加ICMP报头形成ICMP报文,再添加IP报头形成IP数据报。

复习一下ip首部


对应与struct ip的数据结构(在<netinet/ip.h>中定义):

struct ip
  {
#if __BYTE_ORDER == __LITTLE_ENDIAN
    unsigned int ip_hl:4;		/* header length */
    unsigned int ip_v:4;		/* version */
#endif
#if __BYTE_ORDER == __BIG_ENDIAN
    unsigned int ip_v:4;		/* version */
    unsigned int ip_hl:4;		/* header length */
#endif
    u_int8_t ip_tos;			/* type of service */
    u_short ip_len;			/* total length */
    u_short ip_id;			/* identification */
    u_short ip_off;			/* fragment offset field */
#define	IP_RF 0x8000			/* reserved fragment flag */
#define	IP_DF 0x4000			/* dont fragment flag */
#define	IP_MF 0x2000			/* more fragments flag */
#define	IP_OFFMASK 0x1fff		/* mask for fragmenting bits */
    u_int8_t ip_ttl;			/* time to live */
    u_int8_t ip_p;			/* protocol */
    u_short ip_sum;			/* checksum */
    struct in_addr ip_src, ip_dst;	/* source and dest address */
  };

其中的 unsigned int ihl:4;这个涉及到位域的概念,详情见另一篇总结http://hi.baidu.com/tuantuanlin/item/8629af3970c07afd2484f490

然后是ICMP帧格式,


ICMP帧类型代码和对应的含义如下:

类型 代码 名称
0 0 回应应答
3   目的地不可达
  0 网路不可达
  1 主机不可达
  2 协议不可达
  3 端口不可达
  4 需要分片和不需要分片标记置位
  5 源路由失败
  6 目的网络未知
 
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值