目录
- 一、ICMP协议简介
- 1. ICMP协议类型与结构
- 2. ICMP 差错报文
- 3. ICMP 查询报文
- 二、ICMP协议原理
- 1. ICMP报文数据结构
- 2. ICMP的差错报文
- 3. 差错报文的原理
- 4. ICMP的查询报文
一、ICMP协议简介
ICMP协议是一个网络层协议。 一个新搭建好的网络,往往需要先进行一个简单的测试,来验证网络是否畅通;但是IP协议并不提供可靠传输。如果丢包了,IP协议并不能通知传输层是否丢包以及丢包的原因。因此我们需要ICMP协议来完成这样的功能
为什么需要ICMP协议
① IP 协议本身不提供差错报告和差错控制机制来保证数据报递交的有效性,例如:数据报在网络中被丢弃了,源主机更希望等到该数据报递交过程中的异常信息。
② IP 协议不能进行主机管理与查询机制,例如:不知道对方主机或者路由器的活跃,对
于不活跃的主机和路由器就没有必要发送数据报。
为了更有效地转发IP数据报和提高交付成功机会
1. ICMP协议类型与结构
2. ICMP 差错报文
用于检测IP数据报在传输过程的异常信息(目的不可达、源站抑制、重定向、超时、参数错误)
3. ICMP 查询报文
用于诊断两个网络设备之间彼此是否能够通信,目的主机收到 ICMP 回送请求报文后立刻回送应答报文,若源主机能收到 ICMP 回送应答报文,则说明到达该主机的网络正常(PING)
二、ICMP协议原理
1. ICMP报文数据结构
/* icmp.h */
struct icmp_echo_hdr
{
PACK_STRUCT_FLD_8(u8_t type); /* 类型 */
PACK_STRUCT_FLD_8(u8_t code); /* 代码 */
PACK_STRUCT_FIELD(u16_t chksum); /* 校验和 */
PACK_STRUCT_FIELD(u16_t id); /* 标志符 */
PACK_STRUCT_FIELD(u16_t seqno); /* 序号 */
}
PACK_STRUCT_STRUCT;
2. ICMP的差错报文
lwIP只实现目的不可达、超时差错报文,它们分别为icmp_dest_unreach和icmp_time_exceeded函数
3. 差错报文的原理
把丢弃的数据包IP首部和数据区域(前8字节)拷贝到差错报文当中
4. ICMP的查询报文
请求报文发送,应答报文重复。简单来讲,应答包是在请求包的基础上修改得来