当前位置: 首页 > news >正文

实现UDP可靠性传输

文章目录

  • 1、TCP协议介绍
    • 1.1、ARQ协议
    • 1.2、停等式
    • 1.3、回退n帧
    • 1.4、选择性重传

1、TCP协议介绍

TCP协议是基于IP协议,面向连接,可靠基于字节流的传输层协议
1、基于IP协议:TCP协议是基于IP协议之上传输的,TCP协议报文中的源端口+IP协议报文中的源地址+TCP协议报文中的目标端口+IP协议报文中的目标地址,组合起来唯一确定一条TCP连接。
2、面向连接:与UDP不同,TCP在传输数据之前,需要进行三次握手,建立一条TCP连接,然后在进行数据传输,释放需要进行四次挥手。
3、基于字节流:流的含义是不间断的数据结构,这里指的是没有边界的报文结构,假如发送内容比较大,TCP协议栈会将数据切成一块一块放入内核中。

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

1.1、ARQ协议

TCP之所以能实现可靠的数据传输,正是因为基于ARQ协议,ARQ协议(Automatic Repeat-reQuest),即自动重传请求,是传输层的纠正协议,在不可靠的网络中实现可靠的信息传输。
ARQ主要有3种模式:
1、停等式
2、回退n帧
3、选择性重传

1.2、停等式

停等式协议工作原理如下:
1、发送方对接收方发送数据包,等待接收方回复ack,并且开始计时
2、在等待过程中发送方停止发送数据
3、当数据包没有成功被接收方接收,接收方是不会发生ack,等待一段时间后,发送方会重新发送数据包
4、反复这个过程直到接收到ack
缺点:较长的等待时间,使发送数据缓慢。

在这里插入图片描述

1.3、回退n帧

为了解决上面的长时间等待ack的缺陷,连续ARQ协议会,连续发送一组数据包,然后会等待这些数据包的ack。

什么是滑动窗口?

发送方和接收方都会维护一个数据帧序列,这个序列被称为窗口,发送方的窗口是由接受方确定的,目的是控制发送方的速度,避免接收方的缓存不够,而导致数据溢出,同时限制网络中的流量,避免网络阻塞,协议中规定,对于窗口内未经确定的分组进行重传。

回退n帧

回退n帧允许发送方在等待超时的间歇,可以继续发送分组,所有分组携带序列号,在GBN协议中,发送方需要响应以下三件事件:
1、上层的调用,上层调用相应send()时,发送方首先要检索发送窗口是否满
2、接收ack,在该协议中,对序号n的分组的确定采取累积确认的方式,表明接收方已正确接收n以前的的所有分组
3、超时,若出现超时,发送方将重传所有已发生但未被确定的分组
下图:序号为2的分组,丢失了,后面的所有分组都需要重新传
GBN采用的技术包括序号、累积确认、检验和以及计时/重传。

在这里插入图片描述

1.4、选择性重传

虽然GBN改善了停等式中等待时间过长的缺陷,但是依旧存在性能问题,而SR协议通过让发送方仅重传在接收时丢失的分组,从而避免不必要的重传。

发送方:

SR协议中发送方需要响应以下三件事:
1、从上层接收数据,当从上层接收数据后,发送方需检查下一个可用于该分组的序号,若序号在窗口中则发送数据。
2、接收ACK。若收到ACK,且该分组在窗口内,则发送方将那个被确认的分组标记为已接收。若该分组序号等于基序号,则窗口序号向前移动到具有最小序号的未确认分组处。若窗口移动后并且有序号落在窗口内的未发送分组,则发送这些分组。
3、超时。若出现超时,发送方将重传已发出但还未确认的分组。与GBN不同的是,
SR协议中的每个分组都有独立的计时器。

接收方:

在SR协议下,接收方需响应以下三种事件:
(假设接收窗口的基序号为4,分组长度也为4)
1、序号在[4,7]内的分组被正确接收。该情况下,收到的分组落在接收方的窗口内,一个ACK
将发送给发送方。若该分组是以前没收到的分组,则被缓存。若该分组的序号等于基序号4,则该分组以及以前缓存的序号连续的分组都交付给上层,然后,接收窗口将向前移动。
2、序号在[0,3]内的分组被正确接收。在该情况下,必须产生一个ACK,尽管该分组是接收方
以前已确认过的分组。若接收方不确认该分组,发送方窗口将不能向前移动。
3、其他情况。忽略该分组对于接收方来说,若一个分组正确接收而不管其是否按序,则接收方会为该分组返回一个ACK给发送方。失序的分组将被缓存,直到所有丢失的分组都被收到,这时才可以将一批分组按序交付给上层。

在这里插入图片描述

http://www.lryc.cn/news/115102.html

相关文章:

  • Zebec Protocol 将进军尼泊尔市场,通过 Zebec Card 推动地区金融平等
  • Qt--动态链接库的创建和使用
  • 设计模式十二:享元模式(Flyweight Pattern)
  • 【LeetCode】88. 合并两个有序数组 - 双指针
  • HarmonyOS应用开发的新机遇与挑战
  • Qt中qmake、构建、运行、清理的区别
  • 【设计模式——学习笔记】23种设计模式——观察者模式Observer(原理讲解+应用场景介绍+案例介绍+Java代码实现)
  • 【奇葩瑞萨-004】RX系列单片机的GPIO初始化
  • 【Git】Git切换地址
  • elementUI点击当前行更改当前行状态(数据更新DOM不更新问题解决)
  • python爬取阿里巴巴商品页面数据api
  • angular-mat-select 多选 实现按选择顺序排序
  • 爬虫010_列表高级_添加_append_extend_修改_查询_in_not int_删除_del_pop_remove---python工作笔记029
  • 微服务服务拆分和远程调用
  • MySQL8.1源码安装与部署
  • algebraic reconstruction technique(ART)
  • oracle11g安装
  • 网络防御(9)
  • Spring核心与设计思想
  • 【stream的使用】使用stream.filter过滤List对象
  • Flink多流处理之connect拼接流
  • 对任意类型数都可以排序的函数:qsort函数
  • vue数据更新table内容不更新解决方法
  • 合宙Air724UG LuatOS-Air script lib API--record
  • 基于Vgg16和Vgg19深度学习网络的步态识别系统matlab仿真
  • Java分布式微服务3——Docker
  • js字符串替换
  • 网络防御(2)
  • [RCTF2019]DontEatMe
  • 6. CSS(三)