TCP的未来和性能

 

路径MTU发现

TCP的路径MTU发现按照如下方式进行:

在建立连接时,TCP使用输出接口或对端声明的MSS中的最小MTU作为起始的报文段大小。路径MTU发现不   允许TCP超过对端声明的MSS,如果对端没有指定一个MSS,默认为536。

    所有的TCP发送的IP数据报都被设置了DF比特,不可分片,如果中间路径的MTU小于这个值就会发送一个

ICMP差错报文,表示“不可分片”。发送端收到这个差错报文后减小MTU的大小后重新发送。

默认情况下每10分钟后会尝试使用一个较大的MTU值发送数据。

 

分组并不是越大越好,大的分组每经过一个路由的时间都会增加,但是传输量会减少

而小分组每经过一个路由的时间会减少,但是传输量会增加。

而这些跟网络(分组首部负荷),路由器(选路的决定),和主机(协议处理和设备中断)

 

 

 

长肥管道 

我们把一个连接的容量表示为:

    capacity(b) = bandwidth(b/s) * round-trip-time(s)

并称之为带宽延迟乘积,也可称它为两端的管道大小,当这个乘积变得越来越大时,TCP的某些局限性就会暴露出来。

具有大的带宽延迟乘积的网络被称为长肥网络(Long Fat Network,即LFN)。一个运行在LFN上的TCP连接被称为长肥管道。管道可以被水平拉长(一个长的RTT),或者被垂直拉高(较高的带宽),或向两个方向拉升,使用长肥管道会遇到多种问题:

1)TCP首部中窗口大小为16bit,从而将窗口大小限制为65535字节内,但是现在的网络需要一个更大的窗口来提供最大的吞吐量

2)一个长肥网络LFN内的分组丢失会使吞吐量急剧减少。如果只有一个报文段丢失,需要用快速恢复算法来避免管道被耗尽(如果管道被耗尽了,慢启动会渐渐填满,但这个过程需要经过多个RTT)

3)许多TCP实现对每个窗口的RTT仅进行一次测量,他们并不对每个报文段进行RTT测量,在一个长肥网络上需要更好的RTT测量机制

4)TCP对每个字节数据使用一个32bit无符号的序号来进行标识。如果在网络中有一个被延迟一段时间的报文段,它所在的网络连接已被释放,而一个新的连接在这两个主机之间又建立了,怎么才能防止专业的报文段再次出现呢?

IP首部中定义了TTL,最大上限是255跳或者是255秒。TCP定义了MSL推荐值为2分钟,也有许多实现为30秒,序号是32bit,也就是传输了2^32个字节后会被重用,如果一个包含序号N字节数据的报文段在网络上被延迟并在仍然有效时又出现,会发生什么情况?这里主要取决于网速是否够快,如果是一个千兆网络,只需要34秒序号就会发生回绕(也就是序号从0开始一直增加到2^32之后又回到了0),这里会使用一个时间戳的方式来解决这个问题。

 

 

 

窗口扩大选项

TCP首部仍然使用16bit不做修改,通过定义一个选项来扩大完成的

这是一个移位标记,0表示没有扩大,1表示扩大2^1倍,也就是2倍。

这个选项只能出现在SYN报文段中

如果这个值为14,则表示65535 * 2^14 字节

如果一方发送一个非0的窗口扩大因子,但没有从另一端接收一个窗口扩大选项,就将移位技术器设置为0,这就允许较新的系统能够与较旧的、不理解新选项的系统进行互操作。


这里可以看到接收方的SYN报文段中,有一个窗口扩大选项,被设置为7。

 

 

 

时间戳选项

时间戳是一个单调递增的值。由于接收方只需要回显收到的内容,因此不需要关注时间戳单元是什么。这个选项不需要再两个主机之间进行任何形式的时钟同步。

BSD系统在启动时将时间戳设置为0,之后每经过500毫秒将时间戳时钟加1。

 

为了减少任意一端维持的状态数量,对于每个连接只保持一个时间戳的数值。更新这个数值的算法非常简单:

1)TCP跟踪下一个ACK中将要发送的时间戳的值(一个名为tsrecent的变量)以及最后发送的ACK中确认序号(一个名为lastack的变量)。这个序号就是接收方期望的序号。

2)当一个包含有字节号lastack的报文段达到时,则该报文段中的时间戳被保存在tsrecent中。

3)无论何时发送一个时间戳选项,tsrencent就作为时间戳回显应答字段被发送,而序号字段被保存在lastack中。

 

这个算法能处理下面两种情况:

1)如果ACK被接收方延迟,则作为回显值的时间戳值应该对应于最早被确认的报文段。如发送了1~1024和1025~2048字节的报文段达到,接收方产生一个2049的ACK来对它进行确认。此时ACK中的时间戳应该是1~1024报文段中的时间戳。因为发送方在进行重传超时时间的计算时,必须将延迟的ACK也考虑在内。

2)如果一个受到的报文段虽然在窗口范围内但同时又是失序,这就表明前面的报文段已经丢失。当那个丢失的报文段达到时,它的时间戳(而不是失序报文段的时间戳)将被回显。

假设有1~1024报文段A

           1025~2048报文段B

           2049~4072报文段C

如果达到接收方的顺序为A,C,B。那么接收方返回的时间戳ACK应该是对A回复1(报文段A的时间戳),

之后是报文段2(回显的时间戳还是报文段A的),之后是正常的回显报文段C。

 

 

 

PAWS:防止回绕的序号

32bit的序号在一个带宽很大RTT很长的连接内可能会出现回绕,当旧的报文段A没有及时达到,此时发送方又重传了这个报文段标记为B,那么A的时间戳就是1,B的时间戳是2。

当接收方收到2后,一段时间(可能A只是被中间路由延迟了)报文段A又达到了,此时发现最新的时间戳比A要大,于是将A报文段丢弃。

PAWS算法不需要再发送方和接收方中间进行任何形式的时间同步。接收方所需要的就是时间戳的值应该单调自增,并且每个窗口至少增加1。

 

 

 

T/TCP;为事务用的TCP扩展

TCP的扩展,但因为存在安全性问题,并没有成为标准,也没有被应用。

 

 

 

TCP的性能

下面这些实际限制适用于任何的实际情况

1)不能比最慢的链接运行得更快

2)不能比最慢的机器的内存运行的更快

3)不能够比接收方提供的窗口大小除以往返时间所得结果运行的更快(这就是带宽延迟乘积公式)。

 

 

 

 

 

参考:

路径MTU发现

T/TCP

 

 

 

 

 

 

 

...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值