专业网站制作服务,北京餐饮设计公司,宜宾市珙县住房城乡建设网站,论坛网站模板源码下载一.窗口 在TCP中由于要保证可靠性#xff0c;所以每发送一条数据后#xff0c;都需要接收方返回一条应答报文#xff0c;要是我们每发送一条数据#xff0c;发送方就等待接收应答报文#xff0c;收到之后再去发送下一条数据#xff0c;这样我们就会花费大量的时间在等待应…一.窗口 在TCP中由于要保证可靠性所以每发送一条数据后都需要接收方返回一条应答报文要是我们每发送一条数据发送方就等待接收应答报文收到之后再去发送下一条数据这样我们就会花费大量的时间在等待应答报文上效率是很低下的 所以TCP中有了窗口的概念TCP在发送数据的时候会一次性发送一组数据发送这一组数据的过程中不用等待ACK应答报文就直接往接收方发而窗口大小就是我们发送这一组数据的大小如上图当窗口大小为4000个字节四个段时我们在发送序号为1-4000的信息就直接发送给接收方即可不需要等待接收方返回ACK应答报文在发送好一组数据以后我们再等待ACK应答报文相当于使用一份等待时间等待四个ACK应答报文 窗口能不能无限大呢 当我们的窗口越大此时批量发送的数据就越多效率就越高那我们的窗口能不能及其的大呢这样效率不就非常高了吗答案是不行因为窗口要是过于大批量发送的数据就会很多就不知道要到什么时候才去等待ACK应答报文了就相当于完全不必等ACK应答报文此时就和不可靠传输差不多了而TCP的特点就是可靠传输并且如果窗口过于大批量发送的数据过于多接收方能不能处理得过来中间的网络设备能不能承受住都是未知数
二.滑动窗口 滑动窗口是一个形象的比喻实际上就是批量发送数据这样可以缩短等待时间提高一定的效率缩短不代表没有仍然需要一定的时间等待ACK应答报文所以传输效率不会比UDP高 如上图我们在发送一组数据后等待ACK应答报文时我们需要等待4个段的应答报文都获得了才去发送下一段数据吗很显然不需要由于ACK应答报文的发送是有顺序的所以我们肯定会先接收到当前组中第一段的ACK应答报文当我们收到第一段的ACK应答报文后便可以发送下一段数据了这样我们就保证了一直等待的都是4个段的ACK应答报文一段一段的向后推进就像一个滑动窗口一样。 在滑动窗口中出现丢包应该怎么办 1.ACK应答报文丢包 ACK应答报文丢包即使不做任何处理也是正确的如上图当1-1000序号的数据发送后接收方返回的1001的确认序号 ACK应答报文出现了丢失但后面1001-2000序号的数据发送后接收方返回的2001的确认序号 ACK应答报文没有出现丢失而2001的确认序号就表名在2001之前的数据都已经成功接收其中就包括了1-1000的数据所以即使 ACK应答报文出现了丢失后面的 ACK应答报文也能确认之前的数据被成功接收 所以在滑动窗口中 ACK应答报文丢包即使不做任何处理也是正确的 2.传输的数据丢包 如上图在滑动窗口批量传输数据时1001-2000这段数据出现了丢包此时接收方就没有收到1001-2000这段数据所以接收方之后返回的确认序号 ACK应答报文都是1001就像是提醒发送端“我想要的是1001这个数据”一样 当发送端连续收到多次“1001”这样的应答就会将对应的1001-2000的数据重新发送 此时接收端收到了1001后再次返回的确认序号 ACK应答报文就是7001了因为2001-7000的数据接收端之前就已经收到了被放到了接收端操作系统内核的接收缓冲区中 这种机制叫做“高速重发控制”也叫“快重传” 流量控制滑动窗口的补充 我们知道滑动窗口越大批量传输的数据越多传输效率越高但是窗口也不能无限大窗口要是太大了就有可能使接收方处理不过来或者使传输的中间链路处理不过来这样就会出现丢包就得重传了反而还影响了效率 流量控制就是给滑动窗口“踩踩刹车”避免窗口太大导致接收方处理不过来 流量控制就是根据接收方的处理能力来限制发送方的发送速度窗口大小 那我们如何衡量接收方的处理能力呢通过接收方的接收缓冲区剩余空间大小来进行衡量
接收缓冲区剩余空间大小越大说明接收方的处理能力越强发送方的发送速度窗口大小就可以越大反之亦然 发送方如何知道接收方的处理能力呢接收方接收到数据后都会给发送方发送ACK(应答报文)所以我们将接收方的接收缓冲区剩余空间大小通过ACK(应答报文)反馈给发送方作为发送方下一次发送数据窗口大小的依据 如上图发送端发送了1-1000的数据接收端返回的ACK(应答报文)不仅有确认序号1001还有接收端接收缓冲区的剩余空间大小3000字节发送端收到ACK(应答报文)以后便知道了接收端接收缓冲区还有3000字节的剩余空间大小于是发送了1001-4000共3000字节的数据给接收端当接收端返回的接收缓冲区剩余空间大小为0时发送端就会不停的发送一个无意义的数据作为探测信号去获取接收端接收缓冲区剩余空间大小当不为0时便可以继续传输数据。 滑动窗口并不是TCP就一定涉及 如果通讯双方大规模的传输数据那么肯定就是滑动窗口 如果通讯双方传输数据的规模比较少这个时候就不会用滑动窗口了依然按照之前的发一个数据就等待一个ACK应答报文的方式工作