zoukankan      html  css  js  c++  java
  • 运输层6——TCP可靠传输的实现

    写在前面:本文章是针对《计算机网络第七版》的学习笔记

    运输层1——运输层协议概述

    运输层2——用户数据报协议UDP

    运输层3——传输控制协议TCP概述

    运输层4——TCP可靠运输的工作原理

    运输层5——TCP报文段的首部格式

    运输层6——TCP可靠传输的实现

    运输层7——TCP的流量控制和拥塞控制

    运输层8——TCP运输连接管理

    首先为了方便解释,先假定数据传输只在一个方向上进行。

    5d357034d3d6955080

    • 假定A收到了B发来的确认报文段,其中窗口为20字节,确认号是31。如上图所示,A构造出了字节的发送窗口,窗口内是允许发送的序号。

    5d35719c4333b80169

    • 假定A发送了31-41的数据,这时窗口位置未发生改变,但是窗口内前11个字节表示已经发送但是未收到确认,而后面9个字节表示允许发送但尚未发送。

      从以上所述,要描述一个窗口需要3个指针:P1,P2,P3:

      • 小于P1,发送结束且已经被确认;

      • 大于P3,不允许发送;

      • P3-P1,窗口的大小;

      • P2-P1,已发送但未确认;

      • P3-P2,允许发送但未发送

    • B的接收窗口是20。在接收窗口外面,到30字节的数据已经接收到,并且交付给主机了,因此不必保留。31-50是允许接收的。B收到了32、33,但是没有收到31,数据没有按序到达。因为B只能对按序到达的最高序号给出确认,因此B发送的确认号依然是31.

    5d35746b241a855203

    • 现在假定B收到了31,并把31-33交付给给主机,接着把接收窗口向前移动3个字节,并且向A发送确认,同时窗口值仍然为20字节,但确认号34。未按序到达的37、38、40先暂存在接收窗口中。

    • A接收到B的确认后,把发送窗口向前滑动3个序号,指针p2不动。但是A的窗口增大了,可发送的序号42-53。

    5d357643ed6c572776

    • A继续发送序号42-53的数据,指针P2向前移动和P3重合。发送窗口内的序号已经用完,但是还没有再收到确认。若A在规定时间内没有收到B的确认,A就重传这部分数据,如果收到的确认号在窗口内,则继续向前移动窗口并发送数据。

    窗口和缓存的关系

    发送方的应用程序把字节流写入TCP的发送缓存,接收方的应用进程从TCP的接收缓存中读取字节流。下图表示了发送应用程序以及接收应用程序中窗口与缓存的关系。

    5d3577faf017a20141

    5d3578075a92521308

    需要指出的是:

    • 缓存空间和序号空间是有限的,并且都是循环使用。

    • 实际的缓存和窗口非常大。

    发送缓存:

    • 发送应用程序传送给发送方TCP准备发送的数据;

    • TCP已发送,但尚未确认的数据。

    接收缓存:

    • 按序到达,但未被接收程序读取的数据;

    • 未按序到达的数据。

    此外,还需要注意:

    • 虽然A的发送窗口值是根据B的接收窗口值设定的,但是同一时刻,发送窗口大小和接收窗口大小并不总是相等的;

    • 对于不按序到达的数据如何处理,TCP并无明确规定;

    • TCP要求接收方必须有累积确认的能力,这样可以减少传输开销。

    最后,TCP是全双工通信,每一方都有发送窗口和接收窗口。

    2. 超时重传时间的选择

    如果超时重传时间设置的太短,就会引起很多段报文的不必要重传,是网络负荷增大。但若把超时重传时间设置得过长,又使网络的空闲时间增大,降低了传输效率。

    TCP采用一种自适应算法,它记录一个报文段发出的时间,以及收到相应的确认的时间。这里有两个概念:

    • 报文段的往返时间:RTT

    • 加权平均往返时间:RTTs,又称平滑的往返时间

    其中:

         新的RTTs = (1-a)*旧的RTTs + a*新的RTT
    

    a的推荐值为0.125。

    显然,超时计时器设置的超时重传时间RTO应该略大于RTTs。RTO可以根据下式计算:

         RTO = RTTs + 4 * RTTD
    

    RTTD是RTT的偏差的加权平均值,它与RTTs和新的RTT样本之差有关。当第一次测量时,RTTD取为测量到的RTT值的一半,往后计算中:

         新的RTTD = (1-b)* 旧的RTTD + b * |RTTs - 新的RTT样本| 
    

    b的推荐值为0.25。

  • 相关阅读:
    机器学习八
    机器学习七
    机器学习六
    机器学习五
    JMeter获取复杂的JSON串中的参数的值
    Jmeter返回参数值写入文件
    python 连接数据库
    jmeter返回的Unicode转换成utf8
    Appium与python自动测试环境及demo详解
    python解析复杂json字符串
  • 原文地址:https://www.cnblogs.com/anzhengyu/p/11232782.html
Copyright © 2011-2022 走看看