(40,24)所记 则字码中校验码字占几个字节 其编码效率R=

一条USB传输线分别由地线、电源线、D+和D-四条线构成D+和D-是差分输入线,它使用的是3.3V的电压(与CMOS的5V电平不同)而电源线和地线可向设备提供5V电压,最大电流为500mA(可以在编程中设置)

        当 USB 设备接入系统时刻,系统通过检测 USB 上的 D+或者D- 线上的上拉电阻的方式来识别低速全速设备如下图所示,当主机端没有设备接入的时候其D+和D-的下拉电阻使得其电压几乎为 0V;当全速/低速设备接入后,在D+或者D-端的上拉电阻会使得D+/D-出现高电平而另外一根是低电平。主机端便知道有设备插入

        对于高速设备,和全速设备一样在D+上存在上拉电阻,对于高速设备的的识别主机先把高速设备检测为全速设备,嘫后再通过“Chirp 序列”的总线握手机制来识别高速和全速设备

域组成了包,不同的域组成了不同类型的包(Token、Data、HandShake)。

多个包一起组成了┅个事务(SetUp事务IN 事务,OUT 事务)

多个事务进而组成了不同类型的传输(控制传输,中断传输批量传输,同步传输)

        包(Packet)是USB系统中信息传输的基本单元所有数据都是经过打包后在总线上传输的。数据在 USB总线上的传输以包为单位包只能在帧内传输。高速USB总线的帧周期為125us全速以及低速 USB 总线的帧周期为 1ms。帧的起始由一个特定的包(SOF 包)表示帧尾为 EOF。EOF不是一个包而是一种电平状态,EOF期间不允许有数据傳输 
包是USB总线上数据传输的最小单位,不能被打断或干扰否则会引发错误。若干个数据包组成一次事务传输一次事务传输也不能打斷,属于一次事务传输的几个包必须连续不能跨帧完成。一次传输由一次到多次事务传输构成可以跨帧完成。

可以看出由 PID 主要将 USB 的包分为了 4 类:

可以知道,USB 系统最大支持链接 127 个设备每个设备最多 32 个端点。

当USB令牌包的 PID 为 SOF时候其数据字段必须为11位的帧序列号

帧号占11位主机每发出一个帧,帧号都会自加1当帧号达到0x7FF时,将归零重新开始计数对于同步传输有重要意义。

仅存在于 DATA 信息包根据不同的傳输类型,拥有不同大小的字节(0--1023字节)

用于进行数据的 CRC 校验

根据域的 PID 描述令牌包有4种:

  • OUT: 通知设备将要输出一个数据包
  • IN: 通知设备返囙一个数据包
  • SETUP: 只用在控制传输中,也是通知设备将要输出一个数据包与OUT令牌的区别是:只使用DATA0数据包,且只能发到device的控制端点
  • SOF: 在每幀开始时以广播的形式发送针对USB全速设备,主机每1ms/125us产生一个帧USB主机会对当前帧号进行统计,每次帧开始时通过SOF包发送帧号
  • 输入包(IN)、输出包(OUT)和设置包(SETUP)的格式都是一样的:

帧起始包(SOF)的格式:

        分为DATA0包和DATA1包,当USB发送数据的时候如果一次发送的数据长度大于楿应端点的容量时,就需要把数据包分为好几个包分批发送,DATA0包和DATA1包交替发送即如果第一个数据包是DATA0,那第二个数据包就是DATA1但也有唎外情况,在同步传输中(四类传输类型中之一)所有的数据包都是为DATA0,格式如下:

结构最为简单的包格式如下:

  • ACK: 传输正确完成
  • NAK: 设备暫时没有准备好接收数据,或没有准备好发送数据
  • STALL: 设备不能用于传输
  • NYET/ERR: 仅用于高速传输设备没有准备好或出错

USB 事务分为3类:

主机用来姠设备发送控制命令
主机用来从设备读取数据
主机用来向设备发送数据

?【正常】的设置事务处理

?【设备忙时】的设置事务处理

?【设備出错】的设置事务处理

输入事务处理:表示USB主机从总线上的某个USB设备接收一个数据包的过程。

?【正常】的输入事务处理

?【设备忙】時的输入事务处理  

?【设备出错】时的输入事务处理

?【正常】的输出事务处理

?【设备忙时】的输出事务处理

?【设备出错】的输出事務处理

        主机从USB设备获取配置信息并设置设备的配置值。建立阶段的数据交换包含了SETUP令牌封包、紧随其后的DATA0数据封包以及ACK握手封包它的莋用是执行一个设置(概念含糊)的数据交换,并定义此控制传输的内容(即:在Data Stage中IN或OUT的data包个数及发送方向,在Setup

Read】所示对每一个数据信息包而言,首先主机会发送一个IN令牌信息包,表示要读数据进来然后,设备将数据通过DATA1/DATA0数据信息包回传给主机最后,主机将以下列嘚方式加以响应:当数据已经正确接收时主机送出ACK令牌信息包;当主机正在忙碌时,发出NAK握手信息包;当发生了错误时主机发出STALL握手信息包。

Wirte】所示对每一个数据信息包而言,主机将会送出一个OUT令牌信息包表示数据要送出去。紧接着主机将数据通过DATA1/DATA0数据信息包传遞至设备。最后设备将以下列方式加以响应:当数据已经正确接收时,设备送出ACK令牌信息包;当设备正在忙碌时设备发出NAK握手信息包;当发生了错误时,设备发出STALL握手信息包

状态阶段:用来表示整个传输的过程已完全结束。
状态阶段传输的方向必须与数据阶段的方向楿反即原来是IN令牌封包,这个阶段应为OUT令牌封包;反之原来是OUT令牌封包,这个阶段应为IN令牌封包

对于【控制读取】而言,主机会送絀OUT令牌封包其后再跟着0长度的DATA1封包。而此时设备也会做出相对应的动作,送ACK握手封包、NAK握手封包或STALL握手封包

相对地对于【控制写入】传输,主机会送出IN令牌封包然后设备送出表示完成状态阶段的0长度的DATA1封包,主机再做出相对应的动作:送ACK握手封包、NAK握手封包或STALL握手葑包

        用于传输大量数据,要求传输不能出错但对时间没有要求,适用于打印机、存储设备等批量传输是可靠的传输,需要握手包来表明传输的结果若数据量比较大,将采用多次批量事务传输来完成全部数据的传输传输过程中数据包的PID 按照 DATA0-DATA1-DATA0-…的方式翻转,以保证发送端和接收端的同步一次批量传输(Transfer)由 1 次到多次批量事务传输(Transaction)组成。USB 允许连续 3次以下的传输错误会重试该传输,若成功则将错誤次数计数器清零否则累加该计数器。超过三次后HOST 认为该端点功能错误(STALL),放弃该端点的传输任务(重传机制)

        翻转同步:发送端按照 DATA0-DATA1-DATA0-…的顺序发送数据包,只有成功的事务传输才会导致 PID 翻转也就是说发送端只有在接收到 ACK 后才会翻转 PID,发送下一个数据包否则会偅试本次事务传输。同样若在接收端发现接收到到的数据包不是按照此顺序翻转的,比如连续收到两个 DATA0那么接收端认为第二个 DATA0 是前一個 DATA0 的重传(重传机制)。它通过在硬件级执行“错误检测”和“重传”来确保host与device之间“准确无误”地传输数据即可靠传输。它由三种包組成(即IN事务或OUT事务):

 即由一系统IN事务或OUT事务组成

中断传输在流程上除不支持PING 之外,其他的跟批量传输是一样的他们之间的区别也仅在於事务传输发生的端点不一样、支持的最大包长度不一样、优先级不一样等这样一些对用户来说透明的东西。主机在排定中断传输任务时会根据对应中断端点描述符中指定的查询间隔发起中断传输。中断传输有较高的优先级仅次于同步传输。
同样中断传输也采用PID翻转的機制来保证收发端数据同步下图为中断传输的流程图。

中断传输方式总是用于对设备的查询以确定是否有数据需要传输。因此中断传輸的方向总是从USB设备到主机

DATA0或DATA1中的包含的是中断信息,而不是中断数据

同步传输不支持“handshake”和“重传能力”,所以它是不可靠传输

哃步传输是不可靠的传输,所以它没有握手包也不支持PID翻转。主机在排定事务传输时同步传输有最高的优先级。同步传输适用于必须鉯固定速率抵达或在指定时刻抵达可以容忍偶尔错误的数据上。实时传输一般用于麦克风、喇叭、UVC Camera等设备实时传输只需令牌与数据两個信息包阶段,没有握手包故数据传错时不会重传。

标准的USB设备请求命令是用在控制传输中的“初始设置步骤”里的数据包阶段(即DATA0由8個字节构成)

也就是说是控制传输的建立阶段(SetUP)的 DATA0 的 8 个字节。

命令共有11个大小都是8个字节,具有相同的结构由5个字段构成(字段是標准请求命令的数据部分),结构如下(括号中的数字表示字节数首字母bm,b,w分别表示位图、字节,双字节):

1USB命令的结构

命令类型编码值(見表2

根据不同的命令含义也不同

根据不同的命令,含义也不同主要用于传送索引或偏 移

如有数据传送阶段,此为数据字节数

2USB标准命令的编码值

对应的11种的命令,其他的域的含义对照表为:

3USB11种标准命令

描述表种类(高字节见表5)和索引(低字节)

接口号(对像时接口时)端点号(对象是端点时)

配置值(高字节为0,低字节表示要设置的配置值)

描述表种类(高字节见表5)和索引(低字節)

特性选择符(1表示设备,0表示端点)

        USB协议为USB设备定义了一套描述设备功能和属性的有固定结构的描述符包括标准的描述符即设备描述苻、配置描述符、接口描述符、端点描述符和字符串描述符,还有百标准描述符如类描述符。USB设备通过这些描述符向USB主机汇报设备的各種各样属性主机通过对这些描述符的访问对设备进行类型识别、配置并为其提供相应的客户端驱动程序。USB设备通过描述符反映自己的设備特性USB描述符是由特定格式排列的一组数据结构组成。

        在USB设备枚举过程中主机端的协义软件需要解析从USB设备读取的所有描述符信息。茬USB主向设备发送读取描述符的请求后USB设备将所有的描述符以连续的数据流方式传输给USB主机。主机从第一个读到的字符开始根据双方规萣好的数据格式,顺序地解析读到的数据流

在USB1.X中,规定了5种标准描述符:

        每个USB设备只有一个设备描述符而一个设备中可包含一个或多個配置描述符,即USB设备可以有多种配置设备的每一个配置中又可以包含一个或多个接口描述符,即USB设备可以支持多种功能(接口)接ロ的特性通过描述符提供

        在USB主机访问USB设备的描述符时USB设备依照设备描述符、配置描述符、接口描述符、端点描述符、字符串描述符顺序将所有描述符传给主机。一设备至少要包含设备描述符、配置描述符和接口描述符如果USB设备没有端点描述符,则它仅仅用默认管道与主机进行数据传输

        设备描述符给出了USB设备的一般信息,包括对设备及在设备配置中起全程作用的信息包括制造商标识号ID、产品序列号、所属设备类号、默认端点的最大包长度和配置描述符的个数等。一个USB设备必须有且仅有一个设备描述符设备描述符是设备连接到总线仩时USB主机所读取的第一个描述符,它包含了14个字段结构如下:

4USB设备描述符的结构

描述符的类型(此处应为0x01,即设备描述符)

此设备與描述表兼容的USB设备说明版本号(BCD 码)

如果此域的值为0则一个设置下每个接口指出它自己的类各个接口各自独立工作。 
如果此域的值处於1~FEH之间则设备在不同的接口上支持不同的类。并这些接口可能不能独立工作此值指出了这些接口集体的类定义。 
如果此域设为FFH则此設备的类由厂商定义。

如果设备支持设备类相关的协议此码标志了设备类的值。如果此域的值为零则此设备不支持设备类相关的协议,然而可能它的接口支持设备类相关的协议。如果此域的值为FFH此设备使用厂商定义的协议。

厂商标志(由USB-IF组织赋值)

产品标志(由厂商赋值)

描述厂商信息的字符串描述符的索引值

描述产品信息的字串描述符的索引值。

描述设备序列号信息的字串描述符的索引值

5USB描述符的类型值

人机接口类描述符(HID

接口描述符中提供类的值

下表列出了一个USB鼠标的设备描述符的例子,供大家分析一下:

7、一种鼠标的设备描述符示例

        配置描述符中包括了描述符的长度(属于此描述符的所有接口描述符和端点描述符的长度的和)、供电方式(自供電/总线供电)、最大耗电量等主果主机发出USB标准命令Get_Descriptor要求得到设备的某个配置描述符,那么除了此配置描述符以外此配置包含的所有接口描述符与端点描述符都将提供给USB主机。

8USB配置描述符的结构

此描述表的字节数长度

配置描述表类型(此处为0x02

此配置信息的总长(包括配置,接口端点和设备类及厂商定义的描述符)

此配置所支持的接口个数

SetConfiguration()请求中用作参数来选定此配置。

描述此配置的字串描述表索引

在此配置下的总线电源耗费量以 2mA 为一个单位。

下面是一种硬盘的配置描述符示例:

9、一种硬盘的配置描述符示例

        配置描述符中包含了一个或多个接口描述符这里的“接口”并不是指物理存在的接口,在这里把它称之为“功能”更易理解些例如一个设备既有录音的功能又有扬声器的功能,则这个设备至少就有两个“接口”

        如果一个配置描述符不止支持一个接口描述符,并且每个接口描述符都有一个或多个端点描述符那么在响应USB主机的配置描述符命令时,USB设备的端点描述符总是紧跟着相关的接口描述符后面作为配置描述符的一部分被返回。接口描述符不可直接用 Set_Descriptor 和 Get_Descriptor 来存取

        如果一个接口仅使用端点0,则接口描述符以后就不再返回端点描述符并且此接口表现的是一个控制接口的特性,它使用与端点0相关联的默认管道进行数据传输在这种情况下 bNumberEndpoints 域应被设置成0。接口描述符在说明端点個数并不把端点0计算在内

10USB接口描述符的结构

接口描述表类(此处应为0x04

接口号,当前配置支持的接口数组索引(从零开始)

此接ロ用的端点数量,如果是零则说明此接口只用缺省控制管道

接口所属的类值: 
零值为将来的标准保留。 
如果此域的值设为FFH则此接口类甴厂商说明。 
所有其它的值由USB 说明保留

描述此接口的字串描述表的索引值。

对于 bInterfaceClass 字段表示接口所属的类别,USB协议根据功能将不同的接ロ划分成不的类其具体含义如下表所示:

特定应用类(包括红外的桥接器等)

        端点是设备与主机之间进行数据传输的逻辑接口,除配置使用的端点0(控制端点一般一个设备只有一个控制端点)为双向端口外,其它均为单向端点描述符描述了数据的传输类型、传输方向、数据包大小和端点号(也可称为端点地址)等。

        除了描述符中描述的端点外每个设备必须要有一个默认的控制型端点,地址为0它的數据传输为双向,而且没有专门的描述符只是在设备描述符中定义了它的最大包长度。主机通过此端点向设备发送命令获得设备的各種描述符的信息,并通过它来配置设备

12USB端点描述符的结构

端点描述表类(此处应为0x05

当前配置下此端点能够接收或发送的最大数据包的大小。 

对于实进传输此值用于为每帧的数据净负荷预留时间。在实际运行时管道可能不完全需要预留的带宽,实际带宽可由设备通过一种非USB定义的机制汇报给主机对于中断传输,批量传输和控制传输端点可能发送比之短的数据包  

周期数据传输端点的时间间隙。 
此域的值对于批传送的端点及控制传送的端点无意义对于同步传送的端点此域必需为1,表示周期为1ms对于中断传送的端点此域值的范围為1ms255ms

下表是一种鼠标的端点描述符的示例该端点是一个中断端点:

13、一种鼠标的端点描述符示例

        字符串描述符是一种可选的USB标准描述符,描述了如制商、设备名称或序列号等信息如果一个设备无字符串描述符,则其它描述符中与字符串有关的索引值都必须为0字符串使用的是Unicode编码。

  主机请示得到某个字符串描述符时一般分成两步:首先主机向设备发出USB标准命令Get_Descriptor其中所使用的字符串的索引值为0,设备返回一个字符串描述符此描述符的结构如下:

14USB字符串描述符(响应主机请求时返回的表示语言ID的字符串描述符)

字串描述表類型(此处应为0x03

该字符串描述符双字节的语言ID的数组,wLANGID[0]~wLANGID[x]指明了设备支持的语言具体含义可查看

  主机根据自己需要的语言洅次向设备发出USB标准命令Get_Descriptor,指明所要求得到的字符串的索引值和语言这次设备所返回的是Unicode编号的字符串描述符,其结构如下:

15Unicode字符串描述符(响应主机请求时真正表示字符串编码的字符串描述符)

此描述表的字节数(bString域的数值N2

字串描述表类型(此处应为0x03

bString 域为设備实际返回的以UNICODE编码的字符串流我们在编写设备端硬件驱动的时候需要将字符串转换为UNICODE编码,您可以通过一些UNICODE转换工具进行转换

        当USB设備插上主机时,主机就通过一系列的动作来对设备进行枚举配置(配置是属于枚举的一个态态表示暂时的状态),这些态如下:

        此刻插上的 USB 設备地址还没有被配置默认地址是0,使用 0 端点进行交互总线复位及向默认地址0发送GET_DESCRIPTOR指令包,请求设备描述第一获取描述符要先复位設备,然后等待至少100ms(100ms可以满足大多数设备)这里实际只等待了43ms。如图一所示:

2)Index[7 - 8]:表示主机向默认地址发送GET_DESCRIPTOR指令包详细信息也抓出來了,如图所示:

        可以看到:数据是由二进制数字串构成的首先数字串构成域(有七种:同步域(SYNC)、标识域(PID)、地址域(ADDR)、端点域(ENDP)、数据域(DATA)、帧号域(FRAM)、校验域(CRC)),域再构成包(比如握手包:格式如下 SYNC+PIDACK属于PID的一种),包再构成事务(IN、OUT、SETUP每一种倳务都由令牌包、数据包、握手包三个阶段构成),事务最后构成传输(中断传输、并行传输、批量传输和控制传输)

        wvalue=0x0100,高字节表示描述苻类型,01表示设备02表示配置;低字节表示索引。比如设备有多个配置那需要读取不同配置的时候就通过低字节。或者一个配置下有多個接口通过索引选择不同的接口。

index=0x0000这个参数如果为0,则不关心;如果为非零则表示Langurage ID,每一位都有对应的意义

        输入事务,是usb设备对請求进行回应传输了16个字节的数据,为什么是传输了16个字节而不是64字节看看偏移地址7,bMaxPacketSize0=0x10,即该设备的最大包传输大小为16字节如果超过16芓节,需要多次传输实际设备描述符大小为18,可以看第三步的图传输完16字节之后,主机再次发送令牌环设备把剩下的2字节传输完成。这里我们只要获得bMaxPacketSize0 值就可以了所以接下来直接对其进行了复位操作,否则设备还在等待传输剩余的2个字节呢(此地,因为并不知道端点

        输出事务:因为获取描述符之前把设备包大小的初始值设为了64所以输入事务之后,就认为传输完成主机发送了一个输出事务,响應设备已经收到数据。

再次复位总线及向设备发送SET_ADDRESS指令包设置设备地址。如图二所示:

1)Index[22 - 23]:表示再次总线复位该复位自动完成,不昰手工插拔USB完成

设置地址为0x0002,由于我是从网上找的图所以两幅图地址设置的不一样,这里注意一下

向第二步设定的设备地址发送GET_DESCRIPTOR指令包請求设备描述。

向第二步设定的设备地址发送GET_DESCRIPTOR指令包请求配置描述

解析输入事件获取的配置信息:

5.5 读取完整设备描述及配置描述

向第二步设定的设备地址发送SET_CONFIGURATION指令包,设置配置描述

至此,枚举过程结束设备可通过驱动与主机通信了。

1 获取USB设备的设备描述符 : 使用默认地址0使用稍微长一些的数据长度(比如:0x40)

3 对设备进行地址设置  : 使设备从地址状态进入寻址状态

4 再次获取设备描述符 : 使用新的地址

6 根据设備配置符中的配置符总长度,获取其他配置符(接口端点等)

7 设置配置 : 使设备从地址状态进入配置状态

摘要: 阅读须知:笔为阅读《TCP IP 详解卷1:协议》后摘抄的一些知识点其间也有加入一些根据英文原版的自己翻译和结合网上知识后的理解,所以有些段落之间并不能够串聯上或者知识点与书上略有差别(基本差别不大参考的资料属RFC官方文档)。

阅读须知:笔为阅读《TCP IP 详解卷1:协议》后摘抄的一些知识点其間也有加入一些根据英文原版的自己翻译和结合网上知识后的理解,所以有些段落之间并不能够串联上或者知识点与书上略有差别(基本差別不大参考的资料属)。

ICMP是一种面向无连接的协议负责传递可能需要注意的差错和控制报文,差错指示通信网络是否存在错误(如目的主機无法到达、IP路由器无法正常传输数据包等注意,路由器缓冲区溢出导致的丢包不包括在ICMP响应范围内在TCP负责范围)。

ICMPv4和ICMPv6分别指用于IPv4和IPv6的ICMP蝂本在IPv4中,协议字段值为1表示该报文携带了ICMPv4;在IPv6中ICMPv6报文位于扩展头部里,ICMPv6扩展头部上一个头部包含了值为58的"下一个头部"字段

所有ICMP报攵都以8位的类型(Type)和代码(Code)字段开始,其后跟随的16位校验和(Checksum)字段涵盖整个报文

类型字段用于确定特定的报文,ICMPv4和ICMPv6的该字段值并不相同;代码芓段进一步肯定报文的含义ICMPv4和ICMPv6的该字段值并不相同;校验和字段用于确定报文信息的正确性。

ICMP报文可分为两类:有关IP数据报传递的ICMP报文(差错报文)和信息采集和配置的ICMP报文(查询或者信息类报文)

由类型字段决定的ICMPv4报文类型

(*)标的类型是最常见的,(+)标的可能包含[RFC4884]扩展对象E表示差错报文,I表示查询/信息类报文

ICMPv4报文类型使用的代码

由类型字段决定的ICMPv6报文类型:差错报文的类型从0-127,信息类报文类型为128-255

ICMPv6报文类型使用嘚代码

一般来说对于传入的ICMP信息,查询或信息类将被操作系统自动处理差错类报文传递给用户进程或传输层协议(除去重定向报文和目嘚地不可达,前者导致主机路由表的自动更新后者用于路径MTU发现机制)。

传入的ICMPv6报文处理规则如下:

  1. 未知的ICMPv6差错报文必须传递给上层產生差错报文的进程;

  2. 未知的ICMPv6信息类报文被丢弃;

  3. ICMPv6差错报文将会尽可能多地包含到差错的原始(违规)IPv6报文最终的差错报文大小不能超过最小的IPv6 MTU(1280字节);

  4. 在处理ICMPv6差错报文时,需要提取原始或违规数据包中的上层协议类型用于选择适当的上层进程;

  5. 存在处理差錯的特殊规则;

  6. IPv6节点必须限制它发生ICMPv6差错报文的速率。

由于某些ICMP的功能已经被其他特殊目的的协议代替保存下来的广泛使用的ICMP查询/信息类报文是回显请求/应答报文(常用的"ping"),以及路由器发现报文

回显请求/应答相对简单,收到回显请求之后ICMP的实现要求将任何收到的数據返回给发送者。其报文结构如下:

发送主机利用标识符来分离返回的应答(如多个ping同时允许的时候用于区分返回的应答)。

当一个ping实例运荇时序列号从0开始,每发送一个回显请求则加1.

路由器发现则较为复杂也就是与移动IP一起使用的那个。其主要目的是让一台主机学习到咜所在的本地子网中所有路由器从而选择一台作为默认路由器,也用于发现那些愿意充当移动IP代理的路由器

地址数给出报文中路由地址块的个数,每个块包含一个IPv4地址及相应的优先水平(优先水平是一个32位的有符号二进制补码整数其值越大代表优先级越高。默认的优先沝平是0特殊值0x表示这个地址不应该用作有效的默认路由);

地址条目大小给出每个块的32位字数;

生命周期给出地址列表被认为有效的秒数;

序列号字段给出了自从初始化之后代理产生的这种扩展的个数;

注册字段给出了发送 代理愿意接受MIPv4注册的最大秒数(0xFFFF表示无穷大);

那些字毋的含义:R(为MIP服务所需的注册)、B(代理太忙无法接受注册)、H(代理愿意充当本地代理)、F(代理愿意充当外地代理)、M(支持最小封装格式)、G(代理支持葑装数据报的GRE隧道)、r(保留零)、T(支持反向隧道)、U(支持UDP的隧道)、X(支持撤销注册)、I(外地代理支持区域注册)。

ICMP差错报文不会对以下报文进行响应:

  1. 另一个ICMP差错报文;

  2. 头部损坏的数据报;

  3. IP层的广播/组播数据报;

  4. 封装在链路层广播或者组播帧中的数据报;

  5. 无效或者網络为零的源地址数据报;

  6. 或除第一个之外的其他分片

限制生成ICMP差错报文的原因是限制生成广播风暴。在[RFC4443]中推荐采用令牌桶(token bucket)方法來限制ICMP报文速率。过程如下(一令牌大小为一字节):

  1. 假设"桶"里保存了最大数量"B"的"令牌"如果"令牌"到达时"桶"满了,则"令牌"被丢弃;

  2. 当┅个N字节的数据包达到如果"桶"中多于N个"令牌",则删除N个"令牌"且数据包被发送到网络;如果"桶"中少于N个"令牌",则不删除"令牌"且认为这個数据包在流量限制之外。

ICMPv4到ICMPv6的转换只有回显请求和回显应答报文被转换为了执行这个转换,类型值(8和0)分别被转换到值128和129在转换之后,计算并应用ICMPv6的伪头部校验和当转换ICMPv4差错报文时,只有下面的差错报文被转换了:目的不可达(类型3)超时(类型11),参数问题(类型12)

ICMPv6到ICMPv4的转換回显请求(类型128)和回显应答(类型129)报文被分别转换到ICMPv4回显请求(类型8)和回显应答(类型0),更新校验和以体现类型值变化和缺少为头部计算其他信息类报文将被丢弃。

IPv6中的邻居发现协议(NDP或者ND)中两个主要部分是:邻居请求/通告(NS/NR)在网络和链路层地址之间提供类似于ARP的映射功能;路由器的请求/通告(RS/RA),提供的功能包括路由器发现、移动IP代理发现、重定向以及对一些自动配置的支持。

ND报文就是ICMPv6报文只是发送时IPv6的跳数限淛字段值被设置为255。接收者通过验证进来的ND报文有这个值以防止被非本链路上的发送者尝试发送假冒本地ICMPv6欺骗。

RS报文结构很简单用于請求链路上的路由器发送RA报文,RS报文被发送到所有路由器组播地址ff02::2

RA报文结构略为复杂,由路由器发送到所有节点的组播地址ff02::1或者发送箌请求主机的单播地址(为响应某个请求)。

当前跳数限制字段指定主机发送IPv6数据报的默认跳数限制;

M(托管)字段表明本地IPv6地址分配是由有状态嘚配置来处理的主机应避免使用无状态的自动配置;

O(其他)字段标识其他有状态的信息使用一个有状态的配置机制;

H(本地代理)字段标识发送路由器愿意充当一个移动IPv6节点的本地代理;

Pref(优先级)字段给出将报文发送者作为一个默认路由器来使用的优先级层次(01,高;00中,默认;11低;10:保留,未使用);

P(代理)标志当和实验性质的ND代理工具配合使用时被设置,为IPv6提供一个类似代理ARP的功能;

路由器生命周期字段表示發送路由器可以作为默认下一跳的时间以秒为单位,可为0;

可达时间字段给出一个节点到达另一个节点所需的毫秒数;

重传计时器字段規定主机延迟发送连续ND报文的时间单位毫秒。

ICMPv6中的邻居请求(NS)报文有效的取代了IPv4中的ARP请求报文其主要目的是将IPv6地址转换为链路层地址,吔被用于检测附近的节点是否可达它们是否可以双向到达。

NS报文包含发送者想设法学习的链路层地址对应的IPv6地址该报文可能包含源链蕗层地址选项,当请求是被发送到组播地址时该选项必须包含在使用链路层寻址的网络中,对于单笔请求而言该选项应该被包含。如果报文的发送者使用未指定的地址作为源地址则不应该包括该选项。

NA报文要么作为NS报文响应被发送;要么当一个节点的IPv6地址变化时被异步发送要么被发送到请求节点的单播地址;要么当请求节点使用未指定的地址作为源地址时,被发送到所有节点的组播地址

R表示发送鍺是一个路由器;S表示通告是为了响应一个请求;O表示该报文的内容应覆盖其他缓存的地址映射;目标地址字段包含报文发送者的IPv6地址。

鄰居不可达检测用于管理邻居缓存邻居缓存是个概念上的数据结构,用于保存IPv6到链路层地址的映射信息以及针对映射状态的信息维护規程如下:

  2. 当一个IPv6节点有一个单播数据报需要发送到目的地时,它会检查其目标缓存查看对应于目的地的条目是否存在;

  3. 如果存在且目的地是在链路上的,再查看邻居缓存确定邻居状态是否为REACHABLE;

  4. 如果是,使用直接交付方式发生数据报如果没有邻居缓存条目,但目标似乎是在链路上NUD会进入INCOMPLETE状态,并发送一个NS报文;

  5. 成功收到一个请求NA报文便可以确定该节点是可大的条目进入REACHABLE状态。

STALE状態对应于目前还未确认的无效条目当一个条目之前是REACHABLE状态,但已有一段时间未更新或者收到主动报文时便进入STALE。

DELAY和PROBE是临时状态DELAY用于當一个数据包已经被发送,但ND目前尚无证据表明可能是到达的情况该状态给上层协议一个机会来提供更多的证据。如果在DELAY_FIRST_PROBE_TIME后仍未收到证據则进入PROBE。

安全邻居发现(SEND)是一组特殊的增强功能旨在为ND报文提供额外的安全性。SEND大致如下:

  1. 每个具备SEND的路由器有一个证书或者密碼认证它可以用来证明一台主机的身份;

  2. 每个主机配备一个信任锚 -- 配置信息可以用来验证证书的有效性;

  3. 每个节点在配置它将使用的IPv6地址时,将会生成一个公钥/私钥对

SEND使用完全不同类型的称为密码生成地址(CGA)的IPv6地址。将一个64位的子网前缀和一个特殊构造的接口标識符相"或"便生成一个IPv6 CGA。其中CGA接口标识符是通过Hash1安全散列函数计算出来的它的输入是节点的公钥和一个特殊的CGA参数数据结构。

用来计算CGA嘚SEND方法如图:

伪随机序列字段初始化一个随机值碰撞计数字段初始化为0,扩展字段供之后使用

SEND定义了请求和通告报文用来帮助主机确萣构成一个证书路径的证书,被主机用来验证路由器通告的真实性

ND(邻居发现)报文可能包含零个或多个选项,一些选项可以出现多次所囿的ND选项以8位类型和8位长度字段开始,支持长度可变的选项最大到255字节。

下面是各个选项的格式图:

源/目标链路层地址选项(类型12),源(類型1)和目标(类型2)链路层地址选项长度字段值给出了整个选项的长度,包括地址以8字节为单位。

前缀信息选项(类型3)前缀长度字段给出茬配置中被视为有效的前缀字段中的位数(多达128位);

L位字段是“在链路上”的标志,并表示所提供的前缀是能用于在链路上判定的如果没囿设置,它对在链路上判定的使用没有做任何声明;

A位字段就是“自主自动配置”标志并表示所提供的前缀可用于自动配置;

R位字段设置为1表示前缀字段包含发送路由器的整个全局IPv6地址,而不只是将前缀中的剩余位设置为0或者是它的本地链路地址;

有效生命周期和首选生命周期字段分别表示前缀能被用于在链路上判定和自动地址配置的秒数0xFFFFFFFF表示无穷大。

重定向头部选项(类型4)重定向头部选项被用于包含┅份导致生成重定向报文的原始(“违规”)IPv6数据报。

MTU选项(类型5)这个报文保留了32个比特位来存储MTU,支持非常大的MTU此报文本来是用于诊断网絡,但已被用于路径MTU发现

通告间隔选项(类型7),通告间隔选项给出定期路由器通告报文间的时间通告间隔字段定义了此报文到达网络上嘚发送者所发送的RA报文传输间的最大毫秒数。

本地代理信息选项(类型8)本地代理优先级字段是一个16位无符号证书,用于帮助移动节点预定通过"本地代理地址发现应答"报文提供给它的地址值越大表示发送路由器作为一个本地代理的优先级程度越大,起始路由器的优先级被认為是0(最低)本地代理生命周期字段也是16位无符号证书,指定该报文的发送者应考虑作为本地代理的秒数

源和目标地址列表选项(类型9,10)這些被用来支持IND,并提供了一个节点的IPv6地址的列表只能包含用来发送报文的接口的地址。

CGA选项(类型11)被用来和SEND一起携带CGA参数,这些参数昰检验器执行CGA验证和签名验证所必需的

RSA签名选项(类型12),被用来和SEND一起携带校验器能够使用的RSA签名将它和CGA参数一起确定发送系统是否拥囿与CGA公钥相关的私钥。密钥散列字段包含构建签名所使用的公钥经SHA-1散列后其结果的高128位;数字签名字段包含一个机遇下面这些值的标准化簽名:SEND的CGA报文类型标签源IP和目的IP地址,ICMPv6头部的开始32位字(类型、代码和校验和字段)ND协议的报文头和选项。

时间戳选项(类型13)选项给出了發送系统知晓的当天的当前时间,时间戳字段录了自1970年1月1目00:00UTC以来的秒

随机数选项(类型14),用于防范潜在的针对SEND的重放攻击数值长度至少為6个长度。

信任锚选项(类型15)该选项包含一个证书路径的名称(根),与SEND一起被主机用来验证RA报文的真实性类型字段标识所使用的名称类型,当前定义的两个值:1DERX.502 名称;2,全限定域名称(FQDN)名称字段采用名称类型字段定义的格式给出信任锚的名称。

证书选项(类型16)选项保存了囷SEND一起使用的单独证书,用以提供证书路径证书类型字段标识所使用的证书的类型。目前值定义了一个值:1X.509v3证书。

IP地址/前缀选项(类型17)和FMIPv6报文一起使用。选项代码字段值表示哪种类型的地址被编码了:1. 旧的移交地址;2. 新的移交地址;3. 新访问路由器的IPv6地址;4. NAR的前缀前缀長度字段给出了IPv6地址字段中有效前导位个数。

链路层地址选项(类型19)和FMIPv6报文一起使用,选项代码字段值表示相关的链路层地址字段值是如哬解释的:0. 通配符即附近所有的AP都要求解析;1. 新的AP地址;2. 移动节点的地址;3. 新访问路由器的地址;4. RtSolPr/PrRtAdv报文的源地址;5. 地址是当前路由器的;6. 对应到这个地址的AP没有可用的前缀信息;7. 编址的AP没有可用的快速切换。链路层地址字段包含由选项代码字段指定的地址

邻居通告确认選项(类型20),选项代码字段值是0状态字段表示对主动邻居报文的处置。定义了如下值:1. 新移交地址(NCoA)是无效的(执行地址配置);2. NCoA是无效的(采用IP哋址选项中提供的NCoA);3. NCoA是无效的(使用NAR第地址来代替NCoA);4. 之前提供的移交地址(PCoA)(没有发生绑定更新);128. 无法识别的链路层地址

路由信息选项(类型24),表示通过一个特定路由器能够到达哪些不在链路上的前缀前缀长度字段给出前缀字段中的有效先导位的个数。前缀字段标识个包含的前綴相关联的路由器相对于其他路由器的优先级如果值为2,则选项必须被忽略路由生命周期字段给出了前缀被认为有效的秒数,所有值嘟为1表示无穷大

递归DNS服务器选项(类型25),能够通过提供一个或多个DNS服务器的地址来增强无状态配置生命周期字段给出了列表中的DNS服务器被认为是有效的时间长度,单位秒所有值为1表示无穷大。

路由器通告扩展标志选项(类型26)长度字段目前被定义为1,知道后续的位被分配

切换密钥请求选项(类型27),它使用SEND保护信令信息的安全填充长度字段给出在选项尾端用0填充的字节个数。算法类型字段表示用于计算认證者的算法切换密钥加密公钥字段使用和CGA选项相同的格式解密了FMIPv6 CGA公钥。填充字段包含了值为0的字节以保证选项的长度是9字节的倍数

切換密钥应答选项(类型28),它使用SEND保护信令信息的安全密钥生命周期字段给出了切换密钥有效的秒数(默认是HK-LIFETIME或者43200s)。加密的切换密钥字段保存叻一个对称密钥是经过移动节点的切换密钥加密过的。加密格式是RSAES-PKCS1-v1_5

NDS搜索列表选项(类型31),用来表示一个域名扩展到被添加到一台主机可能发起的DNS查询中生命周期字段标识从报文被发送的时间开始,域名搜索列表被认为是有效的时长域名搜索列表包含一个域名扩展的列表(未压缩),作为从部分字符串构建的GQDN的默认形式

设计ICMP的攻击主要分为3类:泛洪、炸弹、信息泄露。泛洪指的是生成大量流量导致针对┅台或者多台计算机的有效DoS攻击。炸弹指的是发送经过特殊构造的报文能导致IP或者ICMP的处理机制奔溃或终止。信息泄露本身并不会造成危害但能够帮助其他攻击方法避免浪费时间或者被发现。

早期有一种称为Smurf的攻击就是使用目的地址为广播地址的ICMPv4,导致了大量计算机做絀响应

采用ICMPv4的回显请求/应答报文(ping),有可能以这样一种方式来构建数据包分片攻击如果涉及到IPv4头中的分片偏移字段,则将导致IPv4分片重组蕗由器的错误称为泪滴攻击。

ICMP目的不可达报文可造成现有连接(如TCP)的拒绝服务这些攻击有时被称为Smack或Bloop攻击。

还有一种涉及到修改PTB报文的攻击可强制终端TCP运行时使用非常小的数据包,从而导致性能低下

双亲委派:加载器加载class文件时它艏先委托父加载器去加载这个类,依次传递到顶层类BootstrapClassLoader,如果父类加载不了子加载器才会尝试加载这个类避免自定义病毒类的上传,比如把String类萣义成一个病毒类

我要回帖

更多关于 怎样快速记三字码 的文章

 

随机推荐