名词解释
MSS: Maxitum Segment Size 最大分段大小RTT: (Round-Trip Time):往返时延。是指数据从网络一端传到另一端所需的时间。
滑动窗口
什么是流量控制? 流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。
- 滑动窗口的精髓就是一次把窗口里的都发出去,收到回复了窗口就往后滑
- 如果发一个收一个的话,太浪费带宽
Delay ACK
- 左边是老的方式,一个请求一个ack
- 右边是新方式,多个报文落在同一个
tick里,只返回一个确认 - 新方式甚至可以ack的同时带着自己的数据,这样更高效
拥塞控制&慢启动
拥塞控制
什么是拥塞控制? 拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;
拥塞控制主要有四个算法:
- 慢启动
- 拥塞避免
- 拥塞发生时,快速重传
- 快速恢复
慢启动算法
发送方维持一个叫做拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。
慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增加拥塞窗口的大小。
算法流程: 1. 连接建好的开始先初始化cwnd = 1,表明可以传一个MSS大小的数据 2. 每当收到一个ACK,cwnd++; 呈线性上升 3. 每当过了一个RTT,cwnd = cwnd*2; 呈指数让升 4. 当cwnd >= ssthresh时,就会进入“拥塞避免算法”
为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量。ssthresh的用法如下:
- 当cwnd<ssthresh时,使用慢开始算法。
- 当cwnd>ssthresh时,改用拥塞避免算法。
- 当cwnd=ssthresh时,慢开始与拥塞避免算法任意
相关的linux参数
net.ipv4.tcp_slow_start_after_idle: TCP 连接在空闲一段时间后,是否进入慢启动。其默认值为 1
拥塞避免算法
当cwnd<ssthresh时,拥塞窗口使用慢启动算法,按指数级增长。 当cwnd>ssthresh时,拥塞窗口使用拥塞避免算法,按线性增长。
拥塞避免算法每经过一个RTT,拥塞窗口增加initcwnd。
快重传
- 要求接收方每收到一个失序的报文段后就立即发出重复确认而不是等待自己发送数据时才捎带确认
- 发送方只要一连收到三个重复确认就立即重传对方尚未收到的报文段,而不必等待设置的重传计时器到期
三次握手
握手的时候要确认下面两个:
- Win: 滑动窗口大小
- MSS: 后续报文最大size
三次握手的关键作用:
- 确定窗口大小
- 确定
seq,这是随机的,要确定从多少开始