• [TCP IP详解:学习笔记]TCP定时器


           对每个TCP连接,TCP管理4个不同的定时器

    1. 重传定时器使用与当希望收到另一端的确认。如果当定时器溢出时还没有收到确认,TCP连接将重传该数据;
    2. 坚持定时器是窗口大小信息保持不断流动,即使另一端关闭了其接收窗口;
    3. 保活定时器可检测一个空闲连接的另一端何时崩溃或重启;
    4. 2 MSL定时器测量一个连接处于TIME_WAIT状态的时间。

      TCP的超时与重传

      TCP超时与重传中对重要的部分就是对一个给定连接的往返时间(RTT)的测量,通过RTT的变化来改变其超时时间。

      拥塞避免算法和慢启动算法是两个目的不同、独立的算法。但是当拥塞发生时,希望降低分组进入网络的传输速率,于是可以调用慢启动来做到这一点。

      拥塞避免算法和慢启动算法需要对每个TCP连接维持两个变量:

    1. 拥塞窗口cwnd;
    2. 慢启动门限ssthresh;

      拥塞避免算法算法的工作过程

    1. 对一个给定的连接,初始化cwnd为1个报文段,ssthresh为65535个字节;
    2. TCP输出历程的输出不能超过cwnd和接收方通告窗口的大小。拥塞避免是发送方感受到的网络拥塞的估计,而通告窗口则与接收方在该链接上的可用缓存大小有关;
    3. 当拥塞发生时(超时或收到重复确认),ssthresh被设置为当前窗口大小(cwnd和接收方通过窗口大小的最小值,但最少为1个报文段)的一半。此外,如果是超时引起了拥塞,则cwnd被设置为1个报文段(也就是慢启动);
    4. 当新的数据被对方确认时,就增加cwnd,但增加的方法依赖于是否正在进行慢启动或拥塞避免。如果cwnd小于或等于ssthresh,则正在进行慢启动,否则正在进行拥塞避免。慢启动一直持续到我们回到当拥塞发送时所处位置的一半的时候才停止,然后转为执行拥塞避免。

      快速恢复算法的工作过程

    1. 当收到第3个重复的ACK时,将ssthresh设置为当前拥塞窗口cwnd的一半。重传丢失的报文段。设置cwnd为ssthresh加上3倍的报文段大小;
    2. 每次收到另一个重复的ACK时,cwnd增加1个报文段大小并发送1个分组(如果新的cwnd允许发送);
    3. 当下一个确认新数据的ACK到达时,设置cwnd为ssthresh。这个ACK应该是在进行重传后的一个往返时间内对步骤1中重传的确认。

      不再处于慢启动状态,而是进入了拥塞避免状态。新的cwnd值按以下方法计算:

     

      TCP能够遇到的最常见的ICMP差错就是源站抑制、主机不可达和网络不可达。基于伯克利的实现对这些错误的处理:

    1.  一个连接接收到源站抑制引起拥塞窗口cwnd被置为1个报文段大小来发送慢启动,但是慢启动门限ssthresh没有变化,所以窗口将打开直至它或者开放了所有的通路(受窗口大小和往返时间的限制)或者发生了拥塞;
    2. 一个连接接收到主机不可达或网络不可达,实际上都被忽略。

      当TCP超时并重传时,TCP允许进行重新分组而发送一个较大的报文段,这样有助于提高性能。这种方式在协议中是允许的,因为TCP是使用字节序号而不是报文段序号来进行识别它所要发送的数据和进行确认的。

      TCP的坚持定时器

      如果一个确认丢失了,则双方就有可能因为等待对方而使连接终止:接收方等待接收数据,而发送方在等待允许它继续发送数据的窗口更新。为了防止这种死锁情况的产生,发送方使用一个坚持定时器来周期性地想接收方查询,以便发现窗口是否已增大。

      如果发生糊涂窗口综合症SWS现象,则少量的数据将通过连接进行交换,而不是满长度的报文段。在任何一端采取措施来避免出现糊涂窗口综合症的现象:

    1. 接收方不通告小窗口。通常的算法是接收方不通告一个比当前窗口大的窗口(可以为0),除非窗口可以增加一个报文段大小(也就是将要接收的MSS)或者可以增加接收缓存窗口的一半,不论实际有多少;
    2. 发送方避免出现糊涂窗口综合症的措施是只有以下条件之一满足时才发送数据:
      •  可以发送一个满长度的报文段;
      •  可以发送至少是接收方通告窗口大小一半的报文段;
      •  可以发送任何数据并不希望接收ACK或者该连接上不能使用Nagle算法。

      TCP的保活定时器

           服务器通过TCP保活定时器来知道客户主机是否崩溃并关机或者崩溃又重新启动。例如,如果客户机已经消失了,使得在服务器上留下一个半开放连接,而服务器又在等待来自客户的数据,则服务器将永远等待下去。保活功能就是试图帮助服务器端来检测到这种半开放的连接

      如果一个给定的连接在两个小时内没有任何动作,则服务器就像客户端发送一个探查报文段。客户主机必须处于以下4种状态之一:

    1. 客户主机依然正常运行,并从服务器端可达。即客户的TCP响应正常,而服务器也知道对方是正常工作的。服务器在两个小时以后将保活定时器复位。如果在这2小时之内,应用程序与服务器端交换数据,则定时器在交换数据后的未来2小时再复位;
    2. 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应,服务器将不能收到对探查的响应,并在75秒后超时。
    3. 客户主机崩溃并已经重新启动。这时服务器将收到一个对其保活探查的响应,但是这个响应是一个复位,使得服务器终止这个连接;
    4. 客户主机正常运行,但是从服务器端不可达。与状态2相同,因为TCP不能够区分状态2和状态4之间的区别,它所能发现的就是没有收到探查的响应。
  • 相关阅读:
    Makefile文件(五)_使用变量
    Makefile文件(四)_书写命令
    Makefile文件(三)_书写规则
    Makefile文件(二)_总述
    Makefile文件(一)_介绍
    select、poll和epoll
    LintCode 子树
    LintCode 字符串查找
    LintCode 用栈实现队列
    LintCode 丑数
  • 原文地址:https://www.cnblogs.com/life91/p/3002060.html
Copyright © 2020-2023  润新知