⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 internet协议.htm

📁 internet协议集
💻 HTM
📖 第 1 页 / 共 3 页
字号:
      <P align=justify>填充:变长</P>
      <P align=justify>报头域填充用于保证报头是32位的倍数。填充值为0。</P>
      <P align=justify>3.2. 讨论</P>
      <P 
      align=justify>协议的实现必须健壮,每个实现都要保证与其它人的实现兼容。通常一个实现在发送时应该遵守比较保守的策略,在接收时大可不必保守。也就是说,发送构成良好的包,接收自己能够解释的包(有些错误也是将就着了)。</P>
      <P 
      align=justify>基本的Interent服务是面向数据报的,在网关处可以提供以数据报的分段和在目的主机的重组服务。当然,在一个网络内或在因遵守私下的协议而在一个网络的网关间进行分段和重组也是可以的,因为这对IP协议和高层协议是透明的。这种透明的分段称为基于网络的分段,这里不做讨论。IP地址是在主机一级区别源地址和目的地址的。</P>
      <P align=justify>寻址</P>
      <P 
      align=justify>为了可以对网络大小进行灵活的控制,IP地址提供了几类地址,一类是可以容纳比较多主机的网络,一种容纳的主机数就比较少,我们大家听说过的什么A类,B类地址,C类地址就是为了用于不同规模的网络而提出的。下面是一些地址格式:</FONT></P>
      <TABLE cellSpacing=1 cellPadding=7 width="100%" border=1>
        <TBODY>
        <TR>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>最高位</FONT></P></TD>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>格式</FONT></P></TD>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>类</FONT></P></TD></TR>
        <TR>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>0</FONT></P></TD>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>7位网络用,24位主机用</FONT></P></TD>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>a</FONT></P></TD></TR>
        <TR>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>10</FONT></P></TD>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>14位网络用,16位主机用</FONT></P></TD>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>b</FONT></P></TD></TR>
        <TR>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>110</FONT></P></TD>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>21位网络用,8位主机用</FONT></P></TD>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>c</FONT></P></TD></TR>
        <TR>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>111</FONT></P></TD>
          <TD vAlign=top width="33%"><FONT face=宋体 size=3>
            <P align=justify>扩充地址模式</FONT></P></TD>
          <TD vAlign=top width="33%"> </TD></TR></TBODY></TABLE><FONT face=宋体 
size=3>
      <P align=justify>如果网络域为零意味着本网络,这种方式仅在于特定的ICMP消息中使用;扩展的地址模型未定义。</P>
      <P 
      align=justify>由本地网络指定的本地地址必须考虑到单个的主机可以作为不同的网络主机使用。也就是说,必须在网络主机地址和网络/主机接口之间进行映射,这种接口允许几个IP地址对应一个接口。同时还应该考虑到一台主机有多个处理接口,对于从不同接收收到的信息应该看做是来自同一个IP地址的。</P>
      <P align=justify>分段和重组</P>
      <P 
      align=justify>Internet标记域(ID)和源地址,目的地址和协议域一起用于确认数据报分段和重组。如果数据报不是最后一段,则设置多段标记位(MF)。段偏移域标记段位置,它是相对于未分段时的数据报而言的。段以8个字节为单位,这样的分段策略使未分段的数据报有全零的分段信息(MF 
      = 0,段偏移= 
      0)。如果进行分段,边界必须是8个字节的倍数。这种格式允许2的13次方(8192)个8字节段,一个数据报的最大长度刚好和长度域标明的数据64K一致。在分段时,有些选项被复制,有些则不。</P>
      <P 
      align=justify>每个IP模块必须能够不分段地传送68字节的数据报。这因为IP包头会达到60字节,而最小数据段长为8,68=60+8;而它也必须能够接收576字节的数据,不论这数据是未分段的还是分段的。</P>
      <P align=justify>会被分段影响的域包括: </P>
      <P align=justify>(1) 选项域</P>
      <P align=justify>(2) 多段标记</P>
      <P align=justify>(3) 段偏移</P>
      <P align=justify>(4) Internet包头长度域</P>
      <P align=justify>(5) 总长度域</P>
      <P align=justify>(6) 包头校验码</P>
      <P 
      align=justify>如果设置了不分段标记(DF),则不可进行分段,即使数据报会因此而被抛弃。如果接收主机不能进行重组时则需要设置此位。我们在进行无盘引导时,则需要设置这一位。下面通过例子说明这一过程。其中#代表不等于,X到Y指的是包括X,而不包括Y的所有数据。</P>
      <P 
      align=justify>能够在下一个网络传送的最大数据报称为最大传输单元(MTU)。如果数据报的长度小于等于MTU,进行下一步;否则分为两段,第一段的大小等于MTU,第二段就是剩余的长度,将第一段传送,如果第二段仍然大于MTU,则重复分段过程,直到可以发送为止。下面我们给出一个定义:</P>
      <P align=justify>FO - 段偏移</P>
      <P align=justify>IHL - Internet包头长度</P>
      <P align=justify>DF - 不分段标记</P>
      <P align=justify>MF - 多段标记</P>
      <P align=justify>TL - 总长度</P>
      <P align=justify>OFO - 原段偏移</P>
      <P align=justify>OIHL - 原Internet包头长度</P>
      <P align=justify>OMF - 原多段标记</P>
      <P align=justify>OTL - 原总长度</P>
      <P align=justify>NFB - 段数</P>
      <P align=justify>MTU - 最大传输单元</P>
      <P align=justify>过程:</P>
      <P align=justify>IF TL &lt;= MTU THEN 将此数据报提交给下一处理阶段</P>
      <P align=justify>ELSE IF DF = 1 THEN 抛弃数据报</P>
      <P align=justify>ELSE 产生第一段:</P>
      <P align=justify>(1) 复制源internet包头; </P>
      <P align=justify>(2) OIHL &lt;- IHL;OTL &lt;- TL;OFO &lt;- FO;OMF &lt;- 
      MF;</P>
      <P align=justify>(3) NFB &lt;- (MTU-IHL*4)/8;</P>
      <P align=justify>(4) 附加第一个NFB*8个数据字节;</P>
      <P align=justify>(5) 校正包头:MF &lt;- 1;TL &lt;- (IHL*4)+(NFB*8);重新计算校验码;</P>
      <P align=justify>(6) 提交数据段到下一个数据报处理阶段;</P>
      <P align=justify>如果要产生第二个段:</P>
      <P align=justify>(7) 有选择地复制internet头;</P>
      <P align=justify>(8) 附加剩余数据;</P>
      <P align=justify>(9) 校正包头:IHL &lt;- (((OIHL*4)-(未复制的选项长度))+3)/4;</P>
      <P align=justify>TL &lt;- OTL - NFB*8 - (OIHL-IHL)*4);</P>
      <P align=justify>FO &lt;- OFO + NFB;MF &lt;- OMF;重新计算校验码; </P>
      <P align=justify>(10) 将此段提交分段检测;结束。</P>
      <P align=justify>上例中除了最后一段外,其它段都达到了MTU的大小,各种实现不同,只要能够得到的段小于等于MTU就可以了。</P>
      <P align=justify>重组过程例子</P>
      <P 
      align=justify>对于每个数据报,缓冲区标记是由源地址,目的地址,协议和标记域一起确认的。如果数据报未分段,那就不需要进行重组,处理进行下一阶段。重组需要的数据结构有:数据缓冲区,包头缓冲区,段块位表,数据长度域和计数器。段中的数据根据段偏移和长度放在相应位置,段块标准表中的相应位根据接收的段块被设置。</P>
      <P 
      align=justify>如果是第一段(段偏移为0),将包头放于包头缓冲区;如果是最后一段(多段标记为0),计算数据总长度。如果接收完了整个数据报,进行下一处理阶段;如果没有接收完,设置计数器值为当前计数器和此段中保存的生存时间之间比较在的一个,重组函数放弃控制权。如果超时释放所有缓冲区。计数器的初值是重组等待时间的下限。因为如果到达段中的生存时间大于计数器当前值等待时间增加,如果小于则不会减少。计数器的最大时间可以达到最大生存时间(大约为4.25分)。如果设置为15秒可能比较好,当然随着实践,这个值可能会有更改。这个值的选择和缓冲区的大小和传输媒介有关,传输速度乘于计数器值等于缓冲区大小。</P>
      <P align=justify>定义:</P>
      <P align=justify>FO - 段偏移</P>
      <P align=justify>IHL - Internet包头长度</P>
      <P align=justify>MF - 多段标记</P>
      <P align=justify>TTL - 生存时间</P>
      <P align=justify>NFB - 段块数</P>
      <P align=justify>TL - 总长度</P>
      <P align=justify>TDL - 总数据长度</P>
      <P align=justify>BUFID - 缓冲区标记</P>
      <P align=justify>RCVBT - 段接收位表</P>
      <P align=justify>TLB - 计数器下限</P>
      <P align=justify>过程: </P>
      <P align=center><IMG height=364 alt=过程 src="Internet协议.files/IP-7.gif" 
      width=509></P>
      <P align=justify>如果到达的数据段中的数据有部分或全部相同,上面的过程会使用数据的最新版本。</P>
      <P align=justify>标记</P>
      <P 
      align=justify>标记是为了对特定数据报的段提供唯一的标记。如果数据报拥有相同的源地址,目的地址,协议和标记,IP模块会把他们认定是同一数据报。选择的任何由发送方担任。发送协议模块需要保持一个标记表,每个目的地址保持一个表项。然而,因此标记域允许65536个不同的值,有些主机能够不考虑目的地仍然可以达到标记唯一的目的。高层协议也可以使用标记。</P>
      <P align=justify>服务类型</P>
      <P 
      align=justify>服务类型(TOS)是网络服务质量的选择。服务类型是由抽象参数确定的优先级,时延,吞吐量和可靠性的结合物。这些参数和一些实际对应的网络服务对应。对于什么是时延,什么是吞吐量之类的定义这里就不多说了。</P>
      <P align=justify>生存时间</P>
      <P 
      align=justify>生存时间由发送者设置,是数据报在网络中最长的生存时间,如果超时会抛弃数据报。网络中每个结点都会处理存在于包头中的生存时间。此域的最少减少量为1,单位是秒。因此,最长的生存时间为255秒。每个处理模块必须对TTL减1,即使所使用的时间少于一秒也是如此。高层可靠连接协议是基于原重复数据报将不会在特定时间后到达,TTL是为了满足这样假设而存在。</P>
      <P align=justify>选项</P>
      <P 
      align=justify>选项中数据报中是可选的,但在实现中必须有的。有没有选项是发送者说了算,每个IP模块必须能够分析每个选项,每个选项域有多个选项。选项可能没有达到32位的边界,不足的以零填充以达到32位的倍数。</P>
      <P align=justify>校验码</P>
      <P 
      align=justify>如果包头发生改变必须重新计算包头校验码,校验码可以在一定程度上杜绝传输错误。有些应用程序允许数据报中的数据出错,如果IP强调数据正确性,类似的应用程序也就用不成了。</P>
      <P align=justify>错误</P>
      <P align=justify>IP协议错误可由ICMP协议报告。</P>
      <P align=justify>3.3. 接口</P>
      <P 
      align=justify>接口的描述是功能性的,这个描述的具体实现机制会因为操作系统的不同而不同。不同的IP实现会有不同的用户接口。但是起码的子集是所有实现必须支持的。本节将描述这个基本子集。IP协议有上下有两个接口,一个是面向本地网络的,另一个是面向高层协议或应用程序的,我们称后一个接口为用户。虽然IP协议是数据报协议,所以用于保存状态的资源(内存)很少。</P>
      <P align=justify>下面是一个高层接口范例:</P>
      <P align=justify>SEND (src, dst, prot, TOS, TTL, BufPTR, len, Id, DF, opt 
      =&gt; result)</P>
      <P align=justify>上式中:</P>
      <P align=justify>src = 源地址</P>
      <P align=justify>dst = 目的地址</P>
      <P align=justify>prot = 协议</P>
      <P align=justify>TOS = 服务类型</P>
      <P align=justify>TTL = 生存时间</P>
      <P align=justify>BufPTR = 缓冲区指针</P>
      <P align=justify>len = 缓冲区长度</P>
      <P align=justify>Id = 标记</P>
      <P align=justify>DF = 不分段</P>
      <P align=justify>opt = 选项数据</P>
      <P align=justify>result = 响应,响应分为OK和Error两种;</P>
      <P align=justify>OK = 发送成功</P>
      <P align=justify>Error = 参数错误或本地网络错误</P>
      <P align=justify>优先级和安全性参数在选项中传送。</P>
      <P align=justify>RECV (BufPTR, prot, =&gt; result, src, dst, TOS, len, 
      opt)</P>
      <P align=justify>上式中:</P>
      <P align=justify>BufPTR = 缓冲区指针</P>
      <P align=justify>prot = 协议</P>
      <P align=justify>result = 响应,响应分为OK和Error两种;</P>
      <P align=justify>OK = 发送成功</P>
      <P align=justify>Error = 参数错误</P>
      <P align=justify>len = 缓冲区长度</P>
      <P align=justify>src = 源地址</P>
      <P align=justify>dst = 目标地址</P>
      <P align=justify>TOS = 服务类型</P>
      <P align=justify>opt = 选项数据</P>
      <P 
      align=justify>当用户发送数据报时,他执行SEND命令。IP模块在收到调用时,检查传送来的参数并准备发送数据。如果参数合法而且本地网络正常接收数据,返回成功。如果参数不合法,或本地网络未接收数据,返回不成功。在未成功时会返回报告,报告内容会因实现不同而不同。</P>
      <P 
      align=justify>当数据报到达IP模块时,要么有一个RECV调用要么没有。如果有这个调用会传送信息给用户;如果没有,通知用户信息到达。如果没有找到应该通知的用户,返回ICMP错误,抛弃数据。通知用户可以通过假中断或类似的机制,这视操作系统不同而不同。源地址包括在发送调用中,IP模块可以检查源地址是否是一个合法地址。</FONT></P></TD></TR></TBODY></TABLE></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -