邪恶八进制信息安全团队技术讨论组's Archiver

冰血封情 2005-10-4 00:41

[转载]IPv6 超大包(Jumbogram)

<P>信息来源:邪恶八进制信息安全团队</P>
<P align=justify>摘要</P>
<P align=justify>超大包(jumbogram)指的是有效数据长度大于64K的包。本文主要描述IPv6超大包选项,它提供了描述超大包长度的方法,同时也说明了为使用超大包而对TCP和UDP进行的改变。超大包仅仅在MTU大于65,575的IPv6结点上使用,对于连接在不支持这么大MTU的结点,没有必要实现。</P>
<P align=justify>1. 介绍</P>
<P align=justify>IPv6包头有16位有效数据长度域,因此支持大于64K的数据。本文指定IPv6结点到结点选项,称为超大有效数据选项,它有32位,这样就可以使用包的有效数据长度在65,536到4,294,967,295字节。如果包内有这么多的有效数据则称为“超大包”。超大包选项只适用于连接于支持大于65,575字节MTU的连接上的结点。对于不支持的结点,根本没有必要对它实现超大有效数据选项。</P>
<P align=justify>可配置MTU的连接上,如果与结点相连的连接不支持超大有效数据选项MTU值不得大于65,575字节,超大有效数据选项也不会发送至这些结点。UDP包头中有16位长度域,这使得它不能使用超大包,虽然TCP没有长度域,但TCP的MSS选项和TCP的紧急域也只有16位,本文中也会说明一些对TCP和UDP的改进使它可以利用超大包。如果在IPv6上实现支持超大包的TCP和UDP,必须使用这种改进。在进行改进时,原来在TCP和UDP包中的校验码的准确性大打折扣,应用程序实现者应该考虑到这一点。</P>
<P align=justify>2. 超大有效数据选项格式</P>
<P align=justify>超大有效数据选项在IPv6结点到结点选项中。此选项要求进行4N+2对准。它的格式如下:</P>
<P>
<TABLE cellSpacing=1 cellPadding=7 width="100%" border=1>
<TBODY>
<TR>
<TD style="BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: thick" vAlign=top width="25%"> </TD>
<TD style="BORDER-TOP: 0px; BORDER-LEFT: 0px; BORDER-BOTTOM: thick" vAlign=top width="25%"> </TD>
<TD vAlign=top width="25%"><FONT face=宋体 size=3>
<P align=center>选项类型</FONT></P></TD>
<TD vAlign=top width="25%"><FONT face=宋体 size=3>
<P align=center>选项数据长度</FONT></P></TD></TR>
<TR>
<TD vAlign=top colSpan=4><FONT face=宋体 size=3>
<P align=center>超大有效数据长度</FONT></P></TD></TR></TBODY></TABLE><FONT face=宋体 size=3></P>
<P align=justify>其中:选项类型=C2,选项数据长度=4,超大有效数据长度=32位无符号整数,长度以字节计,不包括包头,但包括结点到结点(Hop-by-Hop)选项和其它扩展,但必须大于65,535。</P>
<P align=justify>3. 使用超大有效数据选项</P>
<P align=justify>如果有超大有效数据选项,IPv6头中的有效数据长度域设为0。如果结点接收到的包内有效数据选项和下一包头值均为0,而链路层帧指示包头的字节数多于包头的字节数,结点必须处理结点到结点选项,以便从超大有效数据选项中取得实现长度。超在有效数据选项不得用于分段包中。如果有效数据长度域为0,高层协议在进行使用有效数据长度域进行长度计算时要使用超大有效数据长度选项。</P>
<P align=justify>结点在接收时要能够处理可能的格式错误,如果错误错误的包不发向多个地址,可以使用ICMP参数错误信息报告错误,下表中的错误说明了参数错误消息中代码和指针域的值及其意义:</FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=7 width="100%" border=1>
<TBODY>
<TR>
<TD vAlign=top width="50%"><FONT face=宋体 size=3>
<P align=justify>IPv6有效数据长度=0,而且下一包头=结点到结点选项,而且没有超大有效数据选项</FONT></P></TD>
<TD vAlign=top width="50%"><FONT face=宋体 size=3>
<P align=justify>代码=0;指针=IPv6有效数据长度字节的高位部分</FONT></P></TD></TR>
<TR>
<TD vAlign=top width="50%"><FONT face=宋体 size=3>
<P align=justify>IPv6有效数据长度!=0,而且没有超大有效数据选项</FONT></P></TD>
<TD vAlign=top width="50%"><FONT face=宋体 size=3>
<P align=justify>代码=0;指针=超大有效数据选项的选项类型域</FONT></P></TD></TR>
<TR>
<TD vAlign=top width="50%"><FONT face=宋体 size=3>
<P align=justify>超大有效数据选项存在,但超大有效数据长度小于64K</FONT></P></TD>
<TD vAlign=top width="50%"><FONT face=宋体 size=3>
<P align=justify>代码=0;指针=超大有效数据长度字节的高位部分</FONT></P></TD></TR>
<TR>
<TD vAlign=top width="50%"><FONT face=宋体 size=3>
<P align=justify>超大有效数据选项存在,而且分段存在</FONT></P></TD>
<TD vAlign=top width="50%"><FONT face=宋体 size=3>
<P align=justify>代码=0;指针=分段字节的高位部分</FONT></P></TD></TR></TBODY></TABLE><FONT face=宋体 size=3></P>
<P align=justify>对于不支持超大有效数据选项的,会返回以下错误:</FONT></P>
<P>
<TABLE cellSpacing=1 cellPadding=7 width="100%" border=1>
<TBODY>
<TR>
<TD vAlign=top width="50%"><FONT face=宋体 size=3>
<P align=justify>有效数据长度=0,而且下一包头=结点到结点选项</FONT></P></TD>
<TD vAlign=top width="50%"><FONT face=宋体 size=3>
<P align=justify>代码=0;指针=有效数据长度字节的高位部分</FONT></P></TD></TR>
<TR>
<TD vAlign=top width="50%"><FONT face=宋体 size=3>
<P align=justify>有效数据长度!=0,而且超大有效数据选项存在</FONT></P></TD>
<TD vAlign=top width="50%"><FONT face=宋体 size=3>
<P align=justify>代码=2;指针=超大有效数据选项的选项类型域</FONT></P></TD></TR></TBODY></TABLE><FONT face=宋体 size=3></P>
<P align=justify>4. UDP超大包</P>
<P align=justify>UPD中的16位长度域限制UDP包长度小于64K,下面我们说明一种改进限制的方法:大于64K的UPD包内的长度域设置为0,接收方从IPv6有效数据长度域内取得真正长度。在实现时请注意,UPD包长度域不允许0,它的最小值为8。发送UDP超大包的要求如下:</P>
<P align=justify>在发送UDP包是,当且仅当包头和数据长度大于65,535时,设置长度域为0。既UDP包很大,因此IPv6必须实现超大有效数据选项,设置此选项的值为UPD包头加数据加所有在UPD包头与IPv6包头之间的扩展信息长度。对于UPD的校验码,它的值等于UDP包头的实际长度加上在校验码假头中的数据(不是0)获得。</P>
<P align=justify>接收时的要求如下:</P>
<P align=justify>在接收UDP包时,当且仅当UDP包头内的长度域为0时,长度=超大数据长度域的值-所有在IPv6头与UDP头之间的扩展信息长度(公式1)。如果UDP长度域为0,但超大有效数据选项不存在,使用IPv6包头内的有效数据长度域代替公式1中的超大数据长度域。进行校验时和发送时的要求类似。</P>
<P align=justify>5. TCP超大包</P>
<P align=justify>虽然TCP中没有长度域,不存在限制,但是连接开始时的MSS域却限制了包的长度,而且紧急指针不能引用大于65,535字节的数据。</P>
<P align=justify>5.1 TCP MSS</P>
<P align=justify>在决定MSS时,如果接口的MTU加60大于等于65,535,MSS=65,535。接收方接收到65,535时,会视它为无限。执行路径MTU发现后获得的数据减60就是MSS的实际长度。</P>
<P align=justify>5.2 TCP紧急指针</P>
<P align=justify>通过添加TCP紧急指针选项可以解决关于紧急指针的问题。但是,应用程序不可能同时使用超大包和紧急指针,使用一个类似于MSS的修改就够用了。当TCP包和紧急指针一起发送时,首先计算偏移量。如果偏移量小于65,535,写入紧急指针然后进行正常的TCP处理,如果偏移量大于65,535,偏移量大于等于TCP数据长度,紧急指针设置为65,535,进行正常的TCP处理。然而,TCP必须分成两段。头一段包括数据,但不包括由紧急指针指向的数据,紧急域设置为65,535以说明紧急指针未指向包内数据。第二段以正常的紧急域发送。注意:第一段不用包括紧急指针以前所有的数据,可以少一点,只在要紧急指针内就可以了。</P>
<P align=justify>对于TCP接收处理,当TCP包设置了URG位,紧急域为65,535,紧急指针由数据长度取得,而不是紧急域的偏移量。虽然TCP窗口只有16位,但是可以通过使用TCP端口规模选项使用更大的窗口。</FONT></P>

页: [1]
© 1999-2008 EvilOctal Security Team