TCP并不是么一个窗口都会回复ACK的,可能会对俩个报文段发送一个ACK,也可能会对多个报文段发送1个ACK,比如说,发送方有1/2/3/4个报文段,先发送2,3俩个报文段,但是接收方期望收到1报文段,这个时候,2,3报文段就只能放在缓存中等待报文1的空洞被天上,如果报文1一直不来,报文2,3也将被丢弃,如果报文1来了,那么会发送一个ACK对这三个报文进行一次确认。
举一个列子来说明一下,活动窗口的原理:
1、假设32-45这些数据,是上层application发送给TCP的,TCP将其分成四个segment来发往internet
2、seg1 32-34 seg3 35-36 seg3 37-41 seg4 42-45这四个片段,依次发送出去,此时假设接收端只接收到了seg1 seg2 seg4
3、此时接收端的行为时回复一个ACK包说明已经收到了32-36的数据,并将seg4 进行缓存(保证顺序,产生一个保存seg3 的hole)
4、发送端收到ACK之后,就会将32-36的数据包从发送并没有确认切到发送已经确认提出窗口,这个时候窗口向右移动。
5、假设接收端通告的window size任然不变,此时候,窗口右移,产生一些新的空位,这些是接收端允许发送的范畴。
6、对于丢失的seg3 ,如果超过一定时间,TCP就会重新传送(重传机制),重传会成功seg3 sseg4 一块呗确认,不成功,seg也将被丢弃。
就是不断重复着上述的过程,随着窗口不断滑动,将整个数据流发送到接收端,实际上接收端的windowsize通告也是会变化的,接收端根据这个值来确定何时及发送多少数据,从对数据流进行流控。
滑动窗口动态调整:
主要是根据接收端的接受情况,动态的去调整window size,然后来控制发送端的数据流量。
1、客户端的不断快速发送数据,服务器接受相对较慢,看下实验结果。
a.包 175,发送ACK携带win = 384,告知客户端,现在只能接受384个字节。
b.包176,客户端果真只发送了384个字节,wireshark也比较智能,也宣告了TCP window full
c.包177,服务器回复一个ACK,并告知窗口为0,说明接收方已经收到礼物所有数据,并保存到缓冲区,但是这个时候应用程序并没有接受这些数据,导致缓冲区没有更多的空间,故告知窗口为0,这就是所谓的0窗口,零窗口发生期间,发送方停止发送数据。
d.包客户端察觉到窗口为0,则不再发送任何数据给接收方。
e.包178,接收方发送一个窗口通告,告知发送方已经有接收数据的能力了,可以发送数据包了。
f.包179,收到窗口通告之后,就发送缓冲区内的数据了。
总结一点,就是接收端可以根据自己的状况通告窗口的大小,从而控制发送端的接收,进行流量控制。
TCP协议是面向可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制由窗口结合一系列的控制算法实现。
一、滑动窗口协议:
关于这部分自己不晓得怎么叙述才好的,因为理解部分更多,下面就用自己的理解来介绍TCP的精髓;滑动控制窗口协议;