TCP:MSS和slow-start如何为效率做贡献

1,253 阅读4分钟
TCP中有两个提高传输效率的机制一个是MSS,一个是slow-start或者说是congestion window,都是提高网络传输效率但这两者有什么区别呢。本文的前提需要了解TCP connection的建立过程,可以参考我这里之前写juejin.cn/post/1


MSS

MSS为了解决什么问题?

先说MSS,MSS是maximum segment size的缩写。要理解这个概念需要先理解以下知识:

(1)TCP协议虽然是byte-stream的,但IP协议是分package的,所以TCP为了把stream的data通过IP发送需要把自己的bytes分割成一个个segment,但这个segment有多大呢?

(2)物理链路比如wifi、光纤等有自己的MTU这种物理限制,MTU也就是maximum transmission unit也就是自己最大的传输单位。注意MSS是TCP也就是传输层的概念,MTU是链路层概念,这俩中间的IP如果发现TCP的segment超过了自己要使用的链路层的MTU,IP为了把数据发送出去会把数据再次碎片化,这个过程称为IP的fragmentation



理想情况下,为了追求高效的传输需要平衡以下作用力:(1)segment越大数据效率越高,因为每个ip和tcp的header会占用空间,越是琐碎的segment,overhead越高;(2)segment越大越容易在传输过程中发生fragmentation,数据拆开再组合会降低效率。所以MSS的出现就是为双方确定一个合理的最大传输单位。



MSS如何解决这个问题?

为了确认合理的MSS,TCP通信的双方在建立连接时(SYN flag)交换双方基于自己所在网络计算得到的MSS,这里的前提是双端都可以得到自己所在网络的MTU。在这个信息交换的基础上双方可以选择合理的MSS进行数据发送,比如发送两边网络较小的MSS。

与之相对应的UDP由于无法进行MTU的信息沟通,如果UDP选择发送大的包相对TCP而言更有可能引发IP fragmentation。


Slow-start

slow-start为了解决什么问题?

在TCP的SYNC交换了sliding window size之后(假设窗口大小是10),注意sliding window size不是MSS,MSS是segment的大小,sliding window size是批量发送segment的数量。当大量segment发送到网络中时,很容易出现本地局域网完全不拥挤数据马上发送到了广域网,但是广域网数据量大遇到了处理速度不足的路由器发生了网络拥挤,由于TCP按照窗口大小一下子发送出去了太多数据使得网络情况雪上加霜。

一个类似的例子就像一条路上有很多小区,每个小区的出入口没有堵车,但是这条路上由于所有小区都有车开进开出发生了拥堵。而一个小区在不确定门口的路拥挤情况时候,又一口气开出去10辆车,加重了堵车的惨状。



有人可能会问,为什么不像MSS一样,TCP connection建立时,双方约定一下合理的sliding window size呢?这是因为相对于静态的由于物理原因决定的MTU而言,网络的速率是动态的与网络使用情况相关的,所以就算TCP在建立连接时可以测算一下当时的网络情况,在后续数据传输过程中还是需要一个机制来保证TCP能够在网络拥挤的情况下依然可靠。所以slow-start和响应的算法和设计就应运而生了。


slow-start如何解决这个问题?

slow-start采用了一种方法:先派出一辆车看看,如果车顺利抵达就报信回来,接到报信之后在原来派车的数量K上派出K+1量车。这个K,就是TCP中congestion window的大小,代表了数据发送方基于网络情况对于数据发送速率的控制;与之相对应的sliding window则是数据接收方根据自己的消费能力对于对方数据发送速率的控制。而实际的发送窗口往往这两个约束的最小值。

slow-start这里只讲了congestion window增加的情况,congestion减少的情况后续通过restransmission部分来补充。此外本文更多的是讲了逻辑,定量的分析和证明可以参考van jacobson的文章。www.cs.binghamton.edu/~nael/cs428…


升华认知

最后总结一下,TCP之所以被称为可靠的传输协议,一个可靠的点是其能在各种网络环境都能有效率的传输。为了达到这个目标,TCP通过控制包的大小,和发送包的速率这两个方面的设计来实现。包的大小依赖的是静态的物理链路层的特性,所以可以直接测算确定;速度依赖动态的网络情况,所以通过动态的算法来实现。