需要在局域网内探测目标主机是否存在,基于icmp协议实现。
1.icmp协议概述
我们平时用ping命令来查看网络上的另一个主机是否可达。工作原理:向目标主机发送icmp报文,目标主机得到后会把报文的数据加上icmp帧头传回给源主机。
当然,icmp协议的典型应用除了ping还有traceroute(侦测主机到目的主机之间所经路由情况),这里就不详细说了。
其中的 unsigned int ihl:4;这个涉及到位域的概念,详情见另一篇总结http://hi.baidu.com/tuantuanlin/item/8629af3970c07afd2484f490。
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 | 目的网络未知 | |