1.概述

     为方便描述可靠传输原理,假定数据传输只在一个方向上进行,即A发送数据,B给出确认
2.以字节为单位的滑动窗口
     TCP的滑动窗口是以字节为单位的。为了便于说明,字节编号取得很小。先假定A收到B发来的确认报文字段,其中窗口是20字节,而确认号是31字节。(表明B期望接收到的下一个序号是31,序号30之前的数据已经收到了)。如图所示。
  • A的发送窗口:

发送窗口表示:在没有收到B的确认的情况下,可以连续把窗口内的数据发送出去。凡是已经发送过的数据,在未收到确认之前都必须暂时保留,以便超时重传使用。

     发送窗口有如下特点:
          1)发送窗口里面的序号表示允许发送的序号(如31~50)
          2)发送窗口的位置由窗口的前沿和后沿的位置共同确定。发送窗口的后沿可能不动(没有收到确认),或者前移(收到新的确认)。发送窗口的前沿通常是不断的向前移动,但也可能不动。
     现在假定A发送了序号为31-41的数据,如上图所示,图种可以看出要描述一个发送窗口的状态需要三个指针P1, P2, P3。
     小于P1的是已发送并收到确认的部分,大于P3的是不允许发送部分。
     P3-P1 = A的发送窗口(又称为通知窗口)
     P2-P1 = 已发送但尚未收到确认的字节数
     P3-P2 = 允许发送但尚未收到的字节数(又称为可用窗口或有效窗口)
  • B的接收过程:

B的接收窗口大小为20。在接收窗口外面,到30号为止的数据均发送过确认并交付主机使用,因此B不再保留(之前的数据)。

     如图所示,B收到了32和33的数据。这些数据没有按序到达,因为序号为31的数据没有收到。由于B只能对按序到达的数据中的最高序号给出确认,因此B的发送的确认号仍然是31,而不能是32或33。现在假定B收到序号为31的数据并把序号为31-33的数据交付给主机,然后B删除这些数据。接着把接收窗口向前移动3个序号,同时给A发出确认。其窗口值仍未20,但确认号34,表明B已经接收到序号33为止的数据。而B收到的37 38 40的数据没有按序到达,先暂存在接收窗口中。
     如果按照以上的方式进行发送数据。当发送窗口已满,可用窗口减小到0,因此发送停止。如果发送窗口内所有数据都正确到达B,而发出的确认由于网络问题没有到达A,为保证传输,此时A只能认为B还没有收到这部分数据。于是A经过一段时间过(由超时计时器控制)重传这部分数据,直到收到B的确认为止。
3.缓存机制
     发送方的应用进程把字节流写入了TCP的发送缓存,接收方的应用进程从TCP的接受缓存中读取字节流。下面进一步谈论窗口与缓存的关系。注:缓存空间和序号空间都是有限的并且循环使用的。
  • 发送缓存和发送窗口

     发送缓存用来暂时存放:1.发送应用程序传送给发送方TCP准备的数据2.TCP已发送但尚未收到确认的数据。
     发送窗口通常只是发送缓存的一部分。已被确认的数据应当从发送缓存中删除,因此发送缓存与发送窗口的后沿是重合的。发送应用程序必须控制写入缓存的速率,不能太快,否则发送缓存就会没有存放数据的空间。
  • 接收缓存与接收窗口

     接收缓存用来暂时存放:1.按序到达的,但尚未被接收应用程序读取的数据。2,未按序到达的数据。
     如果收到的分组检测出有差错,则要丢弃。如果接收应用程序来不及读取收到的数据,接收缓存最终就会被填满。使接收窗口减小到0.反之,接收应用程序能够及时从接收缓存中读取收到数据,接收窗口就会变大,但最大也不能超过接收缓存的大小。
4.超时重传的时间选择
     TCP每发送一个报文段,就对这个报文段设置一次计时器。只要计时器设置的重传时间到还没有收到确认,就要重传这个报文段。由于数据链路层和运输层的往返实验概率分布存在很大差异,因此有必要选择合适的超时重传时间。
     报文段的往返时延是指收到确认报文的时间与每一个报文段发出的时间之差。报文段的平均往返时延RTT是由各个报文段的往返时延样本加权平均得出来的。计算公式为:
     平均往返时延RTT=α×(旧的RTT)+(1-α)×(新的往返时延样本),1 ≤ α < 1 典型的值为α为7/8.
 
     即使有一个好的RTT,要选择一个合适的超时重传时间RTO(Restransmission Time out)仍然不是一个容易的事情。, 显然RTO要大于RTT。其计算公式为 RTO = β × RTT, β > 1, 推荐是2
 
5.选择确认SACK
     若收到的报文段无差错,只是未按序号,中间还缺少一些序号的数据,采用选择确认的方法来传送缺少的数据,而不重传已经正确接收到的数据。
     用一个例子来说明(Selctive ACK)工作原理。如图所示,接收放收到了前面的字节流不连续的两个字节块。如果这些字节的序号都在接收窗口内,那么接收方就先收下这些数据,但要把这些信息准确的告诉发送放,使发送方不要在重复发送这些已经收到的数据。
     
     TCP首部没有哪个字段能够提供上述这些字节快的边界信息。如果要使用选择确认,那么在建立TCP连接时,就要在TCP首部的选项上加上“允许SACK”的选项。
     

TCP/IP详解学习笔记(14)-- TCP可靠传输的实现的更多相关文章

  1. TCP/IP详解学习笔记(14)-TCP连接的未来和性能(未写完)

    在TCP刚出世的时候,其主要工作环境是以太网和SLIP之类的低速网络.随着高速网络的出现,让TCP协议的吞吐量更大,效率更高的要求就愈来愈迫切.为此,TCP增加了三个重要机制来对应现在的变化,他们是 ...

  2. TCP/IP详解学习笔记(9)-TCP协议概述

    终于看到了TCP协议,这是TCP/IP详解里面最重要也是最精彩的部分,要花大力气来读.前面的TFTP和BOOTP都是一些简单的协议,就不写笔记了,写起来也没啥东西. TCP和UDP处在同一层---运输 ...

  3. TCP/IP详解学习笔记(10)-TCP连接的建立与中止

    TCP是一个面向连接的协议,所以在连接双方发送数据之前,都需要首先建立一条连接.这和前面讲到的协议完全不同.前面讲的所有协议都只是发送数据而已,大多数都不关心发送的数据是不是送到,UDP尤其明显,从编 ...

  4. TCP/IP详解学习笔记(11)-TCP交互数据流,成块数据流

    目前建立在TCP协议上的网络协议特别多,有telnet,ssh,有ftp,有http等等.这些协议又可以根据数据吞吐量来大致分成两大类:(1)交互数据类型,例如telnet,ssh,这种类型的协议在大 ...

  5. TCP/IP详解学习笔记(13)-TCP坚持定时器,TCP保活定时器

    TCP一共有四个主要的定时器,前面已经讲到了一个--超时定时器--是TCP里面最复杂的一个,另外的三个是: 坚持定时器 保活定时器 2MSL定时器 其中坚持定时器用于防止通告窗口为0以后双方互相等待死 ...

  6. TCP/IP详解学习笔记(12)-TCP的超时与重传

    超时重传是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止. 1.超时 超 ...

  7. TCP/IP详解学习笔记

    TCP/IP详解学习笔记(1)-基本概念 TCP/IP详解学习笔记(2)-数据链路层 TCP/IP详解学习笔记(3)-IP协议,ARP协议,RARP协议 TCP/IP详解学习笔记(4)-ICMP协议, ...

  8. TCP/IP详解学习笔记 这位仁兄写得太好了

      TCP/IP详解学习笔记(1)-基本概念 为什么会有TCP/IP协议 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别.就好像圣 ...

  9. TCP/IP详解学习笔记 这位仁兄写得太好了.(转载)

    TCP/IP详解学习笔记   这位仁兄写得太好了   TCP/IP详解学习笔记   这位仁兄写得太好了. http://blog.csdn.net/goodboy1881/category/20444 ...

  10. 【转】TCP/IP详解学习笔记(二)

    TCP/IP详解学习笔记(5)-IP选路,动态选路,和一些细节 1.静态IP选路 1.1.一个简单的路由表 选路是IP层最重要的一个功能之一.前面的部分已经简单的讲过路由器是通过何种规则来根据IP数据 ...

随机推荐

  1. Visual Studio 2012 比较好用的插件推荐

    为了高效率的开发,下面笔者推荐几款非常不错的插件,方便大家.   以上控件的安装方式是: 然后通过联网的方式下载,安装后,需要重启一下Visual Studio方可使用.

  2. linux命令(11)下查看和添加环境变量

    &PATH:决定了shell将到哪些目录中去寻找命令或者程序,PATH值是一系列的目录,当你要运行一个程序时,Linux在这些目录下进行搜寻编译链接. 编辑PATH 声明,其格式为: PATH ...

  3. SteamVR Unity工具包(VRTK)之激光和移动

    简单激光指针(VRTK_ SimplePointer) 简单指针(Simple Pointer)脚本从控制器尾部发出一个有色光束来模拟激光束.这在场景中指向对象很有用,它能判断所指向的对象以及对象距控 ...

  4. Git hub pull时候的错误 : The current branch is not configured for pull No value for key branch.master.merge found in configuration

    网上多半都是命令行下的解决方案,我用的是EGit,所以要在eclipse里(我的版本是kepler)把下面这句话添加到配置文件中. Window->Preference->Team-> ...

  5. 使用maven下载依赖包及maven常见问题汇总

    最近下载了SPRING3.1.4,发现只有SPRING相关的源码,没有其依赖的jar包.SPRING依赖的jar相当多,自己一个一个的下载比较费劲,就仔细阅读了SPRING下载说明,新版本的SPRIN ...

  6. google protobuf 简单实例

    1.定义proto文件: User.proto package netty; option java_package="myprotobuf"; option java_outer ...

  7. distinct 多个字段

    select distinct ID,AA,BB from tName与select distinct ID from tName有什么区别??第一种情况,distinct会不会影响AA,或者BB字段 ...

  8. 20145305 《Java程序设计》第2周学习总结

    教材学习内容总结 1.boolean类型可表示true与false 2.储存值超类型范围会出现溢值 3.变量在命名时不可以使用数字作为开头,不可以使用一些特殊字符,不可以与JAVA关键词同名,不可以与 ...

  9. NLog文章系列——如何配置NLog(转)

    NLog使用方法 作者:Jaros?aw Kowalski <> 翻译:CrazyCoder(由衷感谢他的热心!!) 原文:http://www.nlog-project.org/conf ...

  10. spring应用于web项目中

    目标: 在webapp启动的时候取到spring的applicationContext对象,并把applicationContext对象存到servletContext里面,在需要的时候直接从serv ...