赞
踩
TCP必须使用端到端拥塞控制而不是使网络辅助的拥塞控制,因为IP层不 向端系统提供显式的网络拥塞反馈。
第一,一个TCP发送方如何限制 它向其连接发送流量的速率呢?
第二,一个TCP发送方如何感知从它到目的地之间的路径上存在拥塞呢?
第三,当发送方感知到端到端的拥塞时,采用何种算法来改变其发送速率呢?
TCP连接的每一端都是由一个接收缓存、一个发送缓存和几个变量(LastByteRead、
rwncl等)组成。
运行在发送方的TCP拥塞控制机制跟踪一个额外的变量,即拥塞窗口 (congestion window)。
拥塞窗口表示为cwnd,它对一个TCP发送方能向网络中发送流量的速率进行了限制。
LastByteSent 一 LastByteAcked ≦ min(cwnd, rwnd )
ack以快的速率到达,拥塞窗口增大,反之减小。
注意到网络中没有明确的拥塞状态信令,即ACK和丢包事件充当了隐式信号,并且每个TCP发送方根据异步于其他TCP发送方的本地信息而行动
丢包:对于给定报文段,一个超时事件或四个确认(一个初始ACK和其后的三个冗余ACK) 被解释为 “丢包事件”的一种隐含的指示。
一个确认报文段到达时(确认的到达被认为是一切顺利的隐含指示),指示该网络能够增加发送方的速率,拥塞窗口长度增加
带宽探测。加速到丢包为止,然后回退,来确定网络的拥塞上限
算法包含3个主要部分
当一条TCP连接开始时,cwnd的值通常初始置为一个MSS的较小值[RFC 3390], 这就使得初始发送速率大约为MSS/RTT。
在慢启动(slow-start) 状态,cwnd的值以1个MSS开始并且每当传输的报文段首次被确认就增加1个MSS。然后是2,4,8…指数增长
状态变化:
1)如果存在一个由超时指示的丢包事件(即拥塞),TCP发送方将cwnd设置为1并重新开始慢启动过程。并将ssthresh("慢启动阈值”的速记)设置为cwnd/2 ,即当检测到拥塞时将ssthresh置为拥塞窗口值的一半
2)当cwnd的值等于ssthresh时,结束慢启动并且TCP转移到拥塞避免模式
3)如果检测到3个冗余ACK,这时TCP执行一种快速重传(参见3. 5. 4节)并进入快 速恢复状态
注意:慢启动会造成网络访问延迟,可以用TCP分岔来进行优化,CDN就是一个应用实例
拥塞避免
一旦进入拥塞避免状态,cwnd的值大约是上次遇到拥塞时的值的一半,距离拥塞并不遥远!
在接收到ack时,增加拥塞窗口长度,当丢包和3个冗余ack时,动作与慢启动一样,并进入快速恢复状态
快速恢复
在快速恢复阶段,拥塞窗口线性增长
冗余ack到达线性增长拥塞窗口
丢失报文段ack到达,进入拥塞避免
当超时时,进入慢启动状态
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。