icmp报文格式 各种.doc_第1页
icmp报文格式 各种.doc_第2页
icmp报文格式 各种.doc_第3页
icmp报文格式 各种.doc_第4页
icmp报文格式 各种.doc_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

ICMP分析文档说明:由于排版的问题,请在“视图”中选择“Web版式”进行阅读。目录1ICMP报文的分类和格式21.1ICMP报文格式概要介绍21.2各种类型的ICMP报文的格式21.2.1ICMP请求和回答报文格式31.2.2ICMP差错报文格式41.2.2.1ICMP重定向报文格式41.2.2.2目的不可达差错报文格式41.2.2.3ICMP源站抑制差错报文、超时差错报文和参数问题差错报文52ICMP函数关系图63ICMP流程图124ICMP状态机245ICMP接口575.1数据接口595.1.1ICMP模块和下层的接口605.1.1.1IP层ICMP模块615.1.1.2ICMP模块 IP层725.1.2ICMP模块和上层的接口935.1.2.1ICMP模块上层945.1.2.1.1pr_ctlinput函数955.1.2.1.2rtredirect函数1155.1.2.1.3pfctlinput函数1385.1.2.1.4rip_input函数1645.1.2.2上层 ICMP模块1755.1.2.2.1icmp_error函数1765.1.2.2.2rip_output函数1985.2控制接口2155.2.1概况2165.2.2rip_ctloutput函数2275.2.3rip_usrreq函数2505.2.4icmp_sysctl函数2555.3OS接口2745.3.1microtime函数2755.3.2m_freem函数2885.3.3m_gethdr函数2995.3.4m_get函数3076ICMP指标3206.1ICMP主机需求指标(RFC1122)3216.1.1概要分析(GENERAL ISSUES)3246.1.2细节问题(SPECIFIC ISSUES)3356.1.2.1目的不可达3366.1.2.2重定向3426.1.2.3源抑制3476.1.2.4超时3516.1.2.5参数问题3536.1.2.6回显3576.1.2.7信息3676.1.2.8时间戳3696.1.2.9地址掩码3806.2ICMP路由器需求指标(RFC1812)4056.2.1简要介绍(INTRODUCTION)4096.2.2概要分析(GENERAL ISSUES)4116.2.3细节问题(SPECIFIC ISSUES)4316.2.3.1目的不可达4326.2.3.2重定向4376.2.3.3源抑制4396.2.3.4超时4436.2.3.5参数问题4486.2.3.6回显4516.2.3.7信息4626.2.3.8时间戳4646.2.3.9地址掩码4756.2.3.10路由器请求4811 ICMP报文的分类和格式1.1 ICMP报文格式概要介绍ICMP报文是在IP数据报内部被传输的,如下图。IP首部(有可能有选项)ICMP报文这样的一个IP数据报,我们也称它为ICMP数据报。注意,ICMP数据报和ICMP报文是两个不同的概念,ICMP数据报的数据部分为ICMP报文。ICMP报文的格式如下图所示。所有ICMP报文的前4个字节都是一样的,但是剩下的其他字节则互不相同。0 7 8 15 16 318比特类型8比特代码16比特校验和(不同的类型和代码有不同的内容)1.2 各种类型的ICMP报文的格式ICMP报文类型可以分为三大类:ICMP请求报文、ICMP回答报文和ICMP差错报文。接下来分别介绍它们的格式。1.2.1 ICMP请求和回答报文格式ICMP请求报文有以下五种类型。类型代码描述80回显请求100路由器请求130时间戳请求150信息请求(废弃不用)170地址掩码请求ICMP回答报文有以下五种类型。类型代码描述00回显回答90路由器回答140时间戳回答160信息回答(废弃不用)180地址掩码回答回显请求和回答报文格式如下。0 7 8 15 16 31类型(0或8)代码(0)校验和标识符序列号回显数据路由器请求报文格式如下,长度为8字节。0 7 8 15 16 31类型(10)代码(0)校验和 未用(必须为0)路由器回答报文格式如下。0 7 8 15 16 31类型(9)代码(0)校验和地址数地址项长度(2)生存时间路由器地址【1】 优先级【1】路由器地址【2】 优先级【2】 * * * 时间戳请求和回答报文格式如下,长度为20字节。0 7 8 15 16 31类型(13或14)代码(0)校验和标识符序列号发起时间戳 接收时间戳 传送时间戳地址掩码请求和回答报文格式如下,长度为12字节。0 7 8 15 16 31类型(17或18)代码(0)校验和标识符序列号32比特的子网掩码1.2.2 ICMP差错报文格式ICMP差错报文分为四类:ICMP重定向报文、目的不可达差错报文、ICMP源站抑制差错报文、超时差错报文和参数问题差错报文。1.2.2.1 ICMP重定向报文格式ICMP重定向报文类型为5,代码从0到3总共有4种,如下表。类型代码描述50对网络重定向1对主机重定向2对服务类型和网络重定向3对服务类型和主机重定向ICMP重定向报文格式如下。0 7 8 15 16 31类型(5)代码(0到3)校验和应该使用的路由器IP地址原IP数据报的IP首部(包括选项)原IP数据报的数据部分的前8个字节1.2.2.2 目的不可达差错报文格式目的不可达差错报文类型为3,代码从0到15总共有16种,如下表。类型代码描述30网络不可达1主机不可达2协议不可达3端口不可达4需要进行分片但是设置了不分片比特5源站选路失败6目的网络不认识7目的主机不认识8源主机被隔离(作废不用)9和目的网络的通讯被强制制止10和目的主机的通讯被强制制止11由于服务类型TOS,网络不可达12由于服务类型TOS,主机不可达13由于过滤,通信被强制制止14主机越权15优先权终止生效目的不可达差错报文的格式如下(代码号为4的除外)。0 7 8 15 16 31类型(3)代码(0到3,5到15)校验和未用(必须为0)原IP数据报的IP首部(包括选项)原IP数据报的数据部分的前8个字节代码号为4的目的不可达差错报文的格式如下。0 7 8 15 16 31类型(3)代码(4)校验和未用(必须为0)下一站网络的MTU原IP数据报的IP首部(包括选项)原IP数据报的数据部分的前8个字节1.2.2.3 ICMP源站抑制差错报文、超时差错报文和参数问题差错报文类型代码描述4(源站抑制差错报文)0源站抑制11(超时差错报文)0传输期间生存时间为01数据报组装期间生存时间为012(参数问题差错报文)0坏的IP首部(包括各种差错)1缺少必须的选项源站抑制差错报文和超时差错报文的格式如下。0 7 8 15 16 31类型代码校验和未用(必须为0)原IP数据报的IP首部(包括选项)原IP数据报的数据部分的前8个字节参数问题差错报文格式如下。0 7 8 15 16 31类型(12)代码(0或1)校验和指针未用(必须为0)原IP数据报的IP首部(包括选项)原IP数据报的数据部分的前8个字节2 ICMP函数关系图下图中,蓝色字体的部分为ICMP模块中的函数。从中可以清晰的看出ICMP模块和上下层函数的接口。应用程序rtredirect()函数: 根据“ICMP数据报的源地址、ICMP报文中的推荐下一跳地址、无效数据报的目的地地址”来更新路由表。pfctlinput()函数: 根据“无效数据报的目的地地址”来通告重定向的所有协议域,使协议有机会把缓存的到目的站的路由作废。IP和传输层协议(注:IP层在ICMP层之下)rip_input()函数: 内核把它接收的这些报文传给等待ICMP报文的进程。相应协议的pr_ctlinput()函数:协议用此函数来处理来自下层的控制信息有ICMP差错除重定向之外的ICMP差错报文ICMP重定向报文icmp_error()函数:构造ICMP差错报文ICMP回答报文、路由器请求报文、未识别的ICMP报文ICMP请求报文(路由器请求报文除外)rip_output():ICMP用该函数输出请求报文和路由器回答报文icmp_reflect()函数:把ICMP回答报文、ICMP差错报文发回给请求或无效数据报的源站。icmp_input():ICMP输入处理分用ICMP报文icmp_send()函数:计算ICMP报文的校验和ipintr():IP输入处理ip_output():IP输出处理3 ICMP流程图进程或传输程协议应用程序IP和传输层协议有ICMP差错 原IP数据报片偏移是否为0否丢弃报文否发出ICMP请求报文或路由器回答报文是是是否为广播或多播丢弃报文是否为除路由器请求报文之外的请求报文否构造ICMP请求报文或路由器回答报文是构造ICMP回答报文和ICMP差错报文合 法是否有选项否ICMP报文合法非法丢弃报文是保留某些选项是否为单播或者环回否丢弃报文是分用ICMP报文IP层注释1:“保留某些选项”指的是记录路由选项、时间戳选项和安全选项,另外,如果有源路由选项,则要保存其逆转之后的结果。注释2:ICMP差错、回答数据报发送到IP层之前有个判断条件“是否为单播或者环回”。实际上,这个判断条件的一部分是在IP层完成的。但是为了说明的方便和强调“ICMP差错、回答数据报的目的地址只能为单播或者环回”,把它列在ICMP层。4 ICMP状态机结束状态起始状态初始状态原IP数据报ICMP请求报文ICMP回答报文ICMP差错报文进程或者传输层协议初始状态事件:IP层收到ICMP请求报文。动作:分用。事件:IP层收到ICMP回答报文。动作:分用。事件:IP层收到ICMP差错报文。动作:分用。原IP数据报事件1:原IP数据报的片偏移不为0。动作1:释放mbuf。事件2:原IP数据报为广播或者多播。动作2:释放mbuf。事件:原IP数据报有ICMP差错。动作:发送ICMP差错报文。ICMP请求报文事件:ICMP模块检查从IP层分用上来的ICMP请求报文,发现其不合法。动作:释放mbuf。事件:在IP和传输层协议检测到 “出错或者需要重定向”的ICMP请求数据报。动作:把该数据报传给ICMP模块。事件:ICMP模块收到IP层分用上来的不是路由器请求报文的ICMP请求报文。动作:构造相应的ICMP回答报文。事件:ICMP模块收到IP层分用上来的路由器请求报文。动作:上传给路由进程。ICMP回答报文事件1:ICMP模块检查从IP层分用上来的ICMP回答报文,发现其不合法。动作1:释放mbuf。事件2:发送ICMP回答报文的时候发现其目的地址不是单播或者环回。动作2:释放mbuf。事件:在IP和传输层协议检测到 “出错或者需要重定向”的ICMP回答数据报。动作:把该数据报传给ICMP模块。事件:ICMP模块收到IP层分用上来的ICMP回答报文。动作:上传给相应的进程。ICMP差错报文事件1:ICMP模块检查从IP层分用上来的ICMP差错报文,发现其不合法。动作1:释放mbuf。事件2:IP层发送ICMP差错报文的时候发现其目的地址不是单播或者环回。动作2:释放mbuf。事件:在IP和传输层协议检测到 “出错或者需要重定向”的ICMP差错数据报。动作:把该数据报传给ICMP模块。事件:ICMP模块收到IP层分用上来的ICMP差错报文。动作:上传给相应的进程或者传输层协议。进程或者传输层协议事件:需要发出ICMP请求报文。动作:调用ICMP模块发出ICMP请求报文。事件:收到路由器请求报文。动作:调用ICMP模块发出路由器回答报文。注释1:一个ICMP差错报文不能产生另一个非重定向的ICMP差错报文。这一点在状态机和流程图中没有表现出来,这是为了使流程图和状态机简洁明了,提高可读性。下面对这个情况进行详细说明。当IP和传输层函数发现有ICMP差错的报文的时候,就调用icmp_error函数。icmp_error函数有5个参数,在这里,我们只说明其中的两个参数。参数n,指向保存原IP数据报缓存链的指针; 参数type,ICMP差错类型。参数n中保存的原IP数据报有四种类型,普通IP数据报(即:非ICMP数据报)、ICMP请求报文、ICMP回答报文、ICMP差错报文。对于参数n和参数type的几种组合情况,icmp_error函数的处理方法如下表。参数type参数n参数type不为“重定向”参数type为“重定向”原IP数据报为“普通IP数据报(即:非ICMP数据报)”发送ICMP差错报文。发送ICMP重定向报文。原IP数据报为“ICMP请求报文”原IP数据报为“ICMP回答报文”原IP数据报为“ICMP差错报文”释放保存原IP数据报的mbuf链条。上表中的蓝色字体是对原IP数据报的一种“过滤”,但是这个“过滤”过程在流程图和状态机中没有画出来。注释2:状态机中,“进程或者传输层协议”实际上在ICMP模块的上层,并不在ICMP模块中。这里之所以把“进程或者传输层协议”列为一个状态,是为了说明ICMP模块和上层的关系。注释3:ICMP模块对从IP层分用上来的路由器请求报文的处理比较特殊。ICMP模块把路由器请求报文传给路由进程,由路由进程来构造相应的回答报文。注释4:普通IP数据报(即:非ICMP数据报)如果“有ICMP差错”,也会跳到“原IP数据报”状态。实际上,“原IP数据报”大多数是“有ICMP差错”的普通IP数据报(即:非ICMP数据报)。5 ICMP接口5.1 数据接口5.1.1 ICMP模块和下层的接口5.1.1.1 IP层ICMP模块icmp_input函数的参数和返回值如下。voidicmp_input(m, hlen)register struct mbuf *m;int hlen;参数m为指向“存储ICMP数据报的mbuf链条”的指针。参数hlen为ICMP数据报的IP首部长度。5.1.1.2 ICMP模块 IP层ICMP模块通过调用ip_output函数来实现输出。ip_output函数的参数和返回值如下。intip_output(m0, opt, ro, flags, imo)struct mbuf *m0;struct mbuf *opt;struct route *ro;int flags;struct ip_moptions *imo;介绍这五个参数。m0,要发送的分组;opt,包含的IP选项;ro,缓存的到目的地的路由; flags,如下图;imo,指向多播选项的指针。5.1.2 ICMP模块和上层的接口5.1.2.1 ICMP模块上层5.1.2.1.1 pr_ctlinput函数如果收到的是除重定向之外的ICMP差错报文,则icmp_input调用相应协议的pr_ctlinput()函数。if (ctlfunc = inetswip_protoxicp-icmp_ip.ip_p.pr_ctlinput)(*ctlfunc)(code, (struct sockaddr *)&icmpsrc, &icp-icmp_ip);其中,参数code是“与协议无关的差错码”;参数(struct sockaddr *)&icmpsrc表示“无效数据报的目的地地址”,参数&icp-icmp_ip为“指向无效数据报的指针”。下面是tcp_ctlinput函数的参数和返回值。其他协议的pr_ctlinput()函数的参数和返回值是类似的。voidtcp_ctlinput(cmd, sa, ip)int cmd;struct sockaddr *sa;register struct ip *ip;5.1.2.1.2 rtredirect函数如果收到的是ICMP重定向差错报文,则icmp_input调用rtredirect()函数,如下。rtredirect(struct sockaddr *)&icmpsrc, (struct sockaddr *)&icmpdst, (struct sockaddr *)0, RTF_GATEWAY | RTF_HOST, (struct sockaddr *)&icmpgw, (struct rtentry *)0);其中,参数(struct sockaddr *)&icmpsrc表示“无效数据报的目的地地址”,参数(struct sockaddr *)&icmpdst表示“ICMP报文中的推荐下一跳地址”,参数(struct sockaddr *)&icmpgw表示“ICMP数据报的源地址”。这行程序的作用是:根据“ICMP数据报的源地址、ICMP报文中的推荐下一跳地址、无效数据报的目的地地址”来更新路由表。rtredirect()函数的参数和返回值如下。intrtredirect(dst, gateway, netmask, flags, src, rtp)struct sockaddr *dst, *gateway, *netmask, *src;int flags;struct rtentry *rtp;5.1.2.1.3 pfctlinput函数如果收到的是ICMP重定向差错报文,则icmp_input调用pfctlinput()函数,如下。pfctlinput(PRC_REDIRECT_HOST, (struct sockaddr *)&icmpsrc);上面一行程序的第一个参数表示“重定向”,第二个参数是“无效数据报的目的地地址”。这行程序的作用是:根据“无效数据报的目的地地址”来通告重定向的所有协议域,使协议有机会把缓存的到目的站的路由作废。pfctlinput()函数如下。voidpfctlinput(cmd, sa)int cmd;struct sockaddr *sa;register struct domain *dp;register struct protosw *pr;for (dp = domains; dp; dp = dp-dom_next)for (pr = dp-dom_protosw; pr dom_protoswNPROTOSW; pr+)if (pr-pr_ctlinput)(*pr-pr_ctlinput)(cmd, sa, (caddr_t)0);5.1.2.1.4 rip_input函数该函数的参数和返回值如下。voidrip_input(m)struct mbuf *m;如果收到的是“ICMP回答报文、路由器请求报文、未识别的ICMP报文”,则icmp_input调用rip_input()函数,把这些报文传给等待ICMP报文的进程。5.1.2.2 上层 ICMP模块5.1.2.2.1 icmp_error函数传输层和IP层(注:IP层是ICMP的下层)调用icmp_error()函数来构造ICMP差错报文icmp_error()函数的参数和返回值如下。voidicmp_error(n, type, code, dest, destifp)struct mbuf *n;int type, code;n_long dest;struct ifnet *destifp;其中,参数n表示“指向包含无效数据报缓存链的指针”,type表示ICMP差错类型,code表示ICMP差错代码,dest表示ICMP重定向报文中的下一跳路由器地址(只有当要发送ICMP重定向的时候才用到该参数),destifp表示指向原IP数据报外出接口的指针(只有当要发送“需要进行分片但是设置了不分片比特”的目的不可达报文的时候才用到该参数)。5.1.2.2.2 rip_output函数上层用该函数输出请求报文和路由器回答报文。rip_output函数的参数和返回值如下。intrip_output(m, so, dst)register struct mbuf *m;struct socket *so;u_long dst;其中,参数m表示“指向外出IP数据报缓存链的指针”,参数so表示“指向相应插口的指针”,参数dst表示“IP数据报的目的IP地址”(只有当进程没有提供IP首部的情况下才用到该参数)。5.2 控制接口5.2.1 概况下面是protosw结构的定义。下面是ICMP的protosw结构。5.2.2 rip_ctloutput函数该函数的参数和返回值如下。intip_ctloutput(op, so, level, optname, mp)int op;struct socket *so;int level, optname;struct mbuf *mp;其中参数op的值为PRCO_SETOPT或PRCO_GETOPT。表示上层是要设置某些选项,还是要读取某些选项。参数so为插口描述符。参数level为操作的协议,它的值必须为IPPROTO_IP。参数mp为包含设置值的mbuf指针。参数optmane为选项名,它的取值和相应的描述如下表。 参数optmane的取值 描述IP_HDRINCL设置或者读取inp_flags的INP_HDRINCL比特位。该比特位表示进程是否有提供IP首部,在rip_output函数中有用到。DVMRP_INIT这些选项关于多播。目前我们不关心多播的内容。DVMRP_DONEDVMRP_ADD_VIFDVMRP_DEL_VIFDVMRP_ADD_LGRPDVMRP_DEL_LGRPDVMRP_ADD_MRTDVMRP_DEL_MRT其他值交给ip_ctloutput函数处理5.2.3 rip_usrreq函数该函数的分析由肖志给出。5.2.4 icmp_sysctl函数该函数的参数和返回值如下。inticmp_sysctl(name, namelen, oldp, oldlenp, newp, newlen)int *name;u_int namelen;void *oldp;size_t *oldlenp;void *newp;size_t newlen;该函数是用来修改全局变量icmpmaskrepl的。icmpmaskrepl的默认值是0,icmp_sysctl可以修改它。如果icmpmaskrepl非零,Net/3会响应地址掩码请求。除非系统被明确地配置成地址掩码的授权代理(icmpmaskrepl非零),否则, RFC 1122禁止其发送掩码回答。这样,就避免系统与所有向它发出请求的系统共享不正确的地址掩码。5.3 OS接口5.3.1 microtime函数函数的参数和返回值如下。voidmicrotime(tvp)struct timeval *tvp;该函数的作用如下。返回从UTC 1 9 7 0年1月1日午夜以来的时间,放在t i m e v a l结构中。在iptime函数中,会调用microtime函数。iptime函数以网络字节序返回从UTC 1970年1月1日午夜以来的毫秒数。在时间戳选项处理等等地方会用到iptime函数。5.3.2 m_freem函数函数参数和返回值如下。voidm_freem(m)register struct mbuf *m;函数的作用如下。释放m指向的mbuf链表中的所有mbuf。5.3.3 m_gethdr函数该函数的参数和返回值如下。struct mbuf *m_gethdr(int nowait,int type)该函数是宏MGETHDR的函数版本。5.3.4 m_get函数函数参数和返回值如下。struct mbuf *m_get (int nowait, int type);该函数的作用如下。向OS申请一个type类型的mbuf。6 ICMP指标6.1 ICMP主机需求指标(RFC1122)指标位置描述4.4BSD-Lite实现备注6.1.1 概要分析(GENERAL ISSUES)如果主机收到一个类型未知的ICMP报文,主机必须安静地丢弃该报文。3.2.2MUST部分支持:icmp_input把未知的ICMP报文直接交给rip_input。rip_input把ICMP报文交给任何等待进程,或者在没有进程接收的情况下将其安静的丢弃。建议ICMP差错报文携带原IP数据报数据部分的至少前8个字节3.2.2MAY部分支持:icmp_error在ICMP差错报文中,始终返回原IP数据报数据部分的前8个字节ICMP差错报文必须原封不动的返回原IP数据报的首部和部分数据。3.2.2MUST部分支持:Net/3的ipintr将接收数据报的标识、偏移量和长度字段从网络字节序转换为主机字节序,从而方便数据报的处理。但是Net/3的icmp_error函数把偏移量和长度字段放入ICMP差错报文的时候,没有把它们转换为网络字节序。如果系统的主机字节序与网络字节序相同,这个差错不会引起误解;但如果系统的主机字节序和网络字节序不一致,ICMP差错报文中携带的原IP数据报的偏移量和长度字段就都是错误的。我们要更改net/3系统的这个差错。必须能够将收到的ICMP差错分用给传输层协议。3.2.2MUST支持:icmp_error利用原IP数据报首部的协议字段选择适当的运输层协议,以响应该差错。发送ICMP差错报文时,TOS字段应该等于0。3.2.2SHOULD支持:net/3系统构造的所有ICMP差错报文的TOS字段都等于0。必须禁止ICMP差错报文再次引发新的ICMP差错报文。3.2.2MUST NOT部分支持:ICMP差错报文可能导致icmp_error发送ICMP重定向差错报文。ICMP差错报文不会使net/3系统发送除了ICMP重定向差错报文之外的ICMP差错报文。Net/3的这种做法是合理的。有的场合,把ICMP差错报文细分为“重定向报文和狭义ICMP差错报文”。左边RFC的这句话可能是针对狭义ICMP差错报文而言的,尽管该RFC把重定向报文归类为ICMP差错报文。必须禁止IP广播和多播报文引发ICMP差错报文。3.2.2MUST NOT不支持:icmp_error函数不进行此类检查。内核在调用icmp_error函数之前,也不进行此类检查。必须禁止链路层广播报文引发ICMP差错报文。3.2.2MUST NOT支持:icmp_error丢弃作为链路层广播或者多播到达的ICMP报文。必须禁止IP数据报的后续分片引发ICMP差错报文。3.2.2MUST NOT支持:icmp_error丢弃片偏移不为0的原IP数据报。必须禁止源地址不是单播地址的数据报引发ICMP差错报文。比如说,原IP数据报的源地址为全0地址、环回地址、广播地址、多播地址、E类地址。3.2.2MUST NOT部分支持:“源地址为网络0(网络0为0.*.*.*,全0地址为它的一个特例)、D类地址、E类地址的IP数据报”引发的ICMP差错报文在icmp_reflect被丢弃。“源地址为广播地址的IP数据报”引发的ICMP差错报文在ip_output被丢弃。但是,如果原IP数据报的源地址为环回地址,不论该IP数据报是否来自本机,它都可能会引发目标地址为环回地址的ICMP差错报文。6.1.2 细节问题(SPECIFIC ISSUES)6.1.2.1 目的不可达主机应该产生 “代码为2,表示协议不可达”的目的不可达报文。当主机不支持“原IP数据报所指定的传输层协议”的时候使用。3.2.2.1SHOULD不支持:如果数据报所指明的协议系统不支持,则交给rip_input函数处理。后者检查确认系统中没有应用进程能够处理此数据报后,将数据报丢弃而不发送相应的ICMP报文。主机应该产生 “代码为3,表示端口不可达”的目的不可达报文。当指定的传输层协议(比如UDP)当前不存在该端口并且没有别的协议机制来通知发送方的时候,使用该代码。3.2.2.1SHOULD支持:UDP会产生“端口不可达”差错报文。TCP不会产生“端口不可达”差错报文,但是会向对方发送一个TCP连接复位消息。必须向上层提交ICMP“目的不可达”差错报文。3.2.2.1MUST支持:icmp_input把“目的不可达”差错报文上传给相应协议的pr_ctlinput函数。传输层应该适当地利用ICMP模块上传的“目的不可达”差错报文。3.2.2.1SHOULD支持对于判断目的地是否不可达而言,目的不可达报文必须被理解为仅仅是一个线索,而不是证据。3.2.2.1MUST相关内容见倪宏的指标报告。6.1.2.2 重定向主机应该禁止发送ICMP重定向报文。3.2.2.2SHOULD NOT部分支持:ip_forward是唯一能发送ICMP重定向报文的函数,只有在系统配置为路由器(全局变量ipforwarding被设置为1)或者有源路由选项时才会调用该函数。收到ICMP重定向报文后,主机必须更新路由表。3.2.2.2MUST支持:ipintr调用rtredirect处理此报文。必须能够处理“主机重定向”和“网络重定向”。此外,必须把“网络重定向”作为“主机重定向”来处理。3.3.1.2MUST支持:net/3系统把“网络重定向”作为“主机重定向”来处理。net/3系统只发送“主机重定向”,不发送“网络重定向”。应该丢弃非法的重定向报文3.2.2.2MUST支持:rtredirect丢弃非法的重定向报文。6.1.2.3 源抑制当主机接近或者已经达到它的处理极限的时候,建议发送一个源抑制报文。3.2.2.3MAY不支持:net/3系统中,只有ip_forward会发送源抑制报文。如果ip_output返回ENOBUFS,ip_forward发送“源站抑制”报文。如果mbuf不足,或者接口输出队列已满时,会出现这种情况。但是,作为主机,一般情况下是不调用ip_forward函数的(除非源路由转发)。我们不准备发送源站抑制报文。如果收到源抑制报文,IP层必须把它上传给传输层(或者ICMP模块)。3.2.2.3MUST支持:icmp_input向运输层提交源抑制差错报文。对于“向同一个目标地址持续发送一段数据流”并“有足够的状态信息来进行流量控制”的传输层协议和应用程序来说,应该响应源抑制报文。3.2.2.3SHOULD支持:tcp_ctlinput调用tcp_quench函数执行慢启动。6.1.2.4 超时收到的ICMP超时报文必须被送往传输层。3.2.2.4MUST支持:icmp_input向传输层提交此类差错报文。6.1.2.5 参数问题主机应该产生参数问题差错报文。3.2.2.5SHOULD支持:net/3系统中,只有当ip_dooptions发现选项长度字段出错时,会发送此类差错报文。必须向传输层报告出现的数据报参数差错。3.2.2.5MUST支持:icmp_input向传输层汇报此类差错。建议向应用进程汇报此类差错。3.2.2.5MAY支持:tcp_notify在t_softerror中记录这些ICMP差错。6.1.2.6 回显必须支持回显服务器3.2.2.6MUST支持:icmp_input实现回显服务器应该支持回显客户3.2.2.6SHOULD支持:ping程序利用原始IP插口实现回显客户。建议丢弃发往IP多播或者广播地址的回显请求报文。3.2.2.6MAY不支持:net/3系统响应发往IP多播或者广播地址的回显请求报文。ICMP回显回答数据报的源IP地址必须为ICMP回显请求数据报的specific-destination address(见注释1)。3.2.2.6MUST部分支持:如果回显请求数据报的目的IP地址为子网广播地址,则net/3系统发出的回显回答数据报的源IP地址也为同样的子网广播地址。我们要根据RFC对net/3系统做出相应的修改。必须在回显回答报文中返回回显请求数据。3.2.2.6MUST支持:icmp_reflect函数不更改回显请求报文的数据部分。如果发送大的回显回答报文时需要分片而主机目前又不支持分片功能,那么回显回答数据报必须被截短为最大传输长度并被发送。3.2.2.6MUST不适用:由于net/3系统支持分片,所以不存在这个问题。回显回答报文必须上传到ICMP用户接口,除非相应的回显请求报文源自IP层。3.2.2.6MUST支持:ICMP回显回答报文提交给rip_input,进而提交给指明的应用进程。如果ICMP回显请求数据报中包含路由记录选项(或者时间戳选项),那么,路由记录选项(或者时间戳选项)中应该包含当前主机的信息,而且,当前主机应该在回显回答数据报的IP首部中包含回显请求数据报的路由记录选项(或者时间戳选项)。因此,所记录的路径将是整个往返路径。3.2.2.6SHOULD支持:icmp_reflect在回显回答报文中包含记录路由和时间戳选项。如果“ICMP回显请求数据报”包含源路由选项,那么相应的“ICMP回显回答数据报”必须逆转“ICMP回显请求数据报”的源路由选项来作为自己的源路由选项。3.2.2.6MUST支持:icmp_reflect在回显回答报文中包含逆转之后的源路由选项。6.1.2.7 信息应该禁止ICMP信息请求和信息回答报文。3.2.2.7SHOULD NOT部分支持:内核不生成或响应信息报文。但是应用进程可能会通过原始IP插口发送或者接收信息报文。6.1.2.8 时间戳建议实现时间戳请求和时间戳回答报文。3.2.2.8MAY支持:icmp_input实现时间戳服务器的功能。时间戳客户的功能可以通过原始IP机制来实现。如果实现了时间戳请求和时间戳回答,则要遵守以下几条规定。必须应答所收到的每一个时间戳请求。3.2.2.8MUST支持。应答时间戳请求的过程应该被设计成“时延的变化最小”(比如,这个功能可以在内核实现,而不作为用户进程实现,从而避免等待时间)3.2.2.8SHOULD支持:net/3系统在内核实现。“时延的变化最小”(minimum variability in delay)的含义我不大清楚。建议安静地丢弃发往广播或多播地址的ICMP时间戳请求数据报。3.2.2.8MAY不支持:icmp_input响应发往广播或多播地址的时间戳请求。“ICMP时间戳回答数据报的源IP地址”必须为“ICMP时间戳请求数据报的specific-destination address” (见注释1)。3.2.2.8MUST部分支持:如果时间戳请求数据报的目的IP地址为子网广播地址,则net/3系统发出的时间戳回答数据报的源IP地址也为同样的子网广播地址。我们要根据RFC对net/3系统做出相应的修改。时间戳回答报文必须上传到ICMP用户接口。3.2.2.8MUST支持:ICMP时间戳回答报文提交给rip_input,进而提交给指明的应用进程。如果ICMP时间戳请求数据报中包含路由记录选项(或者时间戳选项),那么,路由记录选项(或者时间戳选项)中应该包含当前主机的信息,而且,当前主机应该在时间戳回答数据报的IP首部中包含时间戳请求数据报的路由记录选项(或者时间戳选项)。因此,所记录的路径将是整个往返路径。3.2.2.8SHOULD支持:icmp_reflect在时间戳回答报文中包含记录路由和时间戳选项。如果“ICMP时间戳请求数据报”包含源路由选项,那么相应的“ICMP时间戳回答数据报”必须逆转“ICMP时间戳请求数据报”的源路由选项来作为自己的源路由选项。3.2.2.8MUST支持:icmp_reflect在时间戳回答报文中包含逆转之后的源路由选项。必须遵守有关时间戳数值的规定3.2.2.8MUST支持:icmp_input调用iptime,后者可返回标准时间戳值。6.1.2.9 地址掩码必须能够静态配置接口的地址掩码3.2.2.9MUST支持建议系统初始化的时候动态地获得地址掩码。3.2.2.9MA

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论