TCP拥塞控制的实现

TCP拥塞控制的实现本文只是对TCP协议做个简要的介绍。TCP协议,即传输控制协议,与UDP协议同处于传输层,同样使用相同的网络层,但TCP提供了一种可靠的、面向连接的数据传输服务,它会在两个使用TCP的应用之间建立一个TCP连接,在该连接上进行数据的传输。TCP通过以下方式提供可靠性:1、应用程序被分割成TCP认为最合适发送的数据块。这点与UDP完全不同,应用程序产生的UDP数据报长度将保持不变,加上IP首部后,才会

大家好,又见面了,我是你们的朋友全栈君。

前言
计算机网络中的带宽、交换节点中的缓存和处理机等,都是网络的资源,在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就要变坏,这种情况就叫做拥塞。

所谓拥塞控制,就是防止过多的数据注入到网络中,从而使网络中的路由器或链路不致过载。要注意用拥塞控制与流量控制的区别,拥塞控制是一个全局性的过程,涉及到所有的额主机、路由器,以及与降低网

拥塞控制的算法有:慢开始、拥塞避免、快重传、快恢复四种。

慢开始和拥塞避免
发送方维持一个拥塞窗口的状态变量,其大小取决于网络的拥塞程度,动态地变化,而发送窗口一般取拥塞窗口和对方给出的接收窗口的最小值(为了便于描述,后面的分析中假定对方给出的接收窗口足够大,这样将发送窗口等于拥塞窗口就可以了)。

慢开始算法的核心是从小到大逐渐增大发送窗口,也就是说,从小到大逐渐增大拥塞窗口的数值。通常在刚开始发送报文段时,先把拥塞窗口设置为一个最大报文段MSS的数值,而在每收到对上一轮报文段(,每次加倍后的报文段的个数,可能不止一个报文段)的确认后,就把拥塞窗口的数值加倍。

为了防止拥塞窗口增长过大引起网络拥塞,还需要维护一个慢开始门限的状态变量,当拥塞窗口的值小于慢开始门限时,使用慢开始算法,一旦拥塞窗口的值大于慢开始门限的值,就改用拥塞避免算法。

拥塞避免算法的思路是让拥塞窗口缓慢地增大,收到每一轮的确认后,将拥塞窗口的值加1,而不是加倍,这样拥塞窗口的值按照线性规律缓慢增长。

无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(没有按时收到确认),就把慢开始门限设置为出现拥塞时发送窗口值的一般,但最小不能小于2个MSS值,而后把拥塞窗口的值重新设置为1个MSS,执行慢开始算法。

快重传和快恢复
快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(重复发送对前面有序部分的确认),而不是等待自己发送数据时才进行稍待确认,也不是累积收到的报文发送累积确认,如果发送方连续收到三个重复确认,就应该立即重传对方未收到的报文段(有收到重复确认,说明后面的报文段都送达了,只有中间丢失的报文段没送达)。

快恢复算法与快重传算法配合使用,其过程有如下两个要点:

1、当发送方连续收到三个重复确认时,就把慢开始门限减半,这是为了预防网络发生拥塞。注意,接下来不执行慢开始算法。

2、由于发送方现在认为网络很很可能没有发生特别严重的阻塞(如果发生了严重阻塞的话,就不会一连有好几个报文段到达接收方,就不会导致接收方连续发送重复确认),因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口的值不设为1个MSSS),而是把拥塞窗口的值设为慢开始门限减半后的值,而后开始执行拥塞避免算法,线性地增大拥塞窗口。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152767.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • malloc函数java_malloc函数详解及用法举例[通俗易懂]

    malloc函数java_malloc函数详解及用法举例[通俗易懂]malloc动态内存分配函数原理详解及编程用法举例(本文由www.169it.com搜集整理)malloc函数函数原型定义void*malloc(size_tsize);malloc函数原型说明malloc函数向系统申请分配size个字节的内存空间。返回值类型是void*类型。void*表示未确定类型的指针。c,c++规定,void*类型可以强制转换为任何其它类型的指针。malloc动…

    2022年5月5日
    127
  • APK 签名详解

    APK 签名详解1.签名的意义  为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的PackageName来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性。2.签名对你的App的影响。   你不可能只做一个APP,你可能有一个宏伟的战略工程,想要在生活,服务,游戏,系统各个领域都想插足的话,你不可能只做一个APP,谷歌建议你把你所有的

    2022年6月5日
    78
  • (实用篇)使用PHP生成PDF文档

    (实用篇)使用PHP生成PDF文档

    2021年10月8日
    36
  • com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定[通俗易懂]

    com.mysql.jdbc.Driver 和 com.mysql.cj.jdbc.Driver的区别 serverTimezone设定[通俗易懂]com.mysql.jdbc.Driver是mysql-connector-java5中的,com.mysql.cj.jdbc.Driver是mysql-connector-java6中的1,JDBC连接Mysql5com.mysql.jdbc.Driver:driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localho

    2022年6月23日
    22
  • opengrok使用教程之单工程(上)

    opengrok使用教程之单工程(上)OpenGrok简介有些情况下,我们需要在GB级别甚至几十GB级别且随时不断更新的大型代码(比如Android源码)里面搜索阅读源码,那么我们自然而然会有以下一些基本的需求:能够快速搜索代码代码可存放于本地/服务器代码之间可以跳转跨平台易于维护…显然SourceInsight、ctags、grep等工具在这些场景下就不太适合,于是有了OpenGrok这类代码搜索引擎。先看看维…

    2022年5月29日
    102
  • Java遍历Map效率对比

    Java遍历Map效率对比Java中Map容器的遍历有多种方式,但是不同的方式效率会大有不同,以前没有注意这些细节,随意使用遍历方式在本地可能没有什么影响,但是在项目在高频使用需要特别注意,尽量使用高效的方式。首先,Map.Entry<K,V>是可以包含了Key和Value的,keySet包含了所有的Key,再使用get方法可以拿到对应的Value;所以包含Key和Value内容…

    2022年4月7日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号