Reliable Data Transfer (RDT) 可靠数据传输协议(1)

2023-11-02 05:10

本文主要是介绍Reliable Data Transfer (RDT) 可靠数据传输协议(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

reliable data transfer protocol 在传输层和网络层都有很重要的应用,用来保证信息传输的准确性

reliable data transfer示意图

在本文中只考虑单向数据传输(sender发送数据到receiver),但控制信息将在两个方向上流动(互相传递信息例如ACK等)
使用有限状态机(FSM)指定发送方、接收方

Q:什么是finite state machines (FSM)?
A:FSM(Finite State Machine),有限状态机,其在任意时刻都处于有限状态集合中的某一状态。下面的针对sender以及receiver的状态分析图就是FSM

RDT 1.0:

RDT 1.0协议是在理想情况下
- no bit errors
- no loss of packets
RDT 1.0
sender发送数据包给receiver接收

RDT 2.0:

毕竟不能只考虑理想情况,RDT2.0考虑了bits error的情况

RDT 2.0相比于RDT 1.0 增加了checksum(ACK确认字符和NAK否认字符)

Acknowledgements (ACKs): receiver explicitly tells sender that pkt received OK
Negative acknowledgements (NAKs): receiver explicitly
tells sender that pkt had errors

在这里插入图片描述
在这里插入图片描述
这里面提到了Stop and wait protocols 就是说等sender给receiver发送了一个数据包以后,需要等待reciever反过来发送给ACK或者NAK。只有收到的receiver的信息以后sender才会继续发送给第二个数据包或者重新发送上一个数据包。

没有错误的情况:
在这里插入图片描述

  1. sender发送数据给receiver
  2. receiver接收数据并且返回ACK,证明数据无误
  3. sender经过等待,接收到reciever返回的ACK,继续发送下一个数据包

有错误的情况:
在这里插入图片描述

  1. sender发送数据给receiver
  2. receiver接收数据并且返回NAK,证明数据有误
  3. sender经过等待,接收到reciever返回的NAK,将当前数据包重新发送

RDT 2.1:

因为对于RDT 2.0来说,receiver就算接收到了ACK或者NAK,也不知道是哪个数据包(retransmission的数据包 or 当前的数据包)
因此RDT2.1引入了一个 sequence number(0 or 1)
发送方添加序列号到每个pkt,接收方检查这个序列号,以确定是否收到的包是一个重传,接收方丢弃(不交付)重复的pkt

过程如下:
sender:

在这里插入图片描述
receiver:
在这里插入图片描述
假设接收端收到了正确的分组并向发送端发出了确认信息,但是当发送端接收到错误的接收端的确认信息(即不是ACK也不是NAK)时候,发送端不知道接收端是否得到正确的分组,发送端会在当前状态(1或0)下重新发送分组,而此时接收端已经进入下一个状态(0或1),发送端与接收端当前处于不同的状态,当前接受端的状态是期望得到下一个分组,而发送端发送的是上一个分组,这时候接收端就会通过两端不同的状态明白发送端发送的是上一个分组,跟着会丢弃这个分组,并且发送ACK给发送端, 让发送端进入下一个状态。

Q:只是引入2个sequence number(0 & 1)够不够?
A:RDT 2.1属于等停协议,就是说要按顺序传送分组,上一个分组确认传达后才会开始下一个分组。

RDT 2.2:

RDT 2.2跟RDT 2.1不同的地方在于RDT 2.2只是使用一个ACK而不使用NAK
E.g. 如果接收方接收到0号数据包,返回(ACK,1),发送方接着发送1号数据包。如果接收方接收到0号数据包出现错误,返回(ACK,0),发送方重传0号数据包。

在这里插入图片描述

RDT 3.0:

rdt3.0在rdt2.2的基础之上在处理了数据包丢失的情况中增加了 Countdown Timer的机制,如果在(RTT+Processing time at receiver)时间段内,发送方没有接收到反馈信息,那么发送方默认数据包已经丢失了,会自动重传。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Reference:

[1]JamesF.Kurose, and KeithW.Ross. 计算机网络:自顶向下方法. 机械工业出版社, 2009.
[2]https://www.zhihu.com/question/366259154/answer/983403348

这篇关于Reliable Data Transfer (RDT) 可靠数据传输协议(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/328336

相关文章

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

Java对接MQTT协议的完整实现示例代码

《Java对接MQTT协议的完整实现示例代码》MQTT是一个基于客户端-服务器的消息发布/订阅传输协议,MQTT协议是轻量、简单、开放和易于实现的,这些特点使它适用范围非常广泛,:本文主要介绍Ja... 目录前言前置依赖1. MQTT配置类代码解析1.1 MQTT客户端工厂1.2 MQTT消息订阅适配器1.

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Linux中的HTTPS协议原理分析

《Linux中的HTTPS协议原理分析》文章解释了HTTPS的必要性:HTTP明文传输易被篡改和劫持,HTTPS通过非对称加密协商对称密钥、CA证书认证和混合加密机制,有效防范中间人攻击,保障通信安全... 目录一、什么是加密和解密?二、为什么需要加密?三、常见的加密方式3.1 对称加密3.2非对称加密四、

如何在Spring Boot项目中集成MQTT协议

《如何在SpringBoot项目中集成MQTT协议》本文介绍在SpringBoot中集成MQTT的步骤,包括安装Broker、添加EclipsePaho依赖、配置连接参数、实现消息发布订阅、测试接口... 目录1. 准备工作2. 引入依赖3. 配置MQTT连接4. 创建MQTT配置类5. 实现消息发布与订阅

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

HTML5 data-*自定义数据属性的示例代码

《HTML5data-*自定义数据属性的示例代码》HTML5的自定义数据属性(data-*)提供了一种标准化的方法在HTML元素上存储额外信息,可以通过JavaScript访问、修改和在CSS中使用... 目录引言基本概念使用自定义数据属性1. 在 html 中定义2. 通过 JavaScript 访问3.

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台