• TCP的滑动窗口和流量控制


    1. 滑动窗口

    TCP每发送一个数据,都要收到一个确认应答。并且序列号是递增的。当上一个数据包收到应答,再发送下一个。这样效率很低。
    于是,引入了窗口的概念,窗口大小,就是一次能并行发送消息的最大值。
    相应的序列号应答,即使中间有丢失,收到最后的应答,也认为是成功接收所有数据了,这种模式就是 累计确认 或 累计应答。
    窗口实际上是操作系统开辟的缓存区域,发送方的叫发送窗口,接收方的叫接收窗口。
    发送窗口应该小于等于接收窗口。

    发送方,依据发送窗口发送数据,接收方接收到数据,放在接收窗口中,此时接收窗口减小,接收方返回window字段,告诉发送方,
    接收窗口大小,发送窗口减小。两端的窗口不断变化,这个就是滑动窗口的机制。

    当然,如果接收方不能及时的返回窗口大小,发送方可能过量的发送数据,这样会造成数据丢失。

    2. 流量控制

    也是依据滑动窗口的原理,调整窗口的大小,避免流量过大或过小。

    2.1 窗口探测

    当发送窗口降为0,接收窗口迟迟不能返回新的非0窗口值,会陷入死锁。两边都在等待对方。
    TCP有窗口探测机制,发送方在窗口为0时候,会启动计时机制,在超时未收到窗口信息,就会发送窗口探测包,以便知道接收方窗口是否发生了改变。

    2.2 糊涂窗口综合症

    接收方太忙,无时间处理接收的数据,并不断返回窗口大小,导致发送窗口越来越小。发送窗口也会继续发送几个字节的数据,导致流量浪费,因为TCP + IP头就有
    40个字节的数据,发送几个字节,非常不经济。

    为了避免这种情况,通常规定接受窗口小于缓存的一半MSS,就返回0,不返回小窗口值

    而发送方,使用Nagle算法:

    1. 窗口大小 >= MSS 或 数据大小 >= MSS
    2. 收到之前数据包的ACK应答

    两者都满足才会发送数据

    参考: https://baijiahao.baidu.com/s?id=1664395039305097355&wfr=spider&for=pc

  • 相关阅读:
    mysql改为mysqli几项注意
    修改链接服务器地址提高下载速度
    果然最适合码农的博客还是博客园
    mysql
    php 检测字符集
    Internet Download Manager has been registered with a fake Serial Number
    SVN图标不见了
    理解createTrackbar函数
    程序块结构
    数组初始化
  • 原文地址:https://www.cnblogs.com/mengff/p/13573846.html
Copyright © 2020-2023  润新知