ICMP学习笔记
最近一直在看网络编程方面的书,对ping命令有了一些认识,在此写下来,已帮助自己记忆,同时也和大家一起分享学习。
用一个ping实例来讲解ICMP协议。Ping命令是测试到另一端的线路是否能连通。
首先了解一下Ping命令的过程:
1.Ping命令加上一个主机地址或者域名
2.等待对方主机应答。
3.统计发送接收次数,是否有丢包。
这样一个ping过程就完成了。但是它是如果实现的呢。首先我们需要了解ICMP协议,因为ping其实就是遵循ICMP协议的。
Internet Control Message Protocol(ICMP)译为:互联网控制报文协议。ICMP不能单独传输,它需要封装在IP数据报里。如下图所示
发送ICMP数据报需要填充ICMP头部信息,头部+发送的数据部分组成一个ICMP报文。填充头部的意义是设置你想要的结果。ICMP头部占8个字节。类型一个字节,代码一个字节,校验和两个字节,标识符两个字节,序列号两个字节。类型和代码的组合可以表达不同的意义。这里我们会用到类型8代码0表示的是ECHO请求。当对方主机返回是类型为0,代码0表示ECHO应答。IP首部占20个字节下面给出ICMP头部和IP头部的定义。
IP头部定义:
typedef struct IPHeader {
UCHAR iph_verlen; // Version and length 版本和首部长度
UCHAR iph_tos; // Type of service 服务类型
USHORT iph_length; // Total datagram length 总长度
USHORT iph_id; // Identification 标识符
USHORT iph_offset; // Flags, fragment offset 片偏移
UCHAR iph_ttl; // Time to live 生存时间
UCHAR iph_protocol; // Protocol 协议
USHORT iph_xsum; // Header checksum 首部校验和
UL