一、ICMP是传输层的协议,和TCP、UDP等传输层协议同级
二、ICMP请求在ICMP type和code字段里有一个常量标识,同时对应PRC_也有一个对应常量,用来识别差错类型。
三、同时,对于ICMP字段,会有一个icmp_input函数进行对相应的ICMP报文进行处理。而且在插口层,对于UDP和TCP,也会有不同的函数来进行处理,udp_notify函数和tcp_notify函数、tcp_quench函数
四、对于每一种ICMP报文,都会被存放在一个叫做icmp结构中,里面定义了通用的icmp的一些信息,同时用union结构来定义不同ICMP报文专有的信息,(结构中有type,code,chsum,依赖于type和code的两个union结构)
五、ipintr函数调用指向icmp_input函数的函数指针,从而是icmp_input函数来对ICMP报文进行处理。icmp_input函数处理过程中,会根据情况将ICMP差错提交给传输协议,将ICMP差错应答和未知报文提交给rip_input函数,再由rip_input函数提交各相应的应用程序。而对于ICMP应答,是在icmp_input函数内部处理的。
六、icmp_input函数的处理流程:
- 1.首先分配三个静态结构,然后验证收到的ICMP报文是否合法
- 2.在函数中的switch语句中,会对不同的ICMP字段进行处理,如差错字段、请求字段、重定向字段及回答字段。对于差错字段,程序会将其映射在一个协议无关的代码集上,以PRC_开头的那些,然后如果识别出了type和code,icmp_input函数就跳转到deliver段,提交给传输层,然后调用pr_ctliput函数来进行进一步的处理。在处理请求字段中,在本函数中设置好回复type后转到reflect字段调用icmp_reflect函数请求,如果不能识别type,就交给raw字段中的rip_input函数进行处理。回答字段是不在icmp_input函数中进行处理的。
七、ICMP的输出处理:
第258页的图11-29将的很清楚