可靠数据传输基本原理

环境假设

先假设我们有一个文件需要从计算机A传输到计算机B,而且这个文件非常大,不可能一次传输就完成,由此可想而知,这个文件就需要拆分成很多分,但是这里有个问题,虽然说是很多分,那到底是多少份呢?网络数据传输中是如何定义的?请看网络数据传输的最小单位

设要传的字符长度为m*n=l,如果每次只能传输n个字符,那么就需要传输m次,在理想情况下,l个字符只需要按照顺序从A依次传输给B,那么事情就完成了,而现实情况却并么有这么理想,有可能会发送以下错误:

  1. 发送的过程中数据被改变(信号干扰之类的原因)
  2. 后发的数据比先发的更早到达
  3. 发送过程中数据丢失了

解决数据被改变

如果从PA发送字符串aabbcc发送到PB后变成了aaddcc,PB要能够识别出来数据有差错,不能够接收,可以使用校验码的方式,使用某种算法将发送的字符串进行计算,将计算的结果附加在原字符串的尾部,这样当PB接受到数据后,把前面的字符串再用同样的算法来计算,如果和后面的校验和一致的话,那么就说明数据是正确的。

如果数据是正确的,则PB告诉PA,数据正确,可以发送下一段
如果数据是错误的,则PB告知PA,数据错误,需要从新发送

解决顺序错乱

PA中的文件中的字符串是有顺序的,如果PA先发出的数据晚到,那肯定会造成数据段之间错误,使得数据丢失正确的信息,这个时候采用的策略就是每次发送的数据都添加一个序号,当PB接收完所有的数据后再进行排序

由此而衍生出一个问题,PB接收到的数据是暂存起来的,并没有立刻将数据交给应用程序,暂存肯定需要存储的地方,如果PA发送的文件是一个很大的文件,比如PB的内存是8G,而传输的文件是10G,那么这样的问题又如何处理呢?

问题:大文件如何处理?

解决数据丢失

数据从PA发送到PB,无论数据是否正确,PB都能够得到这个信息,并依据这个来对PA进行一个反馈,但是如果数据丢失了,PB根本就不知道有数据传输给它,所以它也无从去通知PA传输结果,造成PA处于一直等待状态中,要想解决这个问题,只需要在PA端设置一个定时器,如果指定的时间内无法得到一个来自于PB的反馈,则说明数据在传输过程中丢失了,可据此重新传输一次,但是这里指定多少时间合适是一个问题?如果时间太短,则会造成不断的重复发送数据,如果时间太长,又造成传输速率太低

问题:设置多长时间合适?

此外,PB还得有一个检查重复的功能,如果PB的反馈还没有达到PA,但是却又超过了设定的设计,PA就视为丢失了数据,然后重新发起一次新的传输,因此会造成数据重复的情况,不过这个依然可以使用序号来防范

总结

通过以上我们可以发现,发送端要发送下一个报文的时候,必须得等到接受端的一个确认信息,而且是一个串行发送的方式,可想而知,这得有多么慢呢?在等待确认信息的过程中,发送方一直处于等待状态中,那么是否有办法可以提高发送效率呢?请看网络传输之BNB协议