谈谈TCP控制那些事

TCP两个重要窗口滑动窗口滑动窗口是 接受数据 端使用的窗口大小,用来告知发送端接收端的缓存大小,以此可以控制发送端发送数据的大小,从而达到流量控制的目的,对应==>rwnd:接收端窗口(receiver window)
对于流量控制,是一个端对端的概念 。由接收端返回的rwnd控制 。
拥塞窗口那么对于数据的 发送数据 端就是拥塞窗口,拥塞窗口不代表缓存,拥塞窗口指某一源端数据流在一个RTT内可以最多发送的 数据包 数,cwnd:发送端窗口( congestion window ) 。
发送端数据结构为了保证顺序性,每?个包都有?个ID 。在建?连接的时候,会商定起始的ID是什么,然后 按照ID?个个发送 。为了保证不丢包,对于发送的包都要进?应答,但是这个应答也不是?个?个来的,?是会应答某个之前 的ID,表示都收到了,这种模式称为累计确认或者累计应答(cumulative acknowledgment) 。为了记录所有发送的包和接收的包,TCP也需要发送端和接收端分别都有缓存来保存这些记录 。发送端的缓存?是按照包的ID ?个个排列,根据处理的情况分成四个部分 。第?部分:发送了并且已经确认的 。这部分就是你交代下属的,并且也做完了的,应该划掉的 。第?部分:发送了并且尚未确认的 。这部分是你交代下属的,但是还没做完的,需要等待做完的回复之后,才能划掉 。第三部分:没有发送,但是已经等待发送的 。这部分是你还没有交代给下属,但是?上就要交代的 。第四部分:没有发送,并且暂时还不会发送的 。这部分是你还没有交代给下属,?且暂时还不会交代给下属的 。在TCP?,接收端会给发送端报?个窗?的??,叫Advertised window 。这个窗 ?的??应该等于上?的第?部分加上第三部分,就是已经交代了没做完的加上?上要交代的 。超过这个窗?的,接收端做不 过来,就不能发送了 。于是,发送端需要保持下?的数据结构 。
![image-20200308202456487](
file://C:/Users//AppData/Roaming/Typora/typora-user-images/image-20200308202456487.png?lastModify=1583671098)LastByteAcked:第?部分和第?部分的分界线 LastByteSent:第?部分和第三部分的分界线 LastByteAcked + AdvertisedWindow:第三部分和第四部分的分界线 对于接收端来讲,它的缓存?记录的内容要简单?些 。
拥塞控制和流量控制的区别拥塞控制:拥塞控制是作用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的情况;常用的方法就是:

  1. 慢开始、拥塞避免
  2. 快重传、快恢复
流量控制:流量控制是作用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的 。
接收端数据结构第?部分:接受并且确认过的 。也就是我领导交代给我,并且我做完的 。第?部分:还没接收,但是?上就能接收的 。也即是我??的能够接受的最??作量 。第三部分:还没接收,也没法接收的 。也即超过?作量的部分,实在做不完 。对应的数据结构就像这样 。
![image-20200308202704928](file://C:/Users/TYH/AppData/Roaming/Typora/typora-user-images/image-20200308202704928.png?lastModify=1583671098)
MaxRcvBuffer:最?缓存的量; LastByteRead之后是已经接收了,但是还没被应?层读取的; NextByteExpected是第?部分和第?部分的分界线 。第?部分的窗?有多?呢? NextByteExpected和LastByteRead的差其实是还没被应?层读取的部分占?掉的MaxRcvBuffer的量,我们定义为A 。AdvertisedWindow其实是MaxRcvBuffer减去A 。也就是:AdvertisedWindow=MaxRcvBuffer-((NextByteExpected-1)-LastByteRead) 。那第?部分和第三部分的分界线在哪?呢?NextByteExpected加AdvertisedWindow就是第?部分和第三部分的分界线,其实 也就是LastByteRead加上MaxRcvBuffer 。其中第?部分??,由于受到的包可能不是顺序的,会出现空挡,只有和第?部分连续的,可以?上进?回复,中间空着的部 分需要等待,哪怕后?的已经来了 。
流量控制如何控制接收方每次收到数据包,可以在发送确定报文的时候,同时告诉发送方自己的缓存区还剩余多少是空闲的,我们也把缓存区的剩余大小称之为接收窗口大小,用变量win来表示接收窗口的大小 。
发送方收到之后,便会调整自己的发送速率,也就是调整自己发送窗口的大小,当发送方收到接收窗口的大小为0时,发送方就会停止发送数据,防止出现大量丢包情况的发生 。
发送方何时再继续发送数据当发送方停止发送数据后,该怎样才能知道自己可以继续发送数据?
【谈谈TCP控制那些事】我们可以采用这样的策略:当接收方处理好数据,接受窗口 win > 0 时,接收方发个通知报文去通知发送方,告诉他可以继续发送数据了 。当发送方收到窗口大于0的报文时,就继续发送数据 。


推荐阅读