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

      访问: 2,512 次      评论    

  1. <p>长肥管道( Long Fat Network ,即LFN,发音为 <span style="background-color: inherit; line-height: 1.5;">“elefan(t)s”):</span></p>
  2. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  3. <p><span style="background-color: inherit; line-height: 1.5;">在20.7节,我们把一个连接的容量表示为 </span><span style="background-color: inherit; line-height: 1.5;">capacity(b) = bandwidth (b/s) × round-trip time(s) </span><span style="background-color: inherit; line-height: 1.5;">并称之为带宽时延乘积。也可称它为两端的管道大小。 </span></p>
  4. <p><span style="background-color: inherit; line-height: 1.5;">当这个乘积变得越来越大时, TCP的某些局限性就会暴露出来。</span></p>
  5. <p><span style="background-color: inherit; line-height: 1.5;">具有大的带宽时延乘积的网络被称为长肥网络( Long Fat Network ,即LFN,发音为 </span><span style="background-color: inherit; line-height: 1.5;">“elefan(t)s”),而一个运行在LFN上的TCP连接被称为长肥管道。</span><span style="line-height: 1.5;"></span></p>
  6. </ul>
  7. <p>使<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;">1) TCP首部中窗口大小为16 bit,从而将窗口限制在65535个字节内。但是从图24-5的最</span><span style="background-color: inherit; line-height: 1.5;">后一列可以看到,现有的网络需要一个更大的窗口来提供最大的吞吐量。在24.4节介</span><span style="background-color: inherit; line-height: 1.5;">绍的窗口扩大选项可以解决这个问题。 </span></p>
  10. <p><span style="background-color: inherit; line-height: 1.5;">2) 在一个长肥网络LFN内的分组丢失会使吞吐量急剧减少。如果只有一个报文段丢失, </span><span style="background-color: inherit; line-height: 1.5;">我们需要利用21.7节介绍的快速重传和快速恢复算法来使管道避免耗尽。但是即使使</span><span style="background-color: inherit; line-height: 1.5;">用这些算法,在一个窗口内发生的多个分组丢失也会典型地使管道耗尽(如果管道耗</span><span style="background-color: inherit; line-height: 1.5;">尽了,慢启动会使它渐渐填满,但这个过程将需要经过多个RTT)。 </span><span style="background-color: inherit; line-height: 1.5;">在RFC 1072 [Jacobson and Braden 1988]中<span style="color:#ff0000;background-color: inherit;">建议使用有选择的确认(SACK)来处理在</span></span><span style="background-color: inherit; line-height: 1.5;"><span style="color:#ff0000;background-color: inherit;">一个窗口发生的多个分组丢失</span>。</span></p>
  11. <p><span style="background-color: inherit; line-height: 1.5;">3) 我们在第21.4节看到许多TCP实现对每个窗口的RTT仅进行一次测量。它们并不对每个 </span><span style="background-color: inherit; line-height: 1.5;">报文段进行RTT测量。在一个长肥网络LFN上需要更好的RTT测量机制。我们将在24.5 </span><span style="background-color: inherit; line-height: 1.5;">节介绍时间戳选项,它允许更多的报文段被计时,包括重传。</span></p>
  12. <p><span style="background-color: inherit; line-height: 1.5;">4) TCP对每个字节数据使用一个<span style="color:#ff0000;background-color: inherit;">32 bit无符号的序号</span>来进行标识。如一个 </span><span style="background-color: inherit; line-height: 1.5;">相同序号N在MSL期间是否被重用的问题,也就是说,网络是否足够快以至于在不到 </span><span style="background-color: inherit; line-height: 1.5;">一个MSL的时候序号就发生了回绕。由于序号空间是有限的,在 </span><span style="background-color: inherit; line-height: 1.5;">已经传输了4 294 967 296个字节以后序号会被重用。FDDI(100 Mb/s)这个时间为5分钟,而一个千</span><span style="background-color: inherit; line-height: 1.5;">兆比网络(1000 Mb/s)则为34秒。在24.6节,我们将介绍一种对付这种情况的办法:使用TCP的时间戳选项的PAWS </span><span style="background-color: inherit; line-height: 1.5;">(Protection Against Wrapped Sequence numbers)算法(保护回绕的序号)。</span></p>
  13. </ul>
  14. <p><span style="background-color: inherit; line-height: 1.5;">TCP选项:</span></p>
  15. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  16. <p><br/></p>
  17. <p><span style="background-color: inherit; line-height: 1.5;">每个选项的开始是1字节kind字段,说明选项的类型。kind字段为0和1的选项仅占1个字节。 </span></p>
  18. <p><span style="background-color: inherit; line-height: 1.5;">其他的选项在kind字节后还有len字节。它说明的长度是指总长度,包括kind字节和len字节。 </span></p>
  19. <p><span style="background-color: inherit; line-height: 1.5;"><span style="color:#ff0000;background-color: inherit;">设置无操作选项的原因在于允许发方填充字段为4字节的倍数。</span>(因为TCP首部有一个“Header Length首部长度”字段 :首部中32 bit字的数目。)</span></p>
  20. </ul><!--more-->
  21. <p><span style="line-height: 1.5;"><span style="color:#ff0000;background-color: inherit;">MSS(Maximum Segment Size)</span>:最大报文段长度(MSS)表示TCP传往另一端的最大块<span style="color:#ff0000;background-color: inherit;">数据的长度</span>。</span></p>
  22. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  23. <p><span style="line-height: 1.5;">当一个连接建立时, </span><span style="line-height: 1.5;">连接的双方都要通告各自的MSS。</span></p>
  24. <p><span style="line-height: 1.5;">当TCP发送一个SYN时,或者是因为一个本地应用进程想发起一个连接,或 </span><span style="line-height: 1.5;">者是因为另一端的主机收到了一个连接请求,它能将MSS值设置为外出接口上的MTU长度减</span><span style="line-height: 1.5;">去固定的IP首部和TCP首部长度。</span></p>
  25. <p><span style="line-height: 1.5;">对于一个以太网,MSS值可达1460字节。</span></p>
  26. </ul>
  27. <p><span style="line-height: 1.5;"><span style="color:#ff0000;background-color: inherit;">窗口扩大选项</span></span><span style="line-height: 1.5;">:<span style="line-height: 1.5;">窗口扩大选项</span></span>使TCP的窗口定义从16 bit增加为32 bit。这并不是通过修改TCP首部来实现 <span style="background-color: inherit; line-height: 1.5;">的, TCP首部仍然使用16 bit ,而是通过定义一个选项实现对16 bit 的扩大操作( scaling </span><span style="background-color: inherit; line-height: 1.5;">operation )来完成的。于是TCP在内部将实际的窗口大小维持为32 bit的值。窗口扩大选项使最大的TCP窗口从65535增加到1千兆字节以上。</span></p>
  28. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  29. <p><span style="background-color: inherit; line-height: 1.5;">考虑一个使用窗口扩大选项的TCP连接,<span style="color:#ff0000;background-color: inherit;">其最大可能的窗口大小为1千兆字节</span>(最</span><span style="background-color: inherit; line-height: 1.5;">大的窗口是65535×2^14,而不是2^16×2^14)。</span></p>
  30. <p><span style="background-color: inherit; line-height: 1.5;">一个字节的移位记数器取值为0(没有扩大窗</span><span style="background-color: inherit; line-height: 1.5;">口的操作)到14。这个最大值14表示窗口大小为1 073 725 440字节(65535×2^14)。</span></p>
  31. <p><span style="background-color: inherit; line-height: 1.5;">这个选项只能够出现在一个SYN报文段中,因此当连接建立起来后,在每个方向的扩大 </span><span style="background-color: inherit; line-height: 1.5;">因子是固定的。</span></p>
  32. <p><span style="background-color: inherit; line-height: 1.5;">为了使用窗口扩大,两端必须在它们的SYN报文段中发送这个选项。</span></p>
  33. <p><span style="background-color: inherit; line-height: 1.5;">主动建 </span><span style="background-color: inherit; line-height: 1.5;">立连接的一方在其SYN中发送这个选项,但是被动建立连接的一方只能够在收到带有这个选 </span><span style="background-color: inherit; line-height: 1.5;">项的SYN之后才可以发送这个选项。</span></p>
  34. <p><span style="background-color: inherit; line-height: 1.5;">每个方向上的扩大因子可以不同。</span></p>
  35. <p><span style="background-color: inherit; line-height: 1.5;">如果主动连接的一方发送一个非零的扩大因子,但是没有从另一端收到一个窗口扩大选 </span><span style="background-color: inherit; line-height: 1.5;">项,它就将发送和接收的移位记数器置为0(即放弃窗口扩大)。这就允许较新的系统能够与较旧的、不理解新选</span><span style="background-color: inherit; line-height: 1.5;">项的系统进行互操作。</span></p>
  36. <p><span style="background-color: inherit; line-height: 1.5;">假定我们正在使用窗口扩大选项,发送移位记数为S,而接收移位记数则为R。于是我们 </span><span style="background-color: inherit; line-height: 1.5;">从另一端收到的每一个16 bit的<span style="color:#ff0000;background-color: inherit;">通告窗口将被左移R位以获得实际的通告窗口大小</span>。</span></p>
  37. </ul>
  38. <p><span style="line-height: 1.5;"><span style="color:#ff0000;background-color: inherit;">时间戳选项</span></span><span style="line-height: 1.5;">:时间戳选项允许多个报</span><span style="background-color: inherit; line-height: 1.5;">文段被精确计时,并允许接收方提供序号回绕保护(PAWS)。这对于高速连接是必须的。</span></p>
  39. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  40. <p><span style="background-color: inherit; line-height: 1.5;">时间戳选项使发送方在每个报文段中放置一个时间戳值。接收方在确认中返回这个数值,</span><span style="background-color: inherit; line-height: 1.5;">从而允许发送方为每一个收到的ACK计算RTT(我们必须说“每一个收到的ACK”而不是 </span><span style="background-color: inherit; line-height: 1.5;">“每一个报文段”,是因为TCP通常用一个ACK来确认多个报文段)。</span></p>
  41. <p><span style="background-color: inherit; line-height: 1.5;">时间戳是一个单调递增的值。由于接收方只需要回显收到的内容,因此不需要关注时间 </span><span style="background-color: inherit; line-height: 1.5;">戳单元是什么。这个选项不需要在两个主机之间进行任何形式的时钟同步。RFC 1323推荐在1</span><span style="background-color: inherit; line-height: 1.5;">毫秒和1秒之间将时间戳的值加1。 </span><span style="background-color: inherit; line-height: 1.5;">4.4BSD在启动时将时间戳始终设置为0,然后每隔500 ms将时间戳时钟加1。</span></p>
  42. <p><span style="background-color: inherit; line-height: 1.5;">我们提到过目前许多实现 </span><span style="background-color: inherit; line-height: 1.5;">为每一个窗口只计算一个RTT,对于包含8个报文段的窗口而言这是正确的。然而,较大的窗</span><span style="background-color: inherit; line-height: 1.5;">口大小则需要进行更好的RTT计算。</span></p>
  43. <p><span style="background-color: inherit; line-height: 1.5;">包含这个选项的TCP首部长度将从正常的20字节增加为32字节。</span></p>
  44. <p><span style="background-color: inherit; line-height: 1.5;">在连接建立阶段,对这个选项的规定与前一节讲的窗口扩大选项类似。主动发起连接的 </span><span style="background-color: inherit; line-height: 1.5;">一方在它的SYN中指定选项。只有在它从另一方的SYN中收到了这个选项之后,该选项才会</span><span style="background-color: inherit; line-height: 1.5;">在以后的报文段中进行设置。</span></p>
  45. </ul>
  46. <p>PAWS:防止回绕的序号:</p>
  47. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  48. <p><span style="background-color: inherit; line-height: 1.5;">从图24-8中观察到使用时间戳可以避免这种情况(回绕的序号)。接收方将时间戳视为序列</span><span style="background-color: inherit; line-height: 1.5;">号的一个32 bit的扩展。由于在时间E重新出现的报文段的时间戳为2,这比最近有效的时间戳</span><span style="background-color: inherit; line-height: 1.5;">小(5或6),因此PAWS算法将其丢弃。</span></p>
  49. <p><span style="background-color: inherit; line-height: 1.5;">PAWS算法不需要在发送方和接收方之间进行任何形式的时间同步。接收方所需要的就是 </span><span style="background-color: inherit; line-height: 1.5;">时间戳的值应该单调递增,并且每个窗口至少增加1。</span></p>
  50. </ul>
  51. <p>T/TCP:为事务用的TCP扩展,即T/TCP,允许一个客户/服务器的请求-应答序列在通常的情况下<span style="background-color: inherit; line-height: 1.5;">只使用三个报文段来完成。它避免使用三次握手,并缩短了TIME_WAIT状态,其方法是为每</span><span style="background-color: inherit; line-height: 1.5;">个主机高速缓存少量的信息,这些信息曾用来建立过一个连接。它还在包含数据报文段中使</span><span style="background-color: inherit; line-height: 1.5;">用SYN和FIN标志。</span></p>
  52. <p>TCP的性能:</p>
  53. <ul style="background-color: inherit;" class=" list-paddingleft-2">
  54. <p><span style="background-color: inherit; line-height: 1.5;">不能够比由接收方提供的窗口大小除以往返时间所得结果运行得更快(这就是带宽时 </span><span style="background-color: inherit; line-height: 1.5;">延乘积公式,使用窗口大小作为带宽时延乘积,并解出带宽)。如果使用24.4节的最大窗口扩</span><span style="background-color: inherit; line-height: 1.5;">大因子14,则窗口大小为1.073 千兆字节,所以这除以RTT的结果就是带宽的极限。</span></p>
  55. <p><span style="background-color: inherit; line-height: 1.5;">所有这些数字的重要意义就是TCP的最高运行速率的真正上限是由TCP的窗口大小和光速</span><span style="background-color: inherit; line-height: 1.5;">决定的。</span></p><p><br/></p>
  56. </ul>
<p><br/></p>

添加新评论