TCP—流量控制
◼ 如果接收方的缓存区满了,发送方还在疯狂发送着数据
接收方只能把收到的数据包丢掉,大量的丢包会极大的浪费网络资源,还要在重传
所以要进行流量控制,由缓存区告诉对方自己接收的流量大小
◼ 什么是流量控制?
让发送方的发送速率不要太快,让接收方来得及接收处理
◼ 原理
通过确认报文中窗口字段来控制发送方的发送速率
发送方的发送窗口大小不能超过接收方给出窗口大小
当发送方收到接收窗口的大小为0时,发送方就会停止发送数据
一开始接收方会告诉发送方自己的接收窗口大小,窗口大小不是固定死的,是动态调整
TCP—流量控制—特殊情况
◼ 有一种特殊情况
一开始,接收方给发送方发送了0窗口的报文段,后面,接收方又有了一些存储空间,给发送方发送的非0窗口的报文段丢失了,发送方的发送窗口一直为零,双方陷入僵局
◼ 解决方案
当发送方收到0窗口通知时,这时发送方停止发送报文,并且同时开启一个定时器,隔一段时间就主动发个测试报文去询问接收方最新的窗口大小,如果接收的窗口大小还是为0,则发送方再次刷新启动定时器,如果不是0,就继续发送。
TCP—拥塞控制
在流量控制的基础上,对数据进行控制,因为数据的传输不能够根据理论来控制
◼ 拥塞控制
防止过多的数据注入到网络中
避免网络中的路由器或链路过载
◼ 拥塞控制是一个全局性的过程,就好比交通流畅,靠的是大家。
涉及到所有的主机、路由器
以及与降低网络传输性能有关的所有因素
是大家共同努力的结果
◼ 相比而言,流量控制是点对点通信的控制
链路吞吐量:每秒通过的数据大小,理论上最大为该链路的带宽
随着链路吞吐量不断增大,在七八百的时候,可能就开始拥塞,继续增大数据量,吞吐量反到不断减小,最后出现死锁,就好比公路上行驶的车,当车辆少时,行驶的速度它就快,当到了晚高峰的时候,车辆剧增,行驶速度变慢,最后出现堵车,交通道路瘫痪。
TCP—拥塞控制—方法
◼ 慢开始(slow start,慢启动)
◼ 拥塞避免(congestion avoidance)
◼ 快速重传(fast retransmit)
◼ 快速恢复(fast recovery)
◼ 几个缩写
MSS(Maximum Segment Size):每个段最大的数据部分大小(在首部选项部分进行协商,选双方当中最小的那个,不能超过1460字节)
在三次连接的时候,交换一些信息,包括MSS
TCP首部32字节在有SYN字节的时候,多出来的12字节是双方交换信息时要用到的,
✓ 在建立连接时确定
cwnd(congestion window):拥塞窗口,跟当时的网络有关系(跟发送方没有关系)
rwnd(receive window):接收窗口,一次发多少过来(接收方)
swnd(send window):发送窗口,实际发送的窗口
✓ swnd = min(cwnd, rwnd)
TCP—拥塞控制—慢开始
(不用去纠结这张图片为什么确认两次)
刚开始比较慢,然后越发越多,试探着试一下
一开始cwnd由mss决定,因为只发一个包,mss是固定的,发送包的数量越多,cwnd就越大
(不用去纠结为什么一开始发4个包)
◼ cwnd的初始值比较小,先发一个包,然后随着数据包被接收方确认(收到一个ACK),cwnd就成倍增长(指数级,每次乘以2)
TCP—拥塞控制—拥塞避免
◼ ssthresh(slow start threshold):慢开始阈值,cwnd达到阈值后,以线性方式增加,只要值超过ssthresh,就有可能导致网络拥塞
◼ 拥塞避免(加法增大):拥塞窗口缓慢增大(斜率根据算法来),以防止网络过早出现拥塞,通过丢包,观察是否拥塞
丢包:整个数据都丢了,只有当讲到具体的网络层、传输层、数据链路层,才会说丢包、丢段、丢帧
◼ 乘法减小:只要网络出现拥塞,把ssthresh减为拥塞峰值的一半,同时执行慢开始算法(cwnd又恢复到初始值)
第二次拥塞避免(加法增大):在怎么增加,也不会超过上一次的网络拥塞峰值
当网络出现频繁拥塞时,ssthresh值就下降的很快
TCP—拥塞控制—快重传
◼ 接收方
每收到一个失序的分组后就立即发出重复确认
使发送方及时知道有分组没有到达
而不要等待自己发送数据时才进行确认
跟超时重传不一样,他是接收方通知发送方没有收到数据
◼ 发送方
只要连续收到三个重复确认(总共4个相同的确认),就应当立即重传对方尚未收到的报文段
而不必继续等待重传计时器到期后再重传
TCP—拥塞控制—快恢复
◼ 当发送方连续收到三个重复确认,说明网络出现拥塞
就执行“乘法减小”算法,把ssthresh减为拥塞峰值的一半
◼ 与慢开始不同之处是现在不执行慢开始算法,即cwnd现在不恢复到初始值
而是把cwnd值设置为新的ssthresh值(减小后的值)
然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大
TCP—拥塞控制—快重传+快恢复(新版本)
以前网络不好,只能用旧版本,现在网络好,用新版本
TCP—拥塞控制—发送窗口的最大值
◼ 发送窗口的最大值:swnd = min(cwnd, rwnd)
◼ 当rwnd < cwnd时,是接收方的接收能力限制发送窗口的最大值
◼ 当cwnd < rwnd时,则是网络的拥塞限制发送窗口的最大值