《TCP/IP详解-卷1》 要点笔记(1)

      访问: 2,774 次      评论    

  1. <p>以太网帧的封装格式:</p>
  2. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  3. <p>帧头8个字节(目的地址、源地址、类型)、数据(46-1500字节,1500即MTU)、帧尾4个字节(CRC校验);</p>
  4. <p>以太网规定数据部分最少为46字节,为了保证这一点,必须在不足的空间插入填充(pad)字节。 </p>
  5. <p>一个正常的以太网帧的长度在64-1518字节之间,由头部、数据部分和帧检测序列三部分组成。</p>
  6. </ul>
  7. <p>环回接口:[图2-4 环回接口处理IP数据报的过程 ]<span style="background-color: inherit; line-height: 1.5;">图中需要指出的关键点是: </span></p>
  8. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  9. <p><span style="background-color: inherit; line-height: 1.5;">传给环回地址(一般是127.0.0.1)的任何数据均作为IP输入。 </span></p>
  10. <p><span style="background-color: inherit; line-height: 1.5;">传给广播地址或多播地址的数据报复制一份传给环回接口,然后送到以太网上。这是 </span><span style="background-color: inherit; line-height: 1.5;">因为广播传送和多播传送的定义(第12章)包含主机本身。 </span><span style="background-color: inherit; line-height: 1.5;">这是广播的一般特性:发送主机也能通过某种内部环回机制收到一份广播报文拷贝。由于术语“广播”的定义是指局域网上的所有主机,因此它必须包括发送</span><span style="background-color: inherit; line-height: 1.5;">主机在内(参见图2 - 4,当以太网驱动程序识别出目的地址是广播地址后,它就把分组送到网</span><span style="background-color: inherit; line-height: 1.5;">络上,同时传一份拷贝到环回接口)。</span></p>
  11. <p><span style="background-color: inherit; line-height: 1.5;">任何传给该主机IP地址的数据均送到环回接口。</span></p>
  12. </ul>
  13. <p>ARP:</p>
  14. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  15. <p>在ARP背后有一个基本概念,那就是网络接口有一个硬件地址(一个48 bit的值,标识不 <span style="background-color: inherit; line-height: 1.5;">同的以太网或令牌环网络接口)。在硬件层次上进行的数据帧交换必须有正确的接口地址。但</span><span style="background-color: inherit; line-height: 1.5;">是,TCP/IP有自己的地址: 32 bit的IP地址。<span style="color:#ff0000;background-color: inherit;">知道主机的IP地址并不能让内核发送一帧数据给</span></span><span style="background-color: inherit; line-height: 1.5;"><span style="color:#ff0000;background-color: inherit;">主机。</span>内核(如以太网驱动程序)必须知道目的端的硬件地址才能发送数据。ARP的功能是</span><span style="background-color: inherit; line-height: 1.5;">在32 bit的IP地址和采用不同网络技术的硬件地址之间提供动态映射。</span></p>
  16. <p><span style="background-color: inherit; line-height: 1.5;">ARP请求/应答完成前:注意,在线路上始终看不到TCP的报文段。我们能看到的是ARP请求。直到ARP回答返回 </span><span style="background-color: inherit; line-height: 1.5;">时,TCP报文段才可以被发送,因为硬件地址到这时才可能知道。如果我们用过滤模式运行</span><span style="background-color: inherit; line-height: 1.5;">tcpdump命令,只查看TCP数据,那么将没有任何输出。</span></p>
  17. <p><span style="background-color: inherit; line-height: 1.5;">ff:ff:ff:ff:ff:ff,这是一个以太网广播地址。尽管ARP请求是广播的,但是ARP应答是直接送到请求端主机的,而不是广播的。</span></p>
  18. <p><span style="background-color: inherit; line-height: 1.5;">一般情况下,当系统收到ARP请求或发送ARP应答时,都要把请求端的硬件地址和IP地 </span><span style="background-color: inherit; line-height: 1.5;">址存入ARP高速缓存。</span></p>
  19. </ul>
  20. <p><span style="color:#ff0000;background-color: inherit; line-height: 1.5;">免费ARP(gratuitous ARP)</span><span style="background-color: inherit; line-height: 1.5;">:它是指主机发送ARP查 </span><span style="background-color: inherit; line-height: 1.5;">找自己的IP地址。通常,它发生在系统引导期间进行接口配置的时候(检测IP地址是否冲突)。</span><span style="background-color: inherit; line-height: 1.5;">免费ARP可以有两个方面的作用:</span></p>
  21. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  22. <p><span style="background-color: inherit; line-height: 1.5;">1) 一个主机可以通过它来确定另一个主机是否设置了相同的IP地址(检测IP冲突)。</span></p>
  23. <p><span style="background-color: inherit; line-height: 1.5;">2)如果发送免费ARP的主机正好改变了硬件地址(很可能是主机关机了,并换了一块接 </span><span style="background-color: inherit; line-height: 1.5;">口卡,然后重新启动),那么这个分组就可以使其他主机高速缓存中旧的硬件地址进行相应的</span><span style="background-color: inherit; line-height: 1.5;">更新。一个比较著名的ARP协议事实[Plummer 1982]是,如果主机收到某个IP地址的ARP请求, </span><span style="background-color: inherit; line-height: 1.5;">而且它已经在接收者的高速缓存中,那么就要用ARP请求中的发送端硬件地址(如以太网地</span><span style="background-color: inherit; line-height: 1.5;">址)对高速缓存中相应的内容进行更新。主机接收到任何ARP请求都要完成这个操作( ARP</span><span style="background-color: inherit; line-height: 1.5;">请求是在网上广播的,因此每次发送ARP请求时网络上的所有主机都要这样做)。</span></p>
  24. </ul><!--more-->
  25. <p>ARP代理 :</p>
  26. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  27. <p><span style="background-color: inherit; line-height: 1.5;">如果ARP请求是从一个网络的主机发往另一个网络上的主机,那么连接这两个网络的路</span><span style="background-color: inherit; line-height: 1.5;">由器就可以回答该请求,这个过程称作委托ARP或ARP代理(Proxy ARP)。</span></p>
  28. <p><span style="background-color: inherit; line-height: 1.5;">这样可以欺骗发起</span><span style="background-color: inherit; line-height: 1.5;">ARP请求的发送端,使它误以为路由器就是目的主机,而事实上目的主机是在路由器的“另</span><span style="background-color: inherit; line-height: 1.5;">一边”。</span></p>
  29. <p><span style="background-color: inherit; line-height: 1.5;">路由器的功能相当于目的主机的代理,把分组从其他主机转发给它。</span></p>
  30. </ul>
  31. <p>RARP:</p>
  32. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  33. <p>无盘工作站获取自身的IP地址(不含掩码);</p>
  34. <p>ICMP地址掩码请求:无盘系统在引导过程中获取自己的子网掩码;</p>
  35. <p>BOOTP:无盘系统在引导过程中获取自己的子网掩码的另一个方法是BOOTP协议;</p>
  36. </ul>
  37. <p><span style="color:#ff0000;background-color: inherit;">以太网帧的最小长度是64字节,最大长度是1518字节:</span></p>
  38. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  39. <p><span style="line-height: 1.5;">在图5-1中 </span><span style="line-height: 1.5;">需要指出的另一点是,第2行中的以太网数据帧长度比最小长度还要小(在4.5节中我们说过应该</span><span style="line-height: 1.5;">是60字节——不包含4字节帧尾)。其<span style="color:#0070c0;background-color: inherit;">原因是我们在发送该以太网数据帧的系统(bsdi)上运行tcpdump命令</span>。应用程</span><span style="line-height: 1.5;">序rarpd写42字节到BSD分组过滤设备上(其中14字节为以太网数据帧的报头,剩下的28字节是</span><span style="line-height: 1.5;">RARP应答),这就是tcpdump收到的副本。但是以太网设备驱动程序要把这一短帧填充空白字</span><span style="line-height: 1.5;">符以达到最小传输长度(60)。<span style="color:#0070c0;background-color: inherit;">如果我们在另一个系统上运行tcpdump命令,其长度将会是60</span>。</span></p>
  40. </ul>
  41. <p>这里需要注意的另一点是TFTP客户程序所采用的不太好的超时重传算法:</p>
  42. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  43. <p>它只是假定5 <span style="line-height: 1.5;">秒是足够的,因此每隔5秒就重传一次,总共需要25秒钟的时间。</span></p>
  44. <p><span style="line-height: 1.5;">在后面我们将看到TCP有一</span><span style="line-height: 1.5;">个较好的超时重发算法。</span></p>
  45. <p><span style="line-height: 1.5;">TFTP客户程序所采用的超时重传算法已被RFC所禁用。不过,在作者所在子网上</span><span style="line-height: 1.5;">的三个系统以及Solaris 2.2仍然在使用它。</span></p>
  46. <p><span style="line-height: 1.5;">AIX 3.2.2采用一种指数退避方法来设置超时</span><span style="line-height: 1.5;">值,分别在0、5、15和35秒时重发报文,这正是所推荐的方法。</span></p>
  47. </ul>
  48. <p><span style="line-height: 1.5;">ICMP:</span></p>
  49. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  50. <p><span style="line-height: 1.5;">当发送一份ICMP差错报文时,报文始终包含IP的首部和产生ICMP差错报文的IP数据报的 </span><span style="line-height: 1.5;">前8个字节。这样,接收ICMP差错报文的模块就会把它与某个特定的协议(根据IP数据报首部中的协议字段来判断)和用户进程(根据包含在IP数据报前8个字节中的TCP或UDP报文首 </span><span style="line-height: 1.5;">部中的TCP或UDP端口号来判断)联系起来。</span></p>
  51. <p><span style="line-height: 1.5;">ICMP不可达差错:ICMP端口不可达差错,一种常见的ICMP差错。对返回的ICMP差错信息进 </span><span style="line-height: 1.5;">行了分析:导致差错的IP数据报的首部及后续8个字节。这个信息对于ICMP差错的接收方来 </span><span style="line-height: 1.5;">说是必要的,可以更多地了解导致差错的原因。这是因为TCP和UDP都在它们的首部前8个字</span><span style="line-height: 1.5;">节中存入源端口号和目的端口号。</span></p>
  52. <p><span style="line-height: 1.5;">ICMP地址掩码请求与应答:<span style="color:#ff0000;background-color: inherit;">广播的一般特性:发送主机也能通过某种内部环回机制收到一 </span></span><span style="line-height: 1.5;"><span style="color:#ff0000;background-color: inherit;">份广播报文拷贝</span>。由于术语“广播”的定义是指局域网上的所有主机,因此它必须包括发送主机在内(参见图2 - 4,当以太网驱动程序识别出目的地址是广播地址后,它就把分组送到网 </span><span style="line-height: 1.5;">络上,同时传一份拷贝到环回接口)。</span></p>
  53. </ul>
  54. <p><span style="line-height: 1.5;">ICMP:不会导致产生ICMP差错报文的情况:(防止ICMP差错报文对广播分组响应所带来的广播风暴)</span></p>
  55. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  56. <p><span style="line-height: 1.5;">在对ICMP差错报文进行响应时,不会生成另一份ICMP差错报文(防止循环) </span></p>
  57. <p><span style="line-height: 1.5;">目的地址是广播地址或多播地址的IP数据报 </span></p>
  58. <p><span style="line-height: 1.5;">作为链路层广播的数据报 </span></p>
  59. <p><span style="line-height: 1.5;">不是IP分片的第一片 </span></p>
  60. <p><span style="line-height: 1.5;">源地址不是单个主机的数据报(源地址不能为零地址、环回地址、广播地址或多播地址)</span></p>
  61. </ul>
  62. <p><span style="line-height: 1.5;">Ping:</span></p>
  63. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  64. <p><span style="line-height: 1.5;">ping程序通过在ICMP报文数据中存放发送请求的时间值来计算往返时间。当应答返回</span><span style="line-height: 1.5;">时,用当前时间减去存放在ICMP报文中的时间值,即是往返时间。</span></p>
  65. <p><span style="line-height: 1.5;">Unix系统在实现ping程序时是把ICMP报文中的标识符字段置成发送进程的ID号。这样 </span><span style="line-height: 1.5;">即使在同一台主机上同时运行了多个ping程序实例, ping程序也可以识别出返回的信息。</span></p>
  66. <p><span style="line-height: 1.5;">注:在Linux系统上抓包测试ping,发现identifier不是进程ID号。</span></p>
  67. </ul>
  68. <p><span style="line-height: 1.5;">Traceroute:</span></p>
  69. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  70. <p>UDP的规则之一是,如果收到一份UDP数据报而目的端口与某个正在使用的进程不相符, 那么UDP返回一个ICMP不可达报文。Traceroute程序所要做的就是区分接收到的ICMP报文是超时还是端口不可达,以判断什么时候结束。</p>
  71. <p><span style="line-height: 1.5;">当路由器收到一份IP数据报,如果其TTL字段是0或1,则路由器不转发该数据报(接收到 </span><span style="line-height: 1.5;">这种数据报的目的主机可以将它交给应用程序,这是因为不需要转发该数据报。但是在通常</span><span style="line-height: 1.5;">情况下,系统不应该接收TTL字段为0的数据报)。相反,路由器将该数据报丢弃,并给信源 </span><span style="line-height: 1.5;">机发一份ICMP“超时”信息。</span></p>
  72. <p><span style="line-height: 1.5;">返回的ICMP报文中的信源IP地址是UDP数据报到达的路由器接口的IP地址。这与 </span><span style="line-height: 1.5;">IP记录路由选项( 7.3节)不同,记录的IP地址指的是发送接口地址。</span></p>
  73. <p><span style="line-height: 1.5;">Traceroute RTT往返时延计算:往返时间是由发送主机的traceroute程序计算的。它是指从traceroute程序到该路</span><span style="line-height: 1.5;">由器的总往返时间。</span></p>
  74. <p><span style="line-height: 1.5;">Traceroute程序将其发送的UDP数据报</span><span style="line-height: 1.5;">的源端口号设置为Unix进程号与32768之间的逻辑或值。对于在同一台主机上多次运行 </span><span style="line-height: 1.5;">traceroute程序的情况,每个进程都查看ICMP返回的UDP首部的源端口号,并且只处理那</span><span style="line-height: 1.5;">些对自己发送应答的报文。</span></p>
  75. </ul>
  76. <p><span style="line-height: 1.5;">IP选路:对于一个给定的路由器,可以打印出五种不同的标志(flag):</span></p>
  77. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  78. <p><span style="line-height: 1.5;">U 该路由可以使用。</span></p>
  79. <p><span style="line-height: 1.5;">G 该路由是到一个网关(路由器)。如果没有设置该标志,说明目的地是直接相连的。</span></p>
  80. <p><span style="line-height: 1.5;">H 该路由是到一个主机,也就是说,目的地址是一个完整的主机地址。如果没有设置该 </span><span style="line-height: 1.5;">标志,说明该路由是到一个网络,而目的地址是一个网络地址:一个网络号,或者网</span><span style="line-height: 1.5;">络号与子网号的组合。 </span></p>
  81. <p><span style="line-height: 1.5;">D 该路由是由重定向报文创建的( 9 . 5节)。</span></p>
  82. <p><span style="line-height: 1.5;">M 该路由已被重定向报文修改( 9 . 5节)。</span></p>
  83. </ul>
  84. <p>RIP路由协议:RIP报文包含中在UDP数据报中;RIP常用的UDP端口号是520。</p>
  85. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  86. <p>定期选路更新:每过30秒,所有或部分路由器会将其完整路由表发送给相邻路由器。发 <span style="background-color: inherit; line-height: 1.5;">送路由表可以是广播形式的(如在以太网上),或是发送给点对点链路的其他终点的。 </span></p>
  87. <p>触发更新:每当一条路由的度量发生变化时,就对它进行更新。不需要发送完整路由表, <span style="background-color: inherit; line-height: 1.5;">而只需要发送那些发生变化的表项。 </span></p>
  88. <p>每条路由都有与之相关的定时器:如果运行RIP的系统发现一条路由在3分钟内未更新, <span style="background-color: inherit; line-height: 1.5;">就将该路由的度量设置成无穷大(16),并标注为删除。这意味着已经在6个30秒更新时间里</span><span style="background-color: inherit; line-height: 1.5;">没收到通告该路由的路由器的更新了。再过60秒,将从本地路由表中删除该路由,以保证该</span><span style="background-color: inherit; line-height: 1.5;">路由的失效已被传播开。</span></p>
  89. </ul>
  90. <p>RIP度量:</p>
  91. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  92. <p><span style="background-color: inherit; line-height: 1.5;">RIP所使用的度量是以跳( hop )计算的。所有直接连接接口的跳数为1。</span></p>
  93. <p><span style="background-color: inherit; line-height: 1.5;">如果相邻路由器通告它与其他网络路 </span><span style="background-color: inherit; line-height: 1.5;">由的跳数为1,那么我们与那个网络的度量就是2,这是因为为了发送报文到该网络,我们必</span><span style="background-color: inherit; line-height: 1.5;">须经过那个路由器。</span></p>
  94. <p><span style="background-color: inherit; line-height: 1.5;">如果在该AS内从一个路由器到一个网络有多条路由,那么路由器将选择跳数最 </span><span style="background-color: inherit; line-height: 1.5;">小的路由,而忽略其他路由。 </span></p>
  95. <p><span style="background-color: inherit; line-height: 1.5;">跳数的最大值是15,这意味着RIP只能用在主机间最大跳数值为15的AS内。度量为16表 </span><span style="background-color: inherit; line-height: 1.5;">示到无路由到达该IP地址。</span></p>
  96. </ul>
  97. <p>RIP的缺陷:<span style="background-color: inherit; line-height: 1.5;">它有一些缺陷。</span></p>
  98. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  99. <p><span style="background-color: inherit; line-height: 1.5;">首先, RIP没有子网地址的概念;</span></p>
  100. <p><span style="background-color: inherit; line-height: 1.5;">其次,在路由器或链路发生故障后,需要很长的一段时间才能稳定下来。这段时间通常 </span><span style="background-color: inherit; line-height: 1.5;">需要几分钟。在这段建立时间里,可能会发生路由环路。</span></p>
  101. <p><span style="background-color: inherit; line-height: 1.5;">采用跳数作为路由度量忽略了其他一些应该考虑的因素。同时,度量最大值为15则限制 </span><span style="background-color: inherit; line-height: 1.5;">了可以使用RIP的网络的大小。</span></p>
  102. <p><span style="background-color: inherit; line-height: 1.5;">第2 </span><span style="background-color: inherit; line-height: 1.5;">版RIP是其最近的一个改进版,它支持子网,还有一些其他改进技术。称为RIPv2。</span></p>
  103. </ul>
  104. <p>OSPF路由协议:与采用距离向量的RIP协议不同的是, OSPF是一个链路状态协议。</p>
  105. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  106. <p><span style="background-color: inherit; line-height: 1.5;">OSPF与RIP(以及其他选路协议)的不同点在于, OSPF直接使用IP。也就是说,它并不 </span><span style="background-color: inherit; line-height: 1.5;">使用UDP或TCP。对于IP首部的protocol字段,OSPF有其自己的值(图3 - 1);</span></p>
  107. <p><span style="background-color: inherit; line-height: 1.5;">当对同一个目的地址存在着多个相同费用的路由时,OSPF在这些路由上平均分配流量。 </span><span style="background-color: inherit; line-height: 1.5;">我们称之为流量平衡。</span></p>
  108. <p><span style="background-color: inherit; line-height: 1.5;">OSPF支持子网:子网掩码与每个通告路由相连。到一个主机的路由是通过全1子网掩码进行通告的。默认路由是以IP地址为0.0.0.0、网络掩码 </span><span style="background-color: inherit; line-height: 1.5;">为全0进行通告的。</span></p>
  109. <p><span style="background-color: inherit; line-height: 1.5;">OSPF采用多播(第12章),而不是广播形式,以减少不参与OSPF的系统负载。</span></p>
  110. </ul>
  111. <p>BGP协议:BGP是一种不同自治系统的路由器之间进行通信的外部网关协议。1993年开发第4版的BGP(见RFC 1467 [Topolcic <span style="background-color: inherit; line-height: 1.5;">1993]),以支持我们将在10.8节描述的CIDR。</span></p>
  112. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  113. <p>BGP允许使用基于策略的选路。由自治系统管理员制订策略,选路策略与政治、安全或经济因素有关。</p>
  114. <p>BGP与RIP和OSPF的不同之处在于BGP使用TCP作为其传输层协议;</p>
  115. <p>BGP是一个距离向量协议,但是与(通告到目的地址跳数的) RIP不同的是,BGP列举了 <span style="background-color: inherit; line-height: 1.5;">到每个目的地址的路由(自治系统到达目的地址的序列号)</span></p>
  116. <p>BGP通过定期发送keepalive报文给其邻站来检测TCP连接对端的链路或主机失败。两个报 <span style="background-color: inherit; line-height: 1.5;">文之间的时间间隔建议值为30秒。应用层的keepalive报文与TCP的keepalive选项(第23章) </span><span style="background-color: inherit; line-height: 1.5;">是独立的。</span></p>
  117. </ul>
  118. <p>CIDR:无类型域间选路。无类型域间选路( CIDR) <span style="background-color: inherit; line-height: 1.5;">是一个防止Internet路由表膨胀的方法,它也称为超网( supernetting)。可以减小Internet路由表的大 </span><span style="background-color: inherit; line-height: 1.5;">小。</span></p>
  119. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  120. <p><span style="background-color: inherit; line-height: 1.5;">CIDR的基本观点是采用一种分配多个IP地址的方式,使其能够将路由表中的许多表项总 </span><span style="background-color: inherit; line-height: 1.5;">和( summarization )成更少的数目;</span><span style="background-color: inherit; line-height: 1.5;">要使用这种总和,必须满足以下三种特性: </span></p>
  121. <p><span style="background-color: inherit; line-height: 1.5;">1) 为进行选路要对多个I P地址进行总和时,这些I P地址必须具有相同的高位地址比特。</span></p>
  122. <p><span style="background-color: inherit; line-height: 1.5;">2) 路由表和选路算法必须扩展成根据32 bit IP地址和32 bit掩码做出选路决策。</span></p>
  123. <p><span style="background-color: inherit; line-height: 1.5;">3) 必须扩展选路协议使其除了32 bit地址外,还要有32 bit掩码。OSPF(10.6节)和RIP-2 </span><span style="background-color: inherit; line-height: 1.5;">(10.5节)都能够携带第4版BGP所提出的32 bit掩码。</span></p>
  124. <p><span style="background-color: inherit; line-height: 1.5;">“无类型”的意思是现在的选路决策是基于整个32 bit IP地址的掩码操作,而不管其IP地 </span><span style="background-color: inherit; line-height: 1.5;">址是A类、B类或是C类,都没有什么区别。</span></p>
  125. </ul>
  126. <p>MTU<span style="background-color: inherit; line-height: 1.5;"><span style="color:#ff0000;background-color: inherit;">(Maximum Transmission Unit</span>):正如在图2-1看到的那样,以太网和802.3对帧的长度都有一个限制,其<span style="line-height: 1.5;">数据部分(用于承载上层协议的地方也就是Data域)的</span>最大值分别是</span><span style="background-color: inherit; line-height: 1.5;">1500和1492字节。链路层的这个特性称作</span><span style="background-color: inherit; line-height: 1.5;">MTU,最大传输单元。</span>

    </p>
  127. <p>IP分片:正如我们在2.8节描述的那样,物理网络层一般要限制每次发送数据帧的最大长度。</p>
  128. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  129. <p><span style="background-color: inherit; line-height: 1.5;">任何</span><span style="background-color: inherit; line-height: 1.5;">时候IP层接收到一份要发送的IP数据报时,它要判断向本地哪个接口发送数据(选路),并查</span><span style="background-color: inherit; line-height: 1.5;">询该接口获得其MTU。IP把MTU与数据报长度进行比较,如果需要则进行分片。分片可以发</span><span style="background-color: inherit; line-height: 1.5;">生在原始发送端主机上,也可以发生在中间路由器上。</span></p>
  130. <p><span style="background-color: inherit; line-height: 1.5;">当IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,并在选择路由时与 </span><span style="background-color: inherit; line-height: 1.5;">其他分组独立。这样,当数据报的这些片到达目的端时有可能会失序,但是在IP首部中有足</span><span style="background-color: inherit; line-height: 1.5;">够的信息让接收端能正确组装这些数据报片。</span></p>
  131. <p><span style="background-color: inherit; line-height: 1.5;">需要重申的是,任</span><span style="background-color: inherit; line-height: 1.5;">何运输层首部只出现在第1片数据中(如端口号在UDP首部,只能在第1片中被发现)。</span></p>
  132. <p><span style="background-color: inherit; line-height: 1.5;">最后,标志字段中有一个比特称作“不分片”位。如果将这一比特置1,IP将不对数据报 </span><span style="background-color: inherit; line-height: 1.5;">进行分片。相反把数据报丢弃并发送一个ICMP差错报文(“需要进行分片但设置了不分片比</span><span style="background-color: inherit; line-height: 1.5;">特”,见图6 - 3)给起始端。</span></p>
  133. </ul>
  134. <p><span style="color:#ff0000;background-color: inherit;">IP分片重组:</span><span style="line-height: 1.5;">回忆IP首部(图3 - 1),下面这些字段用于分片过程。</span></p>
  135. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  136. <p><span style="background-color: inherit; line-height: 1.5;">对于发送端发送的每份IP数据报来说, </span><span style="background-color: inherit; line-height: 1.5;">其标识(Identification)字段都包含一个唯一值。该值在数据报分片时被复制到每个片中(我们现在已经看到</span><span style="background-color: inherit; line-height: 1.5;">这个字段的用途)。</span></p>
  137. <p><span style="background-color: inherit; line-height: 1.5;">标志(flags)字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每</span><span style="background-color: inherit; line-height: 1.5;">个组成数据报的片都要把该比特置1。</span></p>
  138. <p><span style="background-color: inherit; line-height: 1.5;">片偏移(fragment offset)字段指的是该片偏移原始数据报开始处的位置。 </span><span style="background-color: inherit; line-height: 1.5;">另外,当数据报被分片后,每个片的总长度值(total length)要改为该片的长度值。</span></p>
  139. </ul>
  140. <p>广播和多播</p>
  141. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  142. <p><span style="background-color: inherit; line-height: 1.5;">广播和多播仅应用于UDP,它们对需将报文同时传往多个接收者的应用来说十分重要。</span></p>
  143. <p><span style="background-color: inherit; line-height: 1.5;">有时一个主机要向网上的所有其他主机发送帧, </span><span style="background-color: inherit; line-height: 1.5;">这就是广播。通过ARP和RARP可以看到这一过程。多播 </span><span style="background-color: inherit; line-height: 1.5;">(multicast) 处于单播和广播之间:帧仅传送给属于多播组的</span><span style="background-color: inherit; line-height: 1.5;">多个主机。</span></p>
  144. <p><span style="background-color: inherit; line-height: 1.5;">对于以太网,当地址中 </span><span style="background-color: inherit; line-height: 1.5;">最高字节的最低位设置为1时表示该地址是一个多播地址, </span><span style="background-color: inherit; line-height: 1.5;">用十六进制可表示为01:00:00:00:00:00(以太网广播地址</span><span style="background-color: inherit; line-height: 1.5;">ff:ff:ff:ff:ff:ff可看作是以太网多播地址的特例)。</span></p>
  145. <p><span style="background-color: inherit; line-height: 1.5;">多播是一种将报文发往多个接收者的通信方式。在许多应用中,它比广播更好,因为多 </span><span style="background-color: inherit; line-height: 1.5;">播降低了不参与通信的主机的负担。简单的主机成员报告协议(IGMP)是多播的基本模块。</span></p>
  146. </ul>
  147. <p>广播地址:</p>
  148. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  149. <p><span style="background-color: inherit; line-height: 1.5;">受限的广播:受限的广播地址是255.255.255.255。该地址用于主机配置过程中IP数据报的目的地址, </span><span style="background-color: inherit; line-height: 1.5;">此时,主机可能还不知道它所在网络的网络掩码,甚至连它的IP地址也不知道。在任何情况下,路由器都不转发目的地址为受限的广播地址的数据报,这样的数据报仅 </span><span style="background-color: inherit; line-height: 1.5;">出现在本地网络中。</span></p>
  150. <p><span style="background-color: inherit; line-height: 1.5;">指向网络的广播:指向网络的广播地址是主机号为全1的地址。A类网络广播地址为netid.255.255.255,其中 </span><span style="background-color: inherit; line-height: 1.5;">netid为A类网络的网络号。一个路由器必须转发指向网络的广播,但它也必须有一个不进行转发的选择。</span></p>
  151. <p><span style="background-color: inherit; line-height: 1.5;">指向子网的广播:指向子网的广播地址为主机号为全1且有特定子网号的地址。</span><span style="background-color: inherit; line-height: 1.5;">指向所有子网的广播:指向所有子网的广播也需要了解目的网络的子网掩码,以便与指向网络的广播地址区分</span><span style="background-color: inherit; line-height: 1.5;">开。指向所有子网的广播地址的子网号及主机号为全1。例如,如果目的子网掩码为</span><span style="background-color: inherit; line-height: 1.5;">255.255.255.0,那么IP地址128.1.255.255是一个指向所有子网的广播地址。然而,如果网络</span><span style="background-color: inherit; line-height: 1.5;">没有划分子网,这就是一个指向网络的广播。</span></p>
  152. </ul>
  153. <p>多播地址:</p>
  154. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  155. <p><span style="background-color: inherit; line-height: 1.5;">知名多播地址:224.0.0.1代表“该子网内的所有系统组”,224.0.0.2代表“该子网内的所有路由器 </span><span style="background-color: inherit; line-height: 1.5;">组”。多播地址224.0.1.1用作网络时间协议NTP,224.0.0.9用作RIP-2 (见10.5节),224.0.1.2用</span><span style="background-color: inherit; line-height: 1.5;">作SGI公司的dogfight应用。</span></p>
  156. <p><span style="background-color: inherit; line-height: 1.5;">对于以太网,当地址中 </span><span style="background-color: inherit; line-height: 1.5;">最高字节的最低位设置为1时表示该地址是一个多播地址, </span><span style="background-color: inherit; line-height: 1.5;">用十六进制可表示为01:00:00:00:00:00(以太网广播地址</span><span style="background-color: inherit; line-height: 1.5;">ff:ff:ff:ff:ff:ff可看作是以太网多播地址的特例)。</span></p>
  157. <p><span style="background-color: inherit; line-height: 1.5;">为了指明一个多播地址,任何一个以太网地址的首字节必须是01,这意味着与IP多播 </span><span style="background-color: inherit; line-height: 1.5;">相对应的以太网地址范围从01:00:5e:00:00:00到01:00:5e:7f:ff:ff。</span></p>
  158. </ul>
  159. <p>IGMP协议:用于支持主机和路由器进行多播的 <span style="background-color: inherit; line-height: 1.5;">Internet组管理协议(IGMP)。它让一个物理网络上的所</span><span style="background-color: inherit; line-height: 1.5;">有系统知道主机当前所在的多播组。多播路由器需要这</span><span style="background-color: inherit; line-height: 1.5;">些信息以便知道多播数据报应该向哪些接口转发。</span></p>
  160. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  161. <p><span style="background-color: inherit; line-height: 1.5;">路由器的IGMP查询被送到目的IP地址224.0.0.1。该地址被称为 </span><span style="background-color: inherit; line-height: 1.5;">所有主机组地址。它涉及在一个物理网络中的所有具备多播能力的主机和路由器。</span></p>
  162. <p><span style="background-color: inherit; line-height: 1.5;">一个多</span><span style="background-color: inherit; line-height: 1.5;">播路由器甚至不关心哪个主机属于一个多播组。它仅仅想知道在给定的接口上的多播组中是</span><span style="background-color: inherit; line-height: 1.5;">否还至少有一个主机。</span></p>
  163. </ul>
  164. <p><span style="color:#ff0000;background-color: inherit;">帧的过滤过程:</span>为了弄清广播和多播,需要了解主机对由信道传送过 <span style="background-color: inherit; line-height: 1.5;">来帧的过滤过程。图12-1说明了这一过程。 </span></p>
  165. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  166. <p>首先,网卡查看由信道传送过来的帧,确定是否接收<span style="background-color: inherit; line-height: 1.5;">该帧,若接收后就将它传往设备驱动程序。通常网卡仅接</span><span style="background-color: inherit; line-height: 1.5;">收那些目的地址为网卡物理地址或广播地址的帧。另外,</span><span style="background-color: inherit; line-height: 1.5;">多数接口均被设置为混合模式,这种模式能接收每个帧的</span><span style="background-color: inherit; line-height: 1.5;">一个复制。作为一个例子, tcpdump使用这种模式。 </span></p>
  167. <p><span style="background-color: inherit; line-height: 1.5;">目前,大多数的网卡经过配置都能接收目的地址为多</span><span style="background-color: inherit; line-height: 1.5;">播地址或某些子网多播地址的帧。对于以太网,当地址中</span><span style="background-color: inherit; line-height: 1.5;">最高字节的最低位设置为1时表示该地址是一个多播地址,</span><span style="background-color: inherit; line-height: 1.5;">用十六进制可表示为01:00:00:00:00:00(以太网广播地址</span><span style="background-color: inherit; line-height: 1.5;">ff:ff:ff:ff:ff:ff可看作是以太网多播地址的特例)。 </span></p>
  168. <p><span style="background-color: inherit; line-height: 1.5;">如果网卡收到一个帧,这个帧将被传送给设备驱动程序(如果帧检验和错,网卡将丢弃</span><span style="background-color: inherit; line-height: 1.5;">该帧)。设备驱动程序将进行另外的帧过滤。首先,帧类型中必须指定要使用的协议( IP、</span><span style="background-color: inherit; line-height: 1.5;">ARP等等)。其次,进行多播过滤来检测该主机是否属于多播地址说明的多播组。</span></p>
  169. <p><span style="background-color: inherit; line-height: 1.5;">设备驱动程序随后将数据帧传送给下一层,比如,当帧类型指定为IP数据报时,就传往</span><span style="background-color: inherit; line-height: 1.5;">IP层。IP根据IP地址中的源地址和目的地址进行更多的过滤检测。如果正常,就将数据报传送</span><span style="background-color: inherit; line-height: 1.5;">给下一层(如TCP或UDP)。</span></p>
  170. <p><span style="background-color: inherit; line-height: 1.5;">每次UDP收到由IP传送来的数据报,就根据目的端口号,有时还有源端口号进行数据报过滤。如果当前没有进程使用该目的端口号,就丢弃该数据报并产生一个ICMP不可达报文</span><span style="background-color: inherit; line-height: 1.5;">(TCP根据它的端口号作相似的过滤)。如果UDP数据报存在检验和错,将被丢弃。</span></p>
  171. </ul>
  172. <p>TFTP:TFTP是一个简单的协议,适合于只读存储器,仅用于无盘系统进行系统引导。它只使用 <span style="background-color: inherit; line-height: 1.5;">几种报文格式,是一种<span style="color:#ff0000;background-color: inherit;">停止等待协议</span>。<span style="line-height: 1.5;">数据发送方在发送下一个数据块之前需要<span style="background-color: inherit;"> </span></span><span style="line-height: 1.5;">等待接收方对已发送数据的确认。</span></span></p>
<p><br/></p>

添加新评论