可靠的运输层协议,如何抵抗“剪网线”的降维打击?(rdt协议的的总结与思考)

前言

很久没更新长文了。最近在阅读James F. KuroseKeith Ross的《计算机网络:自顶而下方法(第6版)》第3章运输层。

题外话:Keith Ross还是Courant隔壁“对家”Tandon的院长。看简历,似乎与上海纽约大学也有联系。

Keith Ross is the Dean of Engineering and Computer Science at NYU Shanghai and the Leonard J. Shustek Chair Professor of Computer Science at NYU Tandon. He also holds an affiliated appointment with the Department of Computer Science at the Courant Institute of Mathematical Sciences and with the Center for Data Science at NYU.

希望疫情结束,能在NYU选修计算机网络能碰到他吧。

概述

rdt(reliable data transfer)协议是《自顶而下》传输层的重要概念。其不同版本(rdt1.0, rdt2.0等)介绍了运输层实现可靠数据传输的各种组件:序号、计时器、ACK、重传等。rdt是一个理解tcp协议的一个很好基石。其他层的可靠传输协议,也可以藉由rdt思想演化。本博文旨在:

  • 记录下我初次学习很多疑问与分析。
    • rdt真的是周知概念吗?
    • 网线一刀剪了,连接就断了。可靠何谓之有?
  • 总结与分析rdt引出的可靠传输概念。

问题1:rdt是否为广为接受的概念?

在其他语境下(除自顶而下的其他教材,面经),rdt鲜有出现。这引出了我的疑问:rdt是广泛接受的概念和术语,还是仅限于该教材的玩具?3.4章(中文黑皮版,p137)有以下阐述:

这里rdt表示可靠数据协议,_send指示rdt的发送端正在被调用。开发协议的第一步就是要取一个好名字!

所以,rdt应该是该教材的一个构造案例,并非直接实际存在,也并非周知概念。Wikipedia上,名字相似的仅有Reliable data protocal(RFC 1151)。并且,其协议内容与书本上无直接对应关系。

但是,rdt的这一术语也有足够影响力:

作为对比,在谢希仁的《计算机网络》教材中,就没有rdt这一概念。取而代之的,是对于停等协议、ArQ(Automatic Repeat reQuest, 自动重传)、流水线机理的直接介绍。这些是更广泛接受的、解耦后的概念。两本书各有优点:

  • 谢的书简洁干练
  • 《自顶而下》循循善诱

无容置疑的是,学习计算机网络不能囿于《自顶而下》,否则看不到全貌。得多读多看,在不同平台上刷一些刷题,知识能得到迁移与泛化。私以为,第一遍学习应该看《自定而下》,第二遍回顾则谢的书更优。

rdt是否有必要仔细学和背?个人观点:rdt是描述如何实现单向可靠传输的绝佳案例。要学会讲故事,则必须要了解。但是,在和别人交流时,不要把rdt作为周知概念去处理即可。

作个比喻,他是计算机网络界中的“网红”,而非基石。

问题2:我一刀就可以把网线给剪了,为什么说rdt/tcp可靠呢?

一开始读传输层协议的时候,心里总有个疑问:若说rdt/tcp可以实现可靠传输,但人力不胜天灾。若网线被剪了,那可靠又从何谈起呢?从直觉上,UDP的“尽力而为”听上去更像是该层协议能做的事。

答案也很简单,可靠的定义与100%安全还是有差别的。书本上3.5.4提及到:

TCP的可靠数据传输服务确保一个进程从其接受缓存读出的数据是:无损坏、无间隔、非冗余和按序的数据流

  • 如果网线被剪断,从现实世界的时序上看,数据传输是间断了。但是从数据流的空间上说,数据的前后顺序并未颠倒,中间也无间隔。
  • 丢包出现了,但与之相对的重传机制也开始工作。网线接上后,可靠协议能保证重新到达应用层的数据,还是正常的。
  • 无损坏不是指数据包不被丢失,而是通过checksum机制去做校验潜在的比特差错。

UDP的“尽力而为”描述经常给人一种他很努力的错觉。其实,理解成“如果丢了包,乱了序,咱这一层就不管了”更贴近直觉。

TCP的可靠,应该这样理解:碰到突然中断等不可抗力因素,我还能保证数据流正常,那么我是可靠的。

rdt版本、假设、与相关概念

rdt及之后的流水线的假设与对应机制一览:

rdt版本假设可靠传输机制描述
rdt1.0完全可靠信道N/A基本协议
rdt2.0数据分组可能比特差错肯定确认(ACK),否定确认(NAK),差错检测(checksum)、重传停等协议、差错检测、自动重传
rdt2.1数据+ACK/NAK分组可能比特差错序号(sequence number)设置序号以处理冗余分组
rdt3.0数据+ACK/NAK分组可能比特差错或丢包超时重传通过超时处理丢包
流水线+回退N步(GBN)同上滑动窗口+丢弃乱序分组同时允许多个分组发送,提高吞吐率
流水线+选择重传(SR)同上窗口+分组计时器+接受乱序乱序分组将被缓存

书本上概念的总结(p154)的机制精简版:

机制用途和说明
检验和用于检测在一个传输分组中的错误。
定时器用于超时/重传一个分组。该分组(或ACK)可能丢失;若该分组未丢失,则可能造成冗余分组。
序号从发送方流向接收方的分组,按顺序编号。序号间空隙用于检测丢包。重复序号用于检测冗余。
确认接收方告诉发送方分组接收的讯号。确认报文通常携带单个分组或多个分组的序号。确认可以是逐个的或者累积的。
否定确认接收方告诉发送方分组接收到的讯号,通常携带着序号。
窗口、流水线发送方被限制发送序号落在一个范围内的分组。通过允许一次发送多个分组而未被确认,来提高发送方利用率。

滑动窗口(GBN)图示(来自NYU slides):

选择重传(SR)图示:

Refernece:

  1. http://www.nyu.edu/classes/jcf/CSCI-GA.2262-001_fa13/
  2. 《计算机网络:自顶而下的算法(第6版)》James F. Kurose, Keith Ross
  3. 《计算机网络》谢希仁

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值