可靠资料传输(Reliable Data Transfer 简称rdt)

资料可靠度是网络传输中非常大的问题之一。在TCP抽象服务的模型中(也算是理想状态),每个应用程序的讯息都透过网络上可靠的通道来传输,然而现实中的困难是 可靠传输协定的下层是不可靠。也就是说,现实中存在着许多状况,例如资料位元错误、封包遗失等等 造成资料的不可靠,必须建立有效的传输协定。

1、rdt1.0 
rdt的模型主要是用FSM(Finite State Machine-有限状态机)来定义状态与操作方式。 

rdt1.0是假设使用最可靠的通道情况。主要有传输端与接收端两个部分,资料传输方式很单纯,传输端等待上层传资料进来,收到上面的资料以后装成封包送出去。 
接收端收到封包以后,将封包解开,把讯息往上送。 
2、rdt2.0 
2.0考虑到了资料错误的情形,当接收端收到资料,会有ACK(相当于OK)与NAK(相当于Send Again)两种讯息,当资料接收到以后确认无误,会送ACK给来源已确定资料无误。当侦测到错误时 会传回NAK通知来源端再送一次。 

应对位错误,相对1.0增加的内容 
 
pkt加校验和 

无错误场景 

上次调用,wait ,接收方wait,计算校验和,产生分组,发给接收方,wait for ack,发送方提取数据(交付数据)发回发送方,发送方状态变迁返回初始状态。 

有错误的场景 

udt_send重传 

3、rdt2.1 
2.1新增了sequence number,同样使用ACK与NAK来确认讯息,封包的号码可以用来确认是否重新传输封包。 
例如接收端在等待编号0的封包,结果收到封包1,此时会回传ACK1给来源端,而正在等候ACK0的来源端收到ACK1 表示封包0可能遗失,所以会再重送封包0。 
sender 

receiver 


停等协议,两个序列号就够用 
4、rdt2.2 
一次使用两种确认讯息 处理起来比较费力,因此2.2中移除NAK的讯息,在ACK中加入编号 就可以达到确认与否认的效果。 
 

5、rdt3.0 
3.0同时考虑到封包遗失与资料错误的情形,除了使用ACK机制,另外在传送端多了倒数计时器,封包送出去如果超过时间仍未收到ACK或是收到不正确编号的ACK,则再送出封包一次。 





软件加硬件相匹配,等于性能 

停等操作时间好长 
6. 
Stop-and-Wait 与 Pipelined Protocol

rdt3.0虽然确保了资料的可靠性,可是它采用Stop-and-Wait机制,效能方面无法让人接受,因为送出封包后必须等待对方回应才能继续传送,假如连线Delay太长,整体效率会严重低落。

为解决这问题,后来发展出 Pipelined Protocol,可以让传送端同时传送多个封包不需等待确认相对的,传输端与接收端都必须增加封包的暂存空间与序列号码。当其中的封包出现错误时有不同的回覆方法,主要有Go-Back-N(GBN)与Selective Repeat(SR)两种方法。

Go-Back-N(GBN) 
传输多个封包 必须有个暂存的区域,暂存的区域中存在着窗格大小(Window Size) N,存放着各种封包(已确认、已送出但未收到ACK、未送出的封包等等)。 
接收端也会开启窗格来接收封包,会记着目前收到封包的编号,假设收到顺序不对的封包N+1(等待接收第N个,下一个传来的却是第N+1号),会将N以后的封包全部丢弃,此时传送端一直没收到ACK(N),会把N号以后的封包全部重新传送出去。

Selective Repeat(SR) 
GBN的传送方法往往会造成不必要的重复,因此SR的传送方法就是只针对未收到的封包做重新传输的动作。首先规划出大小为N的窗格来限制大小,窗格的基底会停留在最近一个尚未收到ACK的封包区域,当封包时间逾时会重新送出封包,直到收到该封包的ACK 窗格基底才会往前移动。

7. 
Flow Control(流量控制)

虽然TCP接收端有缓冲区,但有时候应用程序读取讯息的速度小于传输端传送讯息的速度,假如缓冲区满了还继续传资料过来,会造成缓冲区溢位的情况,为避免此状况,设了一个”receive window(接收窗格简写成rcvWindow)”变量,用来记录缓冲区剩余的空间有多少。

当接收端收到讯息后,会回传给传送端rcvWindow的数值,如果rcvWindow=0,传送端会停止传输资料但这个方法会造成问题,假设停止后 接收端一直没讯息通知传送端,此时传送端不会运作,而接收缓冲区也是空的,资料传输停止。 
因此当接收端rcvWindow=0时,传送端会持续传送一个1byte的区段给接收端 以确认缓冲区可否继续接收资料。 








TCP演示地址http://www.exa.unicen.edu.ar/catedras/comdat1/material/Filminas3_Practico3.swf

rdt1.0,rdt2.0,rdt2.1,rdt2.2,rdt3.0相关推荐

  1. mysql5.7与8.0用那个_MySQL 5.7 vs 8.0,哪个性能更牛?

    背景 测试mysql5.7和mysql8.0 分别在读写.只读.只写模式下不同并发时的性能(tps,qps) 前提测试使用版本为mysql5.7.22和mysql8.0.15 sysbench测试前先 ...

  2. windows 如何安装oracle 补丁包,Windows Server 2003 上安装 Oracle10g(10.2.0.1)并升级 至补丁(10.2.0.4) 图解...

    Windows Server 2003 上安装 Oracle10g(10.2.0.1)并升级 至补丁(10.2.0.4) 图解 第一部分:安装 Oracle 10.2.0.1 1.选择安装方法 2.选 ...

  3. 「Web2.0」的创造者表示:为Web3.0喝彩还为时尚早

    题图 | Kelly Sullivan / Getty Images for LinkedIn 图/ADOBE STOCK 最近Web3.0这个概念真的太火了. 简单来说,Web3.0将是去中心化.去 ...

  4. DotNetTextBox V3.0 所见即所得编辑器控件 For Asp.Net2.0(ver 3.0.9Beta)

    英文名:DotNetTextBox V3.0 WYSWYG Web Control For Asp.Net2.0 中文名:DotNetTextBox V3.0 所见即所得编辑器控件 For Asp.N ...

  5. ERROR: tensorboard 1.14.0 has requirement setuptools=41.0.0, but you'll have setuptools 39.1.0 whic

    ERROR: tensorboard 1.14.0 has requirement setuptools>=41.0.0, but you'll have setuptools 39.1.0 w ...

  6. tensorflow-tensorboard 0.4.0rc3 has requirement bleach==1.5.0, but you'll have bleach 2.0.0 which is

    tensorflow-tensorboard 0.4.0rc3 has requirement bleach==1.5.0, but you'll have bleach 2.0.0 which is ...

  7. device:GPU:0 but available devices are [ /job:localhost/replica:0/task:0/dev

     device:GPU:0 but available devices are [ /job:localhost/replica:0/task:0/dev 解决方法: sess = tf.Sess ...

  8. linux usb3.0改2.0,TX1入门教程硬件篇-切换USB2.0与USB3.0

    TX1入门教程硬件篇-切换USB2.0与USB3.0 说明: 介绍如何切换TX1USB口的为2.0或3.0版本 步骤: 编辑extlinux.conf文件,修改usb_port_owner_info= ...

  9. 剑指offer:给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,..,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]

    给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]. 不能使用除 ...

最新文章

  1. 在Ubuntu 14.04.5 64bit上安装git GUI客户端GitKraken
  2. 厌倦了枯燥的CRUD,是时候寻找下一个突破点了
  3. 【杂谈】如何让你的2020年秋招CV项目经历更加硬核,可深入学习有三秋季划4大领域32个方向(2020.7.23号后涨价)
  4. 获取物料的103待检库存
  5. 最短工期 (25 分)【拓扑排序模板】
  6. IOS学习之多线程(3)--线程安全
  7. linux远程原来显示器,【LINUX】(Ubuntu)无显示器接入,使用虚拟显示器且远程控制...
  8. 2022深圳杯D题思路:复杂水平井三维轨道设计
  9. 让Fireball CodeEditor控件禁止中文双倍输入
  10. pagefile.sys删除
  11. 【Python】日期处理-中国法定节假日
  12. ubuntu命令 图片 壁纸_一个命令安装旧版Ubuntu发布的壁纸
  13. 供应链服务平台方案:助供应链服务公司实现商品+决策+物流+售后协同办公
  14. Debian 支持蓝牙音响
  15. 连接池原理--文章一
  16. Java能够做哪些工作?这7个Java开发方向你知道几个?
  17. 华硕主板如何设置开机自启_华硕主板开机启动项调整的三种方法
  18. PCIE协议解析 synopsys IP DBI and LBC 读书笔记(5)
  19. JavaScript------JS相关难题,做对一半算你牛牪犇
  20. 总有戏精想害朕?那是你没试过百度人脸核身

热门文章

  1. oracle union all 特别慢_Oracle查询性能优化
  2. check oracle 为空值_索引(index)-Oracle高级知识(3)-数据库(23)
  3. 圣诞祝福网页_平安夜圣诞节适合发朋友圈的文案,快快收藏起来!
  4. json字符串转成formdata_FormData 数据转化为 json 数据
  5. vba两个集合的差集_Python中的集合是如何使用的?
  6. 数据库高可用 MHA 搭建手册
  7. git将本地仓库强制替换掉远程仓库
  8. 第七届蓝桥杯javaB组真题解析-抽签(第五题)
  9. win7 安装 memcached
  10. Git 经常使用命令合集