一文带你搞定TCP流量控制
摘要理想的流量控制实际的流量控制窗口关闭糊涂窗口综合征理想的流量控制
什么是流量控制?
流量控制就是发送方不能无脑的给接收方发送数据,它需要根据接收方的处理能力来发送数据。
理想下的流量控制?
理想意味着在实际中不存在,这里只是简单的说一下流量控制的作用,我们假设的理想通信发生条件为:客户端是接收方、服务端是发送方接收窗口和发送窗口相同,为200接收方和发送方在通信过程中始终保持相同的窗口大小
客户端发送请求数据服务端收到请求后,发送确认报文和80字节的数据,可用窗口减少为120(20080),SND。NXT指针变为321,表示发送方下次发送序列号为321的数据客户端收到数据后,接收窗口右移80字节,RCV。NXT为321,表示客户端段期望下一个收到的报文的序列号为321,并且发送ACK报文给服务端服务端发送120字节的数据,可用窗口变为0,服务端无法发送数据客户端收到120字节的数据,接收窗口右移120字节,接着发送ACK报文给客户端服务端收到序列号为241(长度为80字节)的ACK报文,因此SND。UNA右移80字节变为321(24180),可用窗口变为80字节服务端收到序列号321(长度为120字节)的ACK报文,因此SND。UNA右移120字节变为441(321120),可用窗口变为200字节服务端发送160字节的数据,可用窗口变为40字节,并且SND。NXT右移160个字节变为601(441160)客户端在收到数据后,接收窗口右移160字节,接着发送ACK报文给服务端服务端在收到ACK报文后,SND。UNAK右移160字节,并且可用窗口再次恢复为200字节实际的流量控制
操作系统缓冲区和滑动窗口的关系
由于我们发送的数据都是暂存在操作系统的内存缓冲区,所以滑动窗口会收操作系统缓冲区的影响:操作系统内存缓冲区会动态调整,影响窗口大小如果应用程序如果无法及时从缓冲区读取内容,也会导致缓冲区减少,此时滑动窗口需要适当调小,避免缓冲区内容溢出。
应用程序无法及时读取缓存
假设以下场景:客户端为发送方,服务端为接收方,初始化发送窗口和接收窗口都为360服务端繁忙,收到客户端数据后,应用层无法及时读取数据
客户端发送140字节的数据,可用窗口变为220(360140),SND。NXT右移140变为141(1140)服务端收到140字节的数据,应用程序只读取了40节数据,还有100字节存在于缓冲区中,于是接收窗口变为260(360100),服务端在给客户端发送ACK报文时会把新的窗口大小告知客户端。客户端在收到ACK报文以后,发送窗口减少为260,并且由于收到了数据的ACK,因此SND。UNA会右移140个字节变为141,此时可用窗口为260客户端继续发送180字节的数据,SND。NXT变为321,可用窗口变为80(26080)服务端在收到数据后,应用进程没有读取任何数据,于是接收窗口从260缩小为80(260180),并且在发送ACK报文时告知客户端客户端收到ACK报文以后,会将发送窗口减少为80,可用窗口此时也是80,因此到这里客户端最多只能发送80字节的数据给服务端客户端发送最后80字节的数据给服务端,可用窗口变为0服务端收到80字节的数据后,应用进程依然没有读取任何数据,于是接收窗口减少为0,并在发送ACK报文告知客户端客户端收到ACK报文以后,发现窗口大小为0,因此将发送窗口减少为0。
这里会有个问题,窗口变为0也就是发生了窗口关闭。
操作系统缓冲区变化
当服务器资源紧张,操作系统有可能会减少缓冲区的大小,如果此时应用程序还无法读取数据,那么将会出现数据包丢失现象。
客户端发送140字节数据,可用窗口变为220(360140)服务端收到140字节数据后,但是系统资源紧张,操作系统减少120字节的缓冲区,并且应用层没有读取任何数据,于是接收窗口变为100(360120140),然后发送ACK报文告知客户端在收到服务端的ACK报文前,客户端又发送了180字节的数据,可用窗口减少到40服务器收到180字节的数据后,由于接收窗口只有100字节,超出了缓冲区的大小,因此会丢弃该数据包客户端此时收到之前的ACK报文,会将发送窗口减少为100,此时可用窗口出现了负值80(100(321141))
在上述情况中,减少缓存先于收缩窗口发生,出现丢包现象。
为了防止上述情况,TCP规定是先收缩窗口,过段时间再减少缓存,这样避免丢包。窗口关闭
什么是窗口关闭
窗口大小为0,阻止发送方给接收方发送数据,直到窗口变为非0才能恢复发送。
窗口关闭的危险
窗口关闭以后发送端无法发送数据给接收端,只有当接收端处理完数据以后,这时候窗口回复,发送ACK报文信息给客户端,客户端才能恢复发送。但是一旦该ACK报文丢失,那么发送方会一直等待接收方的非0窗口通知,接收方也一直在等待发送方的数据,容易造成死锁现象。
如何解决窗口关闭带来的死锁?
只要TCP连接的一方收到对方0窗口的通知,就启动计时器,如果计时器超时就会发送窗口探测报文给对端,对端会给出自己的接收窗口大小。如果收到的窗口依然为0,发送方重启启动持续计时器如果收到的窗口不为0,恢复正常发送
窗口探测的次数一般为3次,每次大约3060s。如果三次以后接收窗口还是0,有的TCP实现就会发送RST报文来中止连接。糊涂窗口综合征
什么是糊涂窗口综合征?
如果接收方太忙,来不及取走缓冲区的数据,发送方的窗口会越来越小,最后如果接收方空出几个字节并告诉发送方现在有几个字节的窗口,发送方便会发送这几个字节,这就是糊涂窗口综合征。
糊涂窗口综合征的缺点?
TCPIP头部大约有40个字节,为了几个字节数据,需要加上头部相对大的开销,性价比极低。
糊涂窗口综合征的原因是?接收方会告知发送方一个小的窗口发送方可以发送小数据
如何避免接收方告知小窗口?
接收方在告知窗口时会采取一种策略:当窗口大小小于min(MSS,缓存空间2),就会向发送方告知窗口为0,避免发送方发送数据,等到接收方处理完一些数据后,窗口大小MSS或者有一半以上缓存空间可以使用时,就可以把窗口打开让发送方发送数据。
如何避免发送方发送小数据?
发送方在发送数据时采用Nagle算法,该算法的思路是延时处理,满足以下两个条件才可以发送数据:窗口大小MSS或是数据大小MSS收到之前发送数据的ACK报文
对于telnet或ssh这种小数据包交互场景的应用程序,需要关闭Nagle算法。在Java中,对Socket进行以下设置可以关闭Nagle算法。SocketsocketnewSocket();socket。setTcpNoDelay(true);
图法老王猎犬体味程度超低这样养护宠物狗才健康法老王猎犬是一种比较古老的犬种。在马耳他,它们是猎兔的能手,因此又被称为猎兔犬。一九七九年,马耳他政府更宣告这犬种成为国兽,并发行刻有其肖像的银币作纪念。法老王猎犬是现在……
图羽叶薰衣草蔫了怎么办三种方法拯救你的植物羽叶薰衣草是唇形科、薰衣草属的植物,它原生于加那利群岛,和加纳利薰衣草极相似,二者为近亲,但该种花型更为紧凑,颜色较深。现在各地均有普遍栽培。很多商家都喜欢在人们使用的各……
图巴吉度犬发情有征兆新手要这样照顾巴吉度犬又叫巴塞特猎犬,原产地为法国,到现在已经有约100年的历史了。曾经巴吉度是专门的步行狩猎犬,通常用来猎浣熊、狐、兔等小野兽,也可用来猎鸟。巴吉度犬是一种非常古老的……
抄书之旅正品低价好服务摘录:l1998年6月18日,刘强东24岁,仅有工作两年积攒下来的12000元。l北京,中关村海开市场,租下4平方米的摊位。l买了一台二手电脑,一辆二手三轮车……
图比利时寻血猎犬的饮食指南日常喂养需遵循这些寻血猎犬温柔、善良、与人类相处融洽,忠实于自己的主人。与同伴相处和谐,比较固执。它们性格文书,既不和同伴争吵也不和其他犬争吵,是较为友善的狗狗。经过长期的考据,人们已经可……
图樱桃种子盆栽四步养出甜美果实樱桃是一种常见的水果,这种水果甜美多汁,颜色鲜艳欲滴,非常受欢迎。而用樱桃种子种成的盆栽也一直很受人们的喜爱,那么这种盆栽应该如何去养护呢?说到樱桃,可能很多朋友想到的都……
图贵宾犬巧克力色变色的真相美毛粉千万别乱用除了白色的狗狗,其它大部分的贵宾都会变色。对贵宾狗来说,毛色褪色是自然现象。不过如果养护比较得当的话,就能减缓狗狗毛发褪色的时间,而且毛发还能变得更加光亮柔软。很多人都特……
图银杏种子种植方法事先催芽是必不可少的银杏为银杏科、银杏属落叶乔木。银杏树的果实俗称白果,因此银杏又名白果树,而它的种子就是从果实之中剥出来的核,那么,这种植物的种子应该怎么种植呢?每年一到了十一月份左右的时……
图苏格兰牧羊犬好养吗这样护理才更轻松苏格兰牧羊犬又名柯利牧羊犬,是充满灵性的犬中明星。这种狗狗出现的频率比较高,从古老的畜牧作业犬到影视作品中不断出现的主角,它的机警、聪慧都给人留下了深刻印象。苏牧原来生活……
图怎样水培茶花才易成活五个培植步骤一定要做好茶花的花朵饱满而艳丽,用它装饰环境真是再适合不过。而喜欢在室内培植茶花的朋友,多数都选用水培的方式。那么,进行茶花水培时,要怎么做才能让其快速成活呢?茶花是种观赏度很高的……
今天是2022年11月24日,星期四,农历十一月初一(感恩节〔太阳〕早安今天〔太阳〕感恩节到了,心怀感恩,所遇皆温柔,感谢生命中的,每一位亲人和朋友,感恩每一个失落的瞬间,都有你们陪伴,感恩父母赐予生命,感恩所有……
图玉露怎么养怎么配土颗粒和泥炭的多少要把握好玉露是独尾草科也就是百合科、瓦苇属的多肉植物。玉露植株玲珑小巧,种类丰富,叶色晶莹剔透,富于变化,非常可爱,是近年来人气较旺的小型多肉植物品种之一。提到多肉,很多朋友应该……