滑动窗口(多线程)
1.窗口大小指的是无需等待确认应答而可以继续发送数据的大值.
上图的窗口大小就是4000个字节(四个 段). 窗口大小可以变,可以动态调整
2.发送前四个段的时候, 不需要等待任何ACK, 直接发送;
3.收到第一个ACK后, 滑动窗口向后移动, 继续发送第五个段的数据; 依次类推;
4.操作系统内核为了维护这个滑动窗口, 需要开辟 发送缓冲区
来记录当前还有哪些数据没有应答; 只有确认 应答过的数据, 才能从缓冲区删掉;
5.窗口越大, 则网络的吞吐率就越高;
A给B发,如果B 来不及接收数据,这时,A通过B端通知的接受窗口而减缓数据的发送
发送了4个,只收到了第一个的确认应答,窗口会左滑,下次只确认应答第二个,会卡在这里
1.ACK丢了
第一个ACK丢失了不影响第二个ACK
发送下一个是5001 代表之前的数据都接受到,前面的ACK丢失了没关系,后面会继续发,
不会影响后续发送
2.数据包丢失
"高速重发控制"(也叫 "快重传)
发送时数据包丢失 一直发,确认应答一直显示下一个是1001 说明1001到2000丢了,补上之后,
之前发送的数据都被保存在接受缓冲区 直接变成7001开始正常
(还有一个发送缓冲区,如果数据包丢失了,会再次发送)
窗口是由客观原因决定的,而不是由数据丢失决定的,
不能扩大窗口的情况下(除去如果网络等其他客观原因是窗口扩大的原因),
他会在这里一直等待,即使后四个数据包已完成发送,
等待一个第一个发送应答后,才会滑动
确认应答机制
每一个ACK都带有对应的确认序列号, 意思是告诉发送者, 我已经收到了哪些数据; 比如是下一次是5001
说明前5000个数据都已经被接受了
下一次你从哪里开始发.
发送数据进行通信的时候
确认一次就行 A发给B数据,B给A发一个确认,A不用再给B发一个确认了
为啥不用
因为有一个发送缓冲区的,只有对方确认应答之后,数据才从发送缓冲区里删掉,
把数据发给对端,对端必须确认收到数据,伴随来自对端的ACK不断到达,本段才从发送缓冲区中
丢弃已确认的数据,TCP必须要为已发送的数据保留一个副本,直到他被对端确认