1、ICMP协议:ICMP协议提供了错误报告和消息查询两种功能,对IP协议进行补充。
2、查询消息:每个查询消息类型均包括一对请求和应答消息。
类型值 消息
8或0 回应(echo)请求和应答
... ....
3、ICMP 查询请求和应答消息格式:
8bit | 8bit | 16bit
---------------------------------------------------------------------------------
type : 8/0 | code :0 | checksum
----------------------------------------------------------------------------------
id | sequece
-----------------------------------------------------------------------------------
任何数据(data)发送方发送的数据,应答消息将复制此数据
-----------------------------------------------------------------------------------
4、C语言结构体定义的ICMP消息的头部:
struct icmphdr{
u8 type; //消息类型<<<8请求/0应答
u8 code; //消息代码,不使用 0
u16 checksum;//校验和
union{
struct {
u16 id;
u16 sequence;
} echo;
u32 gateway;
struct{
u16 unused;
u16 mtu;
} frag;
}un;
u8 data[0];
} ;//用union定义的后32 bit 根据不同ICMP消息类型有所不同
//ICMP查询消息的头4 个字节都是标准的
5、ping:创建ICMP查询请求消息>>>发送ICMP查询请求消息>>>接收ICMP查询请求应答>>>解析ICMP消息
6、sockfd = socket(PF_INET, SOCK_RAW, IPPROTO_ICMP)
//SOCK_RAW(IP协议的数据报接口):套接字提供了一个直接访问网络层(IP)的数据报接口。使用这个接口时,应用程序负责自己构造自己的协议首部,这是因为传输协议(TCP/UDP协议)被绕过去了。需要root权限。
//IPPROTO_ICMP:指定特定的协议,即ICMP。