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可靠传输的实现的更多相关文章

  1. 计算机网络(9)-----TCP可靠传输的实现

    TCP可靠传输的实现 以字节为单位的滑动窗口 滑动窗口的滑动是以字节为单位的,发送方A和接收方B在TCP三次握手的前两次握手时协商好了发送窗口和接受窗口的大小,发送方A根据B发送来的确认连接报文中标明 ...

  2. TCP可靠传输及流量控制实现原理

    一.为什么TCP是可靠传输? 1. 停止等待协议 通过确认与超时重传机制实现可靠传输 在发送完一个分组后,必须暂时保留已发送的分组的副本. 分组和确认分组都必须进行编号. 超时计时器的重传时间应当比数 ...

  3. 计算机网络概述 传输层 TCP可靠传输的实现

    TCP可靠传输的实现 TCP的可靠性表现在:它向应用层提供的数据是 无差错的.有序的.无丢失的,简单的说就是:TCP最终递交给应用层的数据和发送者发送的数据是一模一样的. TCP采用了流量控制.拥塞控 ...

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

    目录 1. 以字节为单位的滑动窗口 2. 超时重传时间的选择 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3- ...

  5. TCP可靠传输的工作原理

    TCP可靠传输的工作原理 一.停止等待协议 1.1.简介 在发送完一个分组后,必须暂时保留已发送的分组的副本. 分组和确认分组都必须进行编号. 超时计时器的重传时间应当比数据在分组传输的平均往返时间更 ...

  6. TCP 可靠传输与流量控制的实现

    TCP 可靠传输与流量控制的实现 一.TCP可靠传输的实现 现在所讲的可靠传输是根据之前所说的可靠传输原理的实现,是现实中应用的技术. 1.1.以字节为单位的滑动窗口 如图A端一份文件分为了多个字节, ...

  7. TCP可靠传输

    1. TCP 可靠性如何保证? 信道可靠:用三次握手.四次挥手保证连接正确: 数据正确:分区编号.校验和.超时重传: 传输控制:流量控制.拥塞控制 2. 重传机制 TCP可靠传输方式是序列号与确认应答 ...

  8. TCP可靠传输原理

    停止等待协议 "停止等待"就是发送方在发送完一个分组后停止发送,等待接收方的确认后再继续发送. 超时重传 发送方在等待一定时间后如果还没有收到接收方的确认,此时发送方将认定分组没有 ...

  9. 计算机网络传输层之TCP可靠传输

    文章转自:https://blog.csdn.net/weixin_43914604/article/details/105524592 学习课程:<2019王道考研计算机网络> 学习目的 ...

随机推荐

  1. 教你一步一步部署.net免费空间OpenShift系列之一------帐号注册和验证

    前几天有博友发布了一篇文章<一键部署mono 免费空间支持ASP.NET MVC 再也不担心伙食费换空间了>,支持MVC3和域名绑定,觉得不错,于是自己实践了一下,发现自己实际遇到的问题真 ...

  2. WebBrowser控件使用详解

    原文:WebBrowser控件使用详解 方法 说明 GoBack 相当于IE的“后退”按钮,使你在当前历史列表中后退一项 GoForward 相当于IE的“前进”按钮,使你在当前历史列表中前进一项 G ...

  3. C语言库函数大全及应用实例一

    原文:C语言库函数大全及应用实例一                                 [编程资料]C语言库函数大全及应用实例一 函数名: abort 功 能: 异常终止一个进程 用 法: ...

  4. 一个意想不到的CDO.Message 错误

    原文:一个意想不到的CDO.Message 错误   几个月之前,写了一个服务从MSMQ取消息发群发邮件的程序,一直也没时间测试,今日一试,出现发送邮件时报错,异常情况如下:   "Syst ...

  5. Wowza流媒体Live直播和VOD点播配置实战-attach

    Wowza是当今可以说最流行的流媒体服务器之一,近来因为需要搭建相应的服务器,但又不想用camera等作真实的直播,所以想办法用媒体文件转换成直播流再提供给Wowza进行直播.这里把该设置步骤以及设计 ...

  6. 使用线程执行堆栈StackTraceElement设计Android日志模块

    假设你想在你的Android自己主动打印程序MainActivity.onCreate(line:37)这样的类名.方法名称(行)登录如何实现? 1.介绍Java线程执行堆栈  Java.lang包中 ...

  7. 【蜗牛—漫漫IT路之大学篇(九) 】

    再来一篇叨叨的博客 近期,状态还是那个状态,人还是那个人. 前两天,感冒了,可能是宿舍阴面的事吧.然后,中午睡觉的时候穿着短袖披了一件外套,然后鼻子就不通气了.只是,前天晚上,我骑着崔国强的车子跑了不 ...

  8. 微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件

    原文:微软BI 之SSIS 系列 - 使用 Script Task 访问非 Windows 验证下的 SMTP 服务器发送邮件 开篇介绍 大多数情况下我们的 SSIS 包都会配置在 SQL Agent ...

  9. Mysql个人语句笔记

    --一些简单语句记录: /*mysql*/SHOW DATABASES CREATE DATABASE guoDROP DATABASE guo /*查看创建的数据库*/SHOW CREATE DAT ...

  10. Ubuntu下安装Python绘图库Matplotlib的方法

    在安装好Python的基础上, sudo apt-get install python-numpy sudo apt-get install python-scipy sudo apt-get ins ...