• 【TCP/IP详解 卷一:协议】第二十四章 TCP的未来与性能


    来到了TCP的最后一个章节,未来与性能。在当时(1991年)的未来,如今已经部分变为现实,部分就只是历史中的实验。

    主要内容:

    • 路径MTU的发现与TCP的结合。
    • 长肥管道 和 高速千兆比网络。
    • 窗口扩大选项。
    • 时间戳选项 和 PAWS算法。
    • T/TCP。
    • TCP的性能。

    24.1 前言

    本章讨论TCP的一些修改建议,这些建议 可以使TCP在高速率环境中获得最大的吞吐量。使用路径MTU发现机制可以增加吞吐量。
    长肥管道:带宽时延乘积很大的网络。以及TCP在这些网络上面的局限性。为了处理长肥管道,增加了两个选项:

    • 窗口扩大选项(增大TCP的最大窗口)
    • 时间戳选项(更加精确的计算RTT,防止序号回绕)

    这些新选项允许TCP实现能够向后兼容。

    以及现在被遗忘的T/TCP,TCP事务协议。

    24.2 路径MTU发现

    其实本质上并没有与之前我们介绍的路径MTU有什么区别,这是在 当前两个主机之间的路径上任何网络的最小MTU。

    MSS:网络允许传输数据的最大值
    MTU = MSS + 数据报头的长度

    路径MTU发现 在IP首部中 设置了DF(不要分片),如果中间的路由器需要对IP数据报进行分片,将返回一个ICMP不可达差错,通过这个差错可以确定路径MTU。

    具体实现

    连接建立的时候,TCP使用输出端口或者对端声明的MSS中的最小MTU作为起始的报文段大小。路径MTU不允许TCP超过 对端声明的MSS。如果对端没有声明,则默认536.
    一旦选定了报文段的大小,所有被TCP发送的IP数据报 都将被设置为DF。

    如果中间的某个路由器需要对它进行分片,那么就丢弃该报文段,并且返回一个ICMP不可达差错报文。
    收到这个报文之后,TCP就减小报文段的长度进行重传。

    • 如果这个ICMP报文和之前的报文类似(旧的ICMP),也就是说 之前减小的报文段还不足以通过发送ICMP报文的路由器,TCP就继续尝试下一个可能的最小MTU。
    • 如果这个ICMP报文是 路由器产生的较新的ICMP差错(路由发生了变化),那么报文段的大小就被设置为 下一跳的MTU减去IP和TCP的首部长度。

    当这个重传发生的时候,拥塞窗口不变,但是需要进行慢启动。

    由于路由是动态变化的,因此在最后一次减小报文段大小的一段时间之后,可以尝试使用一个较大的值,但是不能超过 min{对端声明的MSS,输出接口MTU的最小值}。

    主要作用:
    避免IP数据报进行分片,因为即使丢弃了其中的一片数据,都会导致TCP进行重传,降低了传输性能。

    24.3 长肥管道

    当带宽时延乘积越来越大的时候,TCP的局限性就会暴露出来。

    具有大的 带宽时延乘积 的网络,叫做长肥网络,即LFN。而一个 运行在LFN上的TCP连接 称为长肥管道。它可以被水平拉长(长的RTT),也可以被拉宽(较高的带宽)。

    TCP在长肥管道下有以下问题:
    (1)需要一个更大的窗口来提供更大的吞吐量。由后面的 窗口扩大选项 改良。
    (2)在一个长肥管道LFN中的分组丢失 会使吞吐量急剧减少:如果只有一个报文段丢失,可以利用 快速恢复和快速重传算法 避免管道的耗尽;但是如果有多个分组丢失也会典型的让管道耗尽。可以使用慢启动填满,但是这需要几个RTT的时间。
    (3)在长肥管道上,需要更好的 RTT测量机制。由 时间戳选项 改良。
    (4)怎么样避免在一个MSL时间内避免 序号回绕:序号空间是有限的,在使用完之后会发生重用,迟到报文段会使数据发生差错。由 PAWS算法 改良。

    千兆比网络

    在千兆比网络的速率下,时延限制占据了主要的地位,而带宽不再成为限制。
    但是时延主要取决于光速,而光速是不可能减小的,这个固定时延带来了一些不便。

    24.4 窗口扩大选项

    窗口扩大选项 使得TCP的窗口定义从 16bit 增加到 32bit。但是这不是通过修改首部长度来实现的:首部仍然为16bit,通过一个选项定义实现扩大操作。
    通过这个选项(移位计数器)的值(连接的时候一般为0 或者 14),对传递的窗口值进行移位的操作,得到真正的窗口值。

    这个选项只能出现在SYN报文段中。
    为了使用这个扩大选项,连接的两端 必须在它们的SYN报文段中发送这个选项,两边的扩大因子可以不同。
    如果主动建立的一方 没有收到另外一方的窗口扩大选项,则把发送和接收的 移位计数器置为0.

    TCP根据接收缓存的大小主动选择移位计数。

    24.5 时间戳选项

    长肥管道需要更为精确的 RTT测量机制。
    时间戳选项 使每个发送方在每个报文段中,放置一个时间戳值。接收方在确认中返回这个数值,从而允许 发送方为 每一个收到的ACK计算RTT。(必须说,是收到的ACK而不是每一个报文段,因为 接收端TCP通常用一个ACK确认多个报文段)

    包含这个选项的TCP首部,从20bit 增加到 32bit。
    时间戳是一个单调递增的值,RFC推荐在 1ms到1s 之间将时间戳的值+1.
    与窗口扩大选项类似,需要在 SYN报文段中指定该选项。

    关于时间戳算法的准确实现,参考教材的P264,具体两点:

    (1)如果ACK被接收方延迟,那么作为回显的 时间戳值 应该是 最早被确认的数据报。
    比如 1-1024 和 1025-2048 字节 的报文段到达,每一个都有一个时间戳选项,那么回显的是 1-1024 的时间戳值。

    (2)如果收到的报文段乱序,说明前面的报文段丢失。当丢失的报文段到达时,它的时间戳将被回显。
    比如有三个数据报按以下顺序接收:1-1024,2049-4072,1025-2048. 在 1025-2048 到达之后,那么返回的ACK带有 1-1024 的时间戳(正常的),1-1024 的时间戳(代表不正常的,重复的失序报文段),还有 1025-2048 的时间戳(丢失的回显)。

    这会使 RTT估计过高,但是总比 RTT估计过低好。
    无论怎样,回显 2049-4072 会导致RTT的估计出现大的偏差。

    24.6 PAWS 防止回绕的序号

    PAWS 防止序号的回绕,假定了报文段丢失和重新出现的时间小于 MSL的时间,否则这个迟到的报文段 在TTL到期的时候 被丢弃。
    时间戳可以避免这个情况:它是单调递增的,并且每个窗口必须加1.

    对比时间戳就可以发现 重新出现的迟到报文段了(时间戳比前面的数据小),有效地防止了数据的紊乱。

    24.7 T/TCP

    以小结的内容对其进行一个概述。

    为事务用的TCP扩展,即T/TCP,允许一个 client/server 的 请求-应答 序列在通常的情况之下只使用三个报文段来完成。它避免三次握手,并缩短了TIME_WAIT状态,其方法是为每个主机高速缓存少量的信息:这些信息曾用于建立一个连接。它还包含数据报文段中使用 FIN 和 SYN 标志。

    这只是一种试验性的协议。因为存在安全性问题,并没有成为标准,也没有被应用。

    24.8 TCP的性能

    教材中对在 10Mb/s的以太网 上计算能够观察到的TCP最大的吞吐量 做了一个计算。

    实际的限制:
    1.不能比最慢的链路运行更快
    2.不能比最慢的机器的内存运行的更快
    3.不能比 通告窗口/往返时间RTT 更快(带宽时延公式的变形,求出带宽)

    TCP的最高运行速率 的真正上限是由TCP的窗口大小决定的。许多协议的性能问题 在于实现中的缺陷,而不在于协议固有的一些限制。

    2016/8/20

  • 相关阅读:
    MSSQL 跨数据库连接
    powerdesigner逆向工程,从数据库导出PDM
    JS面向对象的程序设计
    数据脚本
    JDK安装与环境变量配置
    sql: 去除数据库表中tab、空格、回车符等特殊字符的解决方法
    用SQL语句获得一个存储过程返回的表
    百度云下载速度慢解决方法
    【WCF全析(一)】--服务协定及消息模式
    【WCF全析(二)】--服务配置部署详解
  • 原文地址:https://www.cnblogs.com/qq952693358/p/5790756.html
Copyright © 2020-2023  润新知