zoukankan      html  css  js  c++  java
  • 关于滑动窗口协议的笔记

    滑动窗口协议

    还可以看我的另一篇博客,有更详细的介绍:http://www.cnblogs.com/xcywt/p/8401523.html

    属于TCP协议中的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。
    该协议允许发送方在停止并等待确认前发送多个数据分组。由于发送方不必每发送一个分组就停下来等待确认,所以该协议可以加速数据的传输,提高网络吞吐量。

    TCP利用一个滑动的窗口来告诉发送端对它所发送的数据能够提供多大的缓冲区,由16位定义,最大为65535个字节。

    滑动窗口本质上是描述接收方的TCO数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据。这个窗口大小为0时,发送方将停止发送数据。启动坚持定时器,等待这个窗口变成非0.

    持续定时器,收到对方的零窗口时,就启动该定时器,时间到了就发送一个字节的探测报文,对方此时会回应自身的窗口大小,如果仍然为0,就重置定时器,继续等待。

    窗口合拢:当窗口左边界向右靠近时,这种现象发生在数据被发送方确认时。
    窗口张开:窗口的右边界向右移动的时候。这种现象发生在接收端处理的数据的时候。
    窗口收缩:窗口右边界向左移动时,这种现象不常发生。
    TCP采用可变大小的滑动窗口大小是为了取得更好的性能。
    TCP规定的窗口大小是由接收方通告的,通过采取慢启动和拥塞避免算法等机制来使带宽和性能取得最佳

    传递效率问题:
    单个发送字节,单个确认,会使网络中增加很多不必要的报文(比如需要20字节的IP头,20字节的TCP头)。所以我们的原则是一次尽可能多发几个字节,或者窗口空余较多的时候通知发送方一次发送多个字节:
    Nagle算法:
    1)若发送应用程序要把发送的数据逐个字节的送到TCP的发送缓存,则发送方就把第一个字节先发送出去,其余的先缓存起来
    2)当第一个字节得到确认时(也得到了网络情况和对方窗口大小),再把缓冲区的剩余字节组成合适大小的报文发送出去。
    3)当到达的数据已达到发送窗口大小的一半或达到报文段的最大长度时就立即发送一个报文段(对于达到最大长度的情况:做法是让接受方等待一段时间,或者接收方获得足够的空间容纳一个报文段或接收方缓存有一半缓存时再通知发送方发送数据)

    关于拥塞控制可以看这个:http://www.cnblogs.com/xcywt/p/8414189.html
    拥塞控制
    就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。
    常用的方法就是:
    1)慢启动、拥塞控制
    2)快重传、快恢复


    发送方维护一个拥塞窗口(cwd)和慢启动门限(ssthresh)。
    cwd开始为1,确认一次之后变成2,成指数增加。直到到达ssthresh,改为拥塞避免算法。
    之后若发生拥堵,cwd变为1ssthresh减半,又进入慢启动。
    若连续收到3次某个包的ack,则进入快启动,快重传。
    ssthresh减半,cwd减为ssthresh减半后是数值,执行拥塞避免算法(高起点,线性增长)

    拥塞避免算法(让窗口缓慢增长,每经过一个往返时间RTT就把发送方的cwd1,线性缓慢增长)

  • 相关阅读:
    Nginx之负载均衡配置(二)
    Nginx之负载均衡配置(一)
    Nginx之反向代理配置(二)
    Nginx之反向代理配置(一)
    Nginx之常用基本配置(三)
    Nginx之常用基本配置(二)
    Nginx之常用基本配置(一)
    Linux系统WEB服务之Nginx基础入门
    Linux系统之LVS+Keepalived实现
    Linux系统之网络文件共享与数据实时同步实践
  • 原文地址:https://www.cnblogs.com/xcywt/p/8481109.html
Copyright © 2011-2022 走看看