可靠数据传输原理

概念

什么是可靠?

不错、不丢、不乱

可靠数据传输协议

可靠数据传输对应用层、传输层、链路层都很重要
网络Top-10 问题
信道的不可靠特性决定了可靠数传输协议(rdt) 的复杂性

在这里插入图片描述
rdt_send:应用层将数据交付给可靠传输协议(rdt)以发送 给对方
udt_send:被rdt调用,在不可靠的信道上向接收方传输数据
rdt_rcv:当数据包到达接收方信道时被调用
deliver_data:向上层应用交付数据

rdt_send和deliver_data 是单向的,应用层发送和接收到的都是正确的
udt_send和rdt_rcv 是双向的,说明在不可靠的信道通道进行数据传输,需要双向的控制消息流动

可靠数据传输协议

rdt1.0:可靠信道上的可靠数据传输

条件:底层信道完全可靠

  • 不会发送错误
  • 信道不会弄丢分组
    在这里插入图片描述

rdt2.0:产生位错误的信道

底层信道可能翻转分组中的位(bit)

  • 利用校验和检测位错误

如何从错误中恢复

  • 确认机制(Acknowlegements,ACK):接收方显示的告诉发送方分组已经正确接收。
  • NAK:接收方显示的告诉发送方分组错误
  • 发送方收到NAK后,重传分组

基于这种重传机制的rdt协议称为**ARQ(Automatic Repeat reQuest)**协议
Rdt2.0比Rdt1.0中新引入的新机制

  • 差错检测
  • 接收方反馈控制信息:ACK/NAK
  • 重传
    在这里插入图片描述
    停-等协议

rdt2.1:产生位错误的信道

如果ACK/NAK 消息发生错误/被破坏(corrupted)会怎么样

  • 如果ACK/NAK 坏调,发送发重传
  • 不能会简单的重传:产生重复分组

如何解决重复分组问题

  • 序列号(sequence number):发送方给每个分组增加序列号
  • 接收方丢弃重复分组
    发送方:
    在这里插入图片描述
    注意:第一条数seq=0,当收到接收方返回该数据已经收到且无损害时,seq=1,表示第二条数据,两个序列号够用,因为使用了停等协议。

在这里插入图片描述

rdt2.2:无NAK消息协议

rdt3.0

假设信道既可能发生错误,也可能丢失分组,怎么办?

  • “校验和+ 序列号+ACK+重传” 不够用了,如果第一次发送丢失,发送方和接收方都不知道怎么处理。

方法:发送方等待“合理”时间

  • 如果没有收 到ACK,重传

  • 如果分组或ACK只是延迟而不是丢了

    在这里插入图片描述
    实例(1)
    在这里插入图片描述

a:发送方发送pkt0,接收方就收到正确的包回复ACK0,发送方收到ACK0(表示发送方知道接收方已经收到了pkt0了),然后发送方发送ACK1给接收方重复上面的步骤

b:发送方发送pkt0,接收方就收到正确的包回复ACK0,发送方收到ACK0(表示发送方知道接收方已经收到了pkt0了),然后发送方发送ACK1给接收方,但是此时pkt1已经丢失了,接收方不会不知道也不会回ACK/NAK,只能当定时器超时了再次发送才能继续交互。

接收方回复ACK是最后一次成功接收的

在这里插入图片描述

Rdt3.0 性能分析

Rdt3.0 虽然能够正常工作,但性能很差
实例:1Gbp链路,15ms端到端传播延迟,1kb分组
在这里插入图片描述

  • 发送方利用率:发送方发送时间百分比
    在这里插入图片描述
  • 在1Gbps链路上每30毫秒才发送一个分组 33kb/sec
  • 网络协议限制了物理资源的利用
    在这里插入图片描述

流水线和滑动窗口协议

概念:
在这里插入图片描述

  1. 窗口滑动协议:sliding-window protocol
  2. 窗口
    • 运行使用的序列号范围
    • 窗口尺寸为N:最多有N个等待确认的消息
  3. 滑动窗口
    • 随着协议的运行,窗口在序列号空间内向前移动,上面的send_base+1,表示窗口向右移动了一个分组
  4. 滑动窗口协议GBN和SR

在TCP/IP层中利用滑动窗口
1、使用的序列号0 ~ 2^32(0 ~ 4 294 967 295)
2、TCP/IP滑动窗口大小计算方式:大序列号-小序列号
3、TCP/IP滑动窗口的取决于 = min(拥塞窗口大小,接收端接收窗口)

面向连接传输协议(Tcp)

TCP报文段的首部格式

在这里插入图片描述
1、源端口目的端口 各占2个字节,分别写入源端口号和目的端口号。

2、序号 占4个字节,序号范围是[0,2^32 - 1] , 序号增加到 2 ^32 -1 后,下一个序号又回到了0,TCP是面向字节流的,在一个TCP连接中传送的字节流中的每一个字节都按顺序编号,整个要传送的字节流的起始的序号,例如,一个报文的序号值是301,而携带的数据共有100个字节,这表明本报文段数据的第一个字节的序号是301,最后一个字节的序号是400,显然,下一个报文的(如果还有的话)的数据序号应当从401开始,即下一个报文的序号字段值为401,这个字段的名称也叫做报文段序号

3、确认号 占4个字节,是期望收到对方下一个报文段的第一个数据字节的序号,例如:B收到A发送过来的一段报文段,其字节序号值为501,而数据长度是200字节(501~700),这表明B正确收到A发送的到序号700为止的数据,因此,B期望收到A下一个数据第一个序号是701,于是B在发送给A的确认报文段中把确认好置为701,请注意,现在的确认号不是501,也不是700,而是701.

  • URG:紧急指针是否有效,置为 1 时表示有效,报文应当被优先处理。
  • ACK:确认号是否有效,置为 1 时表示有效,TCP 规定,在连接建立后所有传达的报文段都必须把 ACK 置 1。
  • PSH:push标志,置为 1 时表示带有push标志的数据,指示接收方在接收到该报文段后,应尽快将这个报文段交给应用程序,而不是在缓冲区排队。
  • RST:重置连接标志,用于重置由于主机崩溃或其他原因而出现错误的连接。或者用于拒绝非法的报文段和拒绝连接请求。我们把携带RST标识的称为复位报文段。
  • SYN:仅在三次握手建立 TCP 连接时有效。在连接请求中,SYN=1和ACK=0表示该数据段没有使用捎带的确认域,而连接应答捎带一个确认,即SYN=1和ACK=1。我们把携带SYN标识的称为同步报文段。
  • FIN:用于释放连接,为1时表示发送方已经没有数据发送了,即关闭本方数据流。我们把携带FIN标识的称为结束报文段。
如果确认好=N,则表明:到序号N-1为止的所有数据都已经正确接收。

由于序号字段有32位长,可对4GB(4千赵字节)的数据进行编号,在一般情况下,可保证序号重复使用时,旧序号的数据早已通过网络到达终点了。

在这里插入图片描述

TCP的重传实例

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

TCP用的是累计确认机制

TCP连接管理

  1. TCP sender 和reciver在传数据前需要建立连接

  2. 初始化TCP变量
    seq.#
    Buffer和流量控制信息

  3. Client:连接发起者
    Socket client = new Socket(“hostname”,port)

  4. Server:等待客户连接请求
    Socker server = welcomSocket.accpt();

三次握手

在这里插入图片描述

在这里插入图片描述

step1:客户端发送一个连接请求,SYN=1,并随机生成一个序列号client_isn
step2:服务器端回复答应建立连接SYN=1,并且也随机生成一个序列号位server_isn,而且回复step1发送的正确收到和期望下次收到的是序号client_isn +1,所以这一步的ack=client_isn +1,报文段的头部ACK回复成功收到连接请求,ACK=1
step3:客户端收到服务器端的答应连接的回应,所以发送SYN=0,ACK=1,同时发送报文的第一个序号为:client_isn +1,且回复成功收到和期望下一个收到的报文是server_isn + 1

注意:在报文发送的时候
seq:表示发送的这段报文所要发数据的第一个字节的序号
ack:表示成功收到,且期望收到下一个报文的第一个数据字节的序号,序号都是0~2^32 -1 循环使用的。

四次挥手

在这里插入图片描述

step1:client 向server发送TCP FIN 控制的segment
step2:server 收到FIN,回复ACK,关闭连接,发送FIN
step3:client收到FIN,回复ACK,进入’'等待",如果一会儿收到FIN,会重新发送ACK
step4:server收到ACK,连接关闭。

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UDP协议是一种无连接的传输协议,它不对数据传输进行可靠性保证,因此在进行数据传输时,可能会出现数据丢失、重复、乱序等问题。为了保证UDP数据传输可靠性,需要使用一些技术手段进行处理,其中最常用的是使用UDP Socket实现可靠数据传输。 UDP Socket是在UDP协议基础上进行实现的一个套接字。UDP Socket可以通过设置一些参数和使用一些技术手段,来实现UDP数据传输可靠性。下面就具体介绍UDP Socket实现可靠数据传输原理。 1.数据分片 UDP Socket将数据分片传输,每个数据分片都包含一个序号,接收端可以通过序号来判断数据分片是否存在丢失、重复或者乱序等问题。如果数据分片存在以上问题,则可以进行相应的处理,从而保证数据传输可靠性。 2.确认机制 UDP Socket采用确认机制来保证数据传输可靠性。发送端在发送每个数据分片后,会等待接收端返回确认信息,确认信息包含接收到的数据的序号。如果接收端返回的确认信息与发送端发送的序号不一致,则说明数据分片存在丢失或者乱序问题,发送端需要重新发送该数据分片。 3.超时重传机制 UDP Socket采用超时重传机制来保证数据传输可靠性。发送端在发送每个数据分片后,会设置一个超时时间,在超时时间内如果未收到接收端的确认信息,则发送端会重新发送该数据分片。通过这种方式,可以保证数据分片不会因为网络问题而丢失。 4.流量控制 UDP Socket采用流量控制来保证数据传输可靠性。在数据传输的过程中,发送端需要根据接收端的处理能力来控制数据的发送速度,防止数据发送过快导致接收端无法及时处理。通过流量控制,可以避免数据丢失或者传输延迟过大的问题。 综上所述,UDP Socket实现可靠数据传输原理主要包括数据分片、确认机制、超时重传机制和流量控制等方面。通过这些技术手段,可以保证UDP数据传输可靠性,从而满足各种网络应用的需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值