一:滑动窗口是接受数据端使用的窗口大小,用来告知发送端接收端的缓存大小,以此能够控制发送端发送数据的大小,从而达到流量控制的目的,对应==>rwnd:接收端窗口(receiver window)算法
对于流量控制,是一个端对端的概念。由接收端返回的rwnd控制。缓存
二:那么对于数据的发送端就是拥塞窗口了,拥塞窗口不表明缓存,拥塞窗口指某一源端数据流在一个RTT内能够最多发送的数据包数,cwnd:发送端窗口( congestion window )。网络
拥塞控制: 发送端主动控制控制cwnd,有慢启动(从cwnd初始为1开始启动,指数启动),拥塞避免(到达ssthreshsocket
后,为了不拥塞开始尝试线性增加),快重传(接收方每收到一个报文段都要回复一个当前最大连续位置的确认,server
发送方只要一连收到三个重复确认就知道接收方丢包了,快速重传丢包的报文,并TCP立刻把拥塞窗口 cwnd 减少到htm
1),快恢复(直接从ssthresh线性增加)。继承
快重传的机制是:
-1. 接收方创建这样的机制,若是一个包丢失,则对后续的包继续发送针对该包的重传请求;
-2. 一旦发送方接收到三个同样的确认,就知道该包以后出现了错误,马上重传该包;
-3. 此时发送方开始执行“快恢复”算法:
*1. 慢开始门限减半;
*2. cwnd设为慢开始门限减半后的数值;
*3. 执行拥塞避免算法(高起点,线性增加);get
三:发送方窗口是相互影响的,具体以下:io
发送方窗口的上限值 = Min [ rwnd, cwnd ]原理
当rwnd < cwnd 时,是接收方的接收能力限制发送方窗口的最大值。
当cwnd < rwnd 时,则是网络的拥塞限制发送方窗口的最大值。
4、TCP的滑动窗口大小实际上就是socket的接收缓冲区大小的字节数,能够用上层setopt来设置。
5、对于server端的socket必定要在listen之间设置缓冲区大小,由于,accept时新产生的socket会继承监听socket
的缓冲区大小。对于client端的socket必定要在connet以前设置缓冲区大小,由于connet时须要进行三次握手过程,
会通知对方本身的窗口大小。在connet以后再设置缓冲区,已经没有什么意义。
六:对ACK的再认识,ack一般被理解为收到数据后给出的一个确认ACK,ACK包含两个很是重要的信息:
一是指望接收到的下一字节的序号n,该n表明接收方已经接收到了前n-1字节数据,此时若是接收方收到第n+1字节数据而不是第n字节数据,接收方是不会发送序号为n+2的ACK的。举个例子,假如接收端收到1-1024字节,它会发送一个确认号为1025的ACK,可是接下来收到的是2049-3072,它是不会发送确认号为3072的ACK,而依旧发送1025的ACK。二是当前的窗口大小m,如此发送方在接收到ACK包含的这两个数据后就能够计算出还能够发送多少字节的数据给对方,假定当前发送方已发送到第x字节,则能够发送的字节数就是y=m-(x-n).这就是滑动窗口控制流量的基本原理重点:发送方根据收到ACK当中的指望收到的下一个字节的序号n以及窗口m,还有当前已经发送的字节序号x,算出还能够发送的字节数。