SylixOS 协议栈学习(三)ICMP 处理

SylixOS 协议栈学习(三)ICMP 处理

     ICMP(Internet control message protocol)是网络控制报文协议,用于在IP主机跟路由器之间传输控制信息的。
控制信息指网络不通、主机是否可达、路由是否有用等。
 之前在将ip4_input时,涉及到三次ICMP的东西:
        1、在转发过程中,如果TTL变为0,则要用icmp_time_exceeded函数向源主机发送一份超时ICMP信息。
        2、会通过ip报头,判断是否是ICMP报文,如果是,则调用icmp_input函数。
        3、若没有一个协议接受ip报文,则调用icmp_dest_unreach函数向源主机返回一个协议不可达。
由此可见,ICMP是网络控制报文协议的含义。
ICMP的报文格式:


    
 一开始两个一字节的类型和代码字段可以唯一确定ICMP包的种类,如:回显、超时、时间戳等等。尽管各种类型的报文结构不同,但这两个字节肯定是一样的。后面是两个字节的校验和,会覆盖整个报文。
      ICMP从大的方面可以分为2类:ICMP查询报文和ICMP差错报文。
      ICMP查询报文:ICMP回显请求、回显应答、时间戳请求、地址掩码等。(LWIP只实现了回显应答)
      ICMP差错报文:目的不可达、超时、重定向等。(LWIP只实现了不可达、超时)
      ICMP协议规定,如果是差错报文,那么必须包含IP包首部和IP包数据部分的前8个字节,如上图所示。
      ICMP报文类型:上面的图片为ICMP目的不可达差错报文,即类型号为3,代码号为(0-15)的ICMP报文格式。
      8位类型:区分不同类型的ICMP报文。
      8位代码:同样区分不同类型的ICMP报文。 8位类型和8位代码字段一起决定了ICMP报文的类型。
      16位校验和:包括数据在内的整个ICMP数据包的检验和;其计算方法和IP头部检验和的计算方法一样的。

类型
代码
描述
询问报文
差错报文​​​​
0
0
Echo Reply——回显应答(Ping应答)
x
 
3
0
Network Unreachable——网络不可达
 
x
3
1
Host Unreachable——主机不可达
 
x
3
2
Protocol Unreachable——协议不可达
 
x
3
3
Port Unreachable——端口不可达
 
x
3
4
Fragmentation needed but no frag. bit set——需要进行分片但设置不分片比特
 
x
3
5
Source routing failed——源站选路失败
 
x
3
6
Destination network unknown——目的网络未知
 
x
3
7
Destination host unknown——目的主机未知
 
x
3
8
Source host isolated (obsolete)——源主机被隔离(作废不用)
 
x
3
9
Destination network administratively prohibited——目的网络被强制禁止
 
x
3
10
Destination host administratively prohibited——目的主机被强制禁止
 
x
3
11
Network unreachable for TOS——由于服务类型TOS,网络不可达
 
x
3
12
Host unreachable for TOS——由于服务类型TOS,主机不可达
 
x
3
13
Communication administratively prohibited by filtering——由于过滤,通信被强制禁止
 
x
3
14
Host precedence violation——主机越权
 
x
3
15
Precedence cutoff in effect——优先中止生效
 
x
4
0
Source quench——源端被关闭(基本流控制)
 
 
5
0
Redirect for network——对网络重定向
 
 
5
1
Redirect for host——对主机重定向
 
 
5
2
Redirect for TOS and network——对服务类型和网络重定向
 
 
5
3
Redirect for TOS and host——对服务类型和主机重定向
 
 
8
0
Echo request——回显请求(Ping请求)
x
 
9
0
Router advertisement——路由器通告
 
 
10
0
Route solicitation——路由器请求
 
 
11
0
TTL equals 0 during transit——传输期间生存时间为0
 
x
11
1
TTL equals 0 during reassembly——在数据报组装期间生存时间为0
 
x
12
0
IP header bad (catchall error)——坏的IP首部(包括各种差错)
 
x
12
1
Required options missing——缺少必需的选项
 
x
13
0
Timestamp request (obsolete)——时间戳请求(作废不用)
x
 
14
 
Timestamp reply (obsolete)——时间戳应答(作废不用)
x
 
15
0
Information request (obsolete)——信息请求(作废不用)
x
 
16
0
Information reply (obsolete)——信息应答(作废不用)
x
 
17
0
Address mask request——地址掩码请求
x
 
18
0
Address mask reply——地址掩码应答
x

    • Related Articles

    • SylixOS 协议栈学习(二)以太网网卡接口部分初始化

              在《SylixOS_协议栈学习(一)网络接口结构》中,介绍了netif 结构体和netdev结构体。        下面举个例子来看一个以太网网卡接口结构是怎样被初始化,还有数据包是如何接收和发送的。     static struct netdev_funcs net_drv = {                         ①        .init      = __enetCoreInit,        .transmit  = __enetCoreTx,   ...
    • SylixOS 协议栈学习(四)ping 工作流程

      Ping工作流程: 1、涉及协议介绍       运行ping程序时,会用到以下协议:       ICMP(因特网控制报文协议):用于IP主机、路由器直接传递控制消息(一般是差错信息,如TCP/UDP传输失败,会构建ICMP报文返回)。       IP协议:一种不可靠、无连接的传输协议(目的是为了更好的提供传输服务)。(对于TCP传输,已十分可靠,不需要在IP层再链接;UDP本身就是不可靠、无连接的协议,使用IP协议能更快传输)。     ...
    • SylixOS使用的网络协议栈是?

      Q:SylixOS使用的网络协议栈是? SylixOS使用的网络协议栈是 lwip 版本为 v2.1.0。 /** X.x.x: Major version of the stack */ #define LWIP_VERSION_MAJOR 2 /** x.X.x: Minor version of the stack */ #define LWIP_VERSION_MINOR 1 /** x.x.X: Revision of the stack */ #define ...
    • SylixOS 协议栈学习(一)网络接口结构

             1) netif 的结构体来描述一个硬件网络接口的。     struct netif {                                                         struct netif *next;    // 指向下一个 netif 结构的指针         struct ip_addr ip_addr;    // IP 地址相关配置         struct ip_addr netmask;         struct ...
    • 【网络攻击】阿基里斯测试仪测试导致协议栈崩溃解决办法

      问:【网络攻击】阿基里斯测试仪测试导致协议栈崩溃解决办法 测试方法: 发送 ip fragment 报文,10M 流量,测试报文一直没有最后一片的标志,就是相当于无限分片。 这些报文先把协议栈 pbuf 全部占满了,一直没有释放,在等最后一片或者超时。 所以在测试过程中,协议栈资源一直是满的,无法提供服务。 分析: ( 由源码可知,协议栈针对这个的超时时间应该是 15s ),如果支持无限分片,资源迟早会消耗光 答:修改IP分片