什么是可靠数据传输服务?什么是可靠数据传输协议? |
您所在的位置:网站首页 › udp协议可以提供可靠的数据流传输服务吗 › 什么是可靠数据传输服务?什么是可靠数据传输协议? |
要想理解可靠数据传输(Reliable Data Transfer),那么不妨结合与其相对的概念——不可靠数据传输进行理解。 UDP可靠性设计、TCP/UDP应用场景分析 1.什么是可靠数据传输服务?什么是可靠数据传输协议?
协议要保证的不仅仅是发送方可以发数据,同时也会对接收方将接收到怎样的数据做出一定的保证,这才是完整的通信。 Thus, to support these applications, something has to be done to guarantee that the data sent by one end of the application is delivered correctly and completely to the other end of the application. If a protocol provides such a guaranteed data delivery service, it is said to provide reliable data transfer. 分组可能会在网络中丢失、损坏,应用层可能对网络通信有所要求,不允许出现这种差错,必须保证接收方的应用收到了完整且正确的数据,这种服务就是可靠数据传输服务。 如果一个协议可以确保发送端发送了怎样的数据,那么接收端就必然能接收到怎样的数据,那么就可以说这个协议提供了可靠数据传输服务,这个协议是可靠的,反之则是不可靠的。 类比一个比较形象的场景,一个记者去现场报道国家主席接见现任特首,那么这个记者就相当于一个通信协议,如果能保证把所有的信息都完整、真实、无差错地报道出来,让观众、读者可以通过她的报道真实感受现场情景,那么她就提供了可靠的数据传输服务,如果她可能故意问一些没有质量且水平低下的引导性问题,丢失一些信息没有完全报道,夹带私货,把无中生有的事再重复一遍,宣传上就出现了偏差,她就是不可靠的记者(协议)。 2.为什么形容一个协议是可靠/不可靠的?为什么说TCP是可靠的,UDP是不可靠的,IP也是不可靠的?TCP服务模型除了面向连接以外,也提供可靠数据传输服务。 The communicating processes can rely on TCP to deliver all data sent without error and in the proper order. When one side of the application passes a stream of bytes into a socket, it can count on TCP to deliver the same stream of bytes to the receiving socket, with no missing or duplicate bytes. 通过TCP协议的通信进程可以无差错地以正确的顺序传送所有数据。当一方的应用向套接字传送字节流时,它可以通过TCP向接收套接字传送完全相同的字节流而没有丢失或者冗余的字节。 而同样是传输层的重要协议UDP则不提供可靠传输服务,仅仅提供最小服务(minimal services),是无连接的。与之相对,无法保证接收套接字接收到的字节流是完整的、无差错的、有序的。 传输层之下的网络层,主要使用的是因特网协议(IP协议)。IP协议是一个尽力而为(best-effort)的传送协议,只实现通信方之间逻辑上的连接,IP协议只能尽力去传送通信双方的报文段,而不作出任何保证(完整性、正确性、有序性) 2.1 为什么可以同时允许可靠/不可靠数据传输服务的存在?
对于底层信道完全可靠的情况,只需要调用跟着基本法来,接到上层调用就做一系列操作(打包之类的)把数据发给下层,接收方对应层协议收到下层的调用就将数据做些操作然后发给上层协议,其他的就不需要考虑了。 我们已经在2.1提到,IP是不可靠的,但是可以依靠上层的协议(如TCP)使这个使用IP协议的通信变得可靠,这就好比记者在采访现场引导出了一些不符合积极向上的个人形象的言辞,但是没关系,上层还有编辑和其他审核人员,他们的专业技能可以保证把通讯稿写的符合基本法,那么宣传上就不会出现偏差。 现在要解决的问题就是怎样在不可靠的网络层协议之上实现可靠的传输层协议。这里以在IP上实现的TCP为例。 包括奇偶校验、校验和、CRC等方法判断收到的数据分组是否损坏,如果不能校正那就丢弃分组。 3.2ACK确认 这是在不可靠底层信道上加入的一种反馈机制,由接收方发送确认消息。发送方发送数据,接收方接收到了以后发了ACK表示“我已经收到了,可以继续发了”,就像发了一个“支持XXXX吗?”对方回答“吼啊”你才可以继续提问,如果你问的那么热情对方一句话也不说,这就不好了,虽然不排除无可奉告的可能,但是也不能再继续问下去了,这个模式就是停止等待(stop-and-wait)协议的思想,只有得到肯定的确认才能继续发送数据。除了肯定确认ACK表示确认收到以外,还有否定确认NAK,用来表示某个数据没有收到,比如滑动窗口协议中用的就是NAK,意思就是“没听说过”。 发送方收到了接收方发来的ACK/NAK后自己也要判断的,然后再把接收方丢失的数据分组(无论是在信道上丢失的还是因为出了偏差所以主动丢弃的)重传一遍。 以上其实就差不多是停止等待协议的基本内容了。 3.3 序号 但是ACK/NAK也可能在传输过程中被损坏,这时候就需要引入序号(sequence number),接收方可以通过检查收到的数据分组的序号发现哪些分组没有收到、哪些分组冗余了。发送ACK/NAK反馈时也可以指定Seq表示需要重传哪些分组或者继续往下发送哪些分组。序号的引入也让传送的效率大大提升,不用像停止等待那种朴素(naive)方法受限于当前的分组战战兢兢,可以以流水线传送数据。 4.后记 “如何理解可靠数据传输”这个问题实在太大,仅仅从概念上来讲就已经非常大了,我不知道题主需要的是具体哪方面的内容,所以把最基础的部分写出来了,事实上比如重传中的超时机制也是很重要的,虽然涉及了一些最基础的元素,但是基础的方法比如退回N步(Go-back-N)、选择重传(SR)、滑动窗口之类也都很重要,但是我的篇幅和精力有限,无法兼顾,只能带你进门,剩下的学习要你自己去完成。这还仅仅是概念,源码阅读和实际应用也需要你自己多多考虑一下。 References [1] Velten, David, R. M. Hinden, and Jack Sax. Reliable data protocol. No. RFC 908. 1984. [2] Kurose, James F. Computer Networking: A Top-Down Approach Featuring the Internet, 3/E. Pearson Education India, 2005. C/C++Linux服务器开发/后台架构师面试题、学习资料、教学视频和学习路线图(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等),免费分享有需要的可以自行添加学习交流群960994558 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |