计算机无疑是非常复杂的,当初微软公司开发Windows操作系统时,总计有2000名开发工程师,耗费整整3年才开发出来。微软创始人比尔盖兹也坦诚,自己只是精通其中一部分代码,至于其它的只能了解个大概。从这个事实可以推测出,当初为何要将计算机网络抽象成七层。如果不高度抽象,把计算机网络所有功能混合在一起,那将是一团浆糊。 计算机网络的先驱,将计算机网络按照功能将其划分成多个层级。每个层级只包含一小块内容,每一块内容内部如何实现不重要,但是只要保证与上下层的接口严格按照预先定义的即可。将复杂计算机系统切割成独立的、相对简单的小模块,每一模块的工程师只驾驭独立的一块,这样就简单多了。 将计算机网络抽象为物理层、数据链路层,可以将这块内容预留给硬件工程师、通信工程师去研究。这块内容研究的是如何将来自高层的数据,发送方如何信源编码、信道编码、映射、调制、上载波、射频,接收方如何从信道里下载波、解调制、逆映射、信道解码、信源译码、将数据提交给高层。 计算机网络工程师,所做的工作就是研究如何将物理层、数据链路层提交上来的01数据流,提交给网络层。但是且慢,每层都需要对数据的完整性负有不可推卸的责任。如果数据校验出错了,那就不能浪费时间与感情让上层继续处理了,这其实很好理解。 每层需要对数据完整性负责,这其中也包括物理层。物理层其实在信道编码时,参杂了很多冗余数据,比如code 1/2,意味着每传输有效数据1bit,加入了另外一个冗余1bit位。Code 5/6,意味着每传输有效数据5 bits,加入了另外一个冗余1bit。 无线传输的物理层也有自己FCS,一旦校验出错,会使用冗余位来试图恢复原始数据。如果冗余位数多,恢复原始数据时可能的。但是万事有利必有弊,冗余位多了,势必有效传输速率就下降了。为了提高有效传输速率,将会减少冗余位,这样物理层的接收方很有可能就无法恢复原始数据,造成误码。物理层的接收方会通知发送方误码,然后发送方重传?当然可以这样实现,但是一般并不这样实现。物理层编码的冗余,其实已经尽最大可能纠错了。如果在纠错的情况下依然产生误码,将把误码的工作留给其上一层。物理层已经够复杂了,还是把数据重传的任务留给链路层吧。 不用说链路层接收方一下子就会发现数据出错了,把数据一扔了事。链路层的发送方很快就会知道数据出错了,为什么呢? 因为链路层有超时定时器,如果数据在规定时间内没有得到确认,将默认为出错了。这个重传机制是不是似曾相识?TCP重传机制不就是这样的吗? 数据链路层的重传功能,这说的是无线传输。在以太网有线传输,数据链路层并不具有数据的重传功能,只要发现数据校验出错,扔了便是,自然会触发发送方的某一个层面来修复数据。如果带着一个问题学习,为何无线与有线传输在数据重传有以上的差异,将会很快让自己学习上一个台阶。答案其实很简单,可靠性与概率问题。 链路层的数据经过校验没有问题,提交给网络层。按理说,数据是没有问题的,为何网络层还要再次校验呢? 数据从网卡的缓冲存储区搬运到内存一定是100%可靠的吗? 在同学们的脑海里,数据在计算机里是以01存在的,那只是一个逻辑抽象而已。数据在内存里以电压不同状态存在的。超过规定阈值判为1,否则判为0。 既然数据无法100%可靠,需要每层在第一时间完成校验,否则就是浪费感情。当然网络层校验出错,也是一扔了事,只校验不修复。 网络层剩下的工作还有大把,需要明确数据是自己的,还是代理别人转发的,这是两条截然不同的转发路径。 如何判定是自己的还是别人的? 查路由表。 路由表是天上掉下来的吗? 不是。路由协议努力的结果。这部分就是网络工程师需要擅长的,路由协议其实就是几个进程而已,对计算机而言,就是几个提供路由表来源的包工头,需要一起参与竞标,只有竞标成功的路由表才能进入路由表,提供路由的转发工作。谁能竞标成功呢?带着这个问题去看书效果会更好。另外竞标的标的是什么?有效的学习是带着问题学习,每次自己解决一个问题,就是上一个台阶。 如果是别人的,那就将数据报文从出接口发出即可。至于出接口的链路层、物理层如何工作,网络分层已经将其屏蔽了,网络工程师即使不知道实现细节,也不影响工作。但是如果知道底层的实现细节,你会发现一个新大陆。你会很轻松地回答这样的问题,为何有了IP地址,还需要MAC地址? 如果是自己的,将数据提交给传输层,网络层的工作就完成了。传输层当然也会第一时间去校验数据,如果出错怎么办?
-
扔了,当做什么都没有发生,UDP会这么做,应用层会重传数据。
-
扔了,当做什么都没有发生,TCP也会这么做,发送方的TCP会重传数据。但是这样有效传输速率很低效。
-
扔了,触发多次duplicated ACK,会触发发送方的TCP Fast Retransmit算法,可以更快修复丢失的数据。
-END-