1.TCP的可靠传输
- 确认、超时重传、报文排序
1.1 TCP如何保证可靠传输
发送方没发送一个报文,都会收到来自接收方对该报文的确认,以确保数据被接收端接收;同时没发一个报文会启用一个超时重传机制,若在规定时间内发送方未接收到来自接收方的确认报文,那么就会认为该报文在传输过程中丢失或在网络中拥塞,将重新发送这个数据;接收方将收到的报文数据重新排序,保证数据有序。
1.2 几个基本概念
- 发送缓存:发送方将可以发送给接收方的数据暂时存储在发送缓存中
- 发送窗口:已发送未确认的数据+待发送的数据。发送窗口时发送缓存的一部分
- 接收缓存:存放发送方传输的未得到确认的数据以及未按序到达的数据
- 接收窗口(通知窗口)—rwnd:接收方能够接收数据的大小
- 拥塞窗口—cwnd:拥塞窗口反映的是当前网络的拥塞程度
2.TCP的流量控制
- 利用滑动窗口进行流量控制
2.1 流量控制原理
一般而言,发送窗口越大,传输数据速度越快,但是这很容易造成网络拥塞,因此需要动态的改变发送窗口大小,发送方发送窗口大小不应该大于接收方接收窗口的大小。流量控制的作用就是让发送方发送数据的速度不要太快,要让接收方来得及接收所有的数据。
2.2 发送窗口如何改变
接收端发送的确认报文中会将自己接收窗口的大小填入报文头部窗口大小的位置中,发送方接收到确认后,根据这个数据改变发送端窗口大小。若发送方的窗口大小为0,此时,接收端有收到报文,也就是说,此时接收窗口大小不再是0,发送端继续发送数据。
考虑这样的问题
2.3 流量控制和拥塞控制的关系
流量控制是点对点的控制,是端到端的问题,旨在改变发送端发送窗口的大小,控制发送数据的速率,以使接收端能够来得及接受所有的数据。
而拥塞控制是为了防止太多的数据传输在网络中,拥塞控制是一个全局性的控制,必须保证当前网络能够承受当前的数据负载。若发送方在一定时间内一直未接收到来自接收端的确认信息,就会认为网络出现拥塞,但并不知道产生拥塞的原因。
3.拥塞控制算法
- 慢开始和拥塞避免、快重传和快恢复
3.1慢开始算法和拥塞避免算法
- 慢开始算法
慢开始首先设置cwnd=1,发送方每接收到来自接收方的确认报文就会将拥塞窗口增加1。每一次传输过程中,比如,发送发送4个报文段后,接收到来自接收方发送来的四个接收报文,将会对发送方拥塞窗口增加4,那么每一次传输轮回,慢开始的过程会将发送方的拥塞窗口增加1倍,即拥塞窗口呈指数级增长。 - 拥塞避免算法
为防止拥塞窗口增长过大引起网络拥塞,设置一个满开始门限ssthresh,若当前拥塞窗口值大于满开始门限值时,减缓拥塞窗口增长速率,从指数级增长改为线性增长,每个传输轮次仅增长1,若网络出现拥塞(即发送方没有按时接收到来自接收方的确认报文),就将慢开始门限值设置为当前拥塞窗口大小的一半,同时令拥塞窗口大小为1。
3.2 AIMD算法
- “乘法减小”和“加法增大”(AIMD)算法
拥塞避免阶段,每一个传输轮次,将拥塞窗口值加1,增长速率比较慢,但能够有效防止网络出现拥塞。若网络出现拥塞就将发送发慢开始门限值减半,若网络频繁出现拥塞,那么满开始门限值的下降速率很快,这将极大程度的减小发送方发送到网络中的数据
3.3 快重传和快恢复
- 快重传
在接收方收到乱序的报文时,立即发出一个重复确认(即上一次有序的报文21),在接下来收到的报文中只要不是有序的报文21,都将立即重复发出一个确认报文,以通知发送方报文未按序到达。快重传规定,发送方若连续收到3个重复的报文,应立即重新发送对方未收到的数据,而不必等待超时重传时间的到达。 - 快恢复
若发送方连续收到来自接收端的3个重复确认,可知道此时网络并没有发生拥塞,但是为了防止拥塞,执行“乘法减小”操作,将慢开始门限值减半,但不执行慢开始操作,即不将拥塞窗口大小设置为1,而是将拥塞窗口cwnd的值设置为ssthresh的一半,然后开始执行拥塞避免算法(“加法增大”)
采用快恢复算法时,慢开始算法只在建立连接和网络出现超时时使用