网络协议栈中链路层的意义
初学网络协议栈的时候,一层一层学下来很有抽丝剥茧的快感,同时也发现之前习以为常的互联网能形成现在这个规模并且稳定运行是一件多么不容易的事情。
网络协议栈里的应用层、传输层和网络层应该说都是很好理解的,但是数据链路层和物理层到底是怎么回事,发挥什么功能,为什么有存在的必要,刚学的时候就很是迷惑,后来算是慢慢搞明白了。在这里记录一下:
网络层的主体协议是IP协议,全称互联网协议。看名字就知道,他是为互联网这种庞大的网络而生的协议,主要目的是解决超远距离路由问题,每一个参与路由的节点(包括主机和路由器),都要维护一个路由表来决定发往某特定IP或IP段的数据的下一跳IP地址是什么。数据在封装到IP数据报里之后,查路由表得知自己的下一跳IP地址是多少,再将数据发送过去,这样一跳一跳地接力,最终把数据发送到目的地。
这么看起来似乎只要IP层就足够路由了,为什么还要搞个数据链路层呢?
- 这是网络分层设计的必然要求
网络为什么要分层设计,只设计一层行不行?当然是行的,但这样就势必非常复杂。网络层为什么和数据链路层分开,也是为了设计的简单化,当时在设计IP协议的时候,设计思路就是让网络层的功能尽可能地简单,其他非必须功能由其他层完成。因为互联网是“把采用不同协议的子网连接起来构成的网络之网络”,如果IP层协议太复杂,势必会导致各种子网接入的困难。
比如说,网络层和数据链路层分开后,链路层就可以使用有线连接的以太网,无线连接的WiFi,以及手机基站这种3G、4G、5G网络,这些使用完全不同连接技术的设备能方便地接入互联网,就得益于数据链路层和网络层协议设计分开这一思想。否则如果混杂在一起,就会导致新的技术接入互联网很困难,比如说即将到来的5G,难以想象每一种链路层新技术的发明都导致需要全网更新IP协议会是什么场景,这样的经济开销就太可怕了。君不见就推行个IPv6还这么困难呢。
而只有数据链路层的话,因为MAC地址不像IP地址这样支持聚合(CIDR技术),因此路由表不能根据块地址进行转发,而必须为每一个单独的MAC地址保留一个路由项目,算下来每个路由光路由表就得保存1.5PB的数据,共2^48条,简直不可想象。 - 数据链路层做的工作和网络层有什么不一样
上文说到,查过路由表之后,IP层的功能就是指示,把这个IP数据报发送到下一跳IP去。那么我们可能会遇到这样的问题:就是这条线路有可能是多个节点共同使用的共享链路。
比如我这样一个网络拓扑:

顶端的主机我们编号为X,下面五个主机我们分别编号为A,B,C,D,E。此时A要向E发送信号,B要向D发送信号,C要向X发送信号。但他们用的是同一条物理介质,要知道数据的物理传输也就是用比如电平高低、光线变化、电磁波变化等方式来区分0和1的,假如图中的线路采取的是通过电平高低来识别01,如果大家没有一种途径来协商如何使用这个链路,而是想发数据了一股脑都发出来,那整条线路的电平就都是混乱的,结果是数据全部毁损,谁都没有成功发送正确的数据,这种现象就叫做冲突。
发生冲突即意味着数据传输失败,而共享链路无处不在,比如说早期采用集线器连接的以太网,还有现在广泛使用的无线网。物理链路层必须能够处理这些冲突,就是如何保证在共享链路上某一特定时间段只有一个主机占用链路进行通信,或者说虽然是同时占用,但通过某种方式也能让他们的信号彼此区分,这种技术称为多址接入,在数据链路层上由MAC子层(media access control,介质访问控制)完成。
同时,因为不同物理介质的特点,数据链路层采取的技术也不一样,比如无线网就更不稳定,更容易受到干扰也更容易出错,而有线网络就相对稳定,因此有线网络比如以太网就可以采取类似CDMA/CD技术,甚至因为有线网可以实现完全的点对点,就是说一条物理线路上只连接端点的两个主机,完全避免数据冲突的可能,而无线网络就只好采取CDMA/CA技术,还采取了确认重传等技术来保证数据传输的稳定性。
在比如,在一条链路上,我们的网络层连续发出了转发三条数据报的要求,于是这条链路上有三条首尾相连的比特流,接收方怎么区分数据报文的边界呢?怎么知道第一条报文和第二条报文从哪个bite开始断开呢?这也需要链路层协议提供支持。(还是那句话,可以把这个功能做到IP层,但过于复杂不便拓展)
可见,网络层就一句话,我这个数据报的下一跳IP是XX.XXX.XX.XX,请发送过去,链路层就要处理很多问题才能保证你的数据完整、正确、安全地传输到下一个节点去。 - 数据链路层和物理层之间的区别与联系
其实数据链路层和物理层是紧密联系在一起的,802.2,802.3,802.11协议,都是同时描述了数据链路层和物理层的。目前对于这两个层的交界面我还没有区分地很清楚,但是也有一些简单的认识。
物理层直接负责数据的传输,但物理层是不可靠的,也就是说,我发送了一个0,到了接收端,不定就成了1了,特别是在无线传输中,这样的问题更加严重。而链路层就实现了部分纠错功能。具体的方式是采取差错编码。比如说,IP层发给我的1,我把他处理成1111,0我处理成0000(其实不会真这么干,汉明码可以了解一下),发送的时候在对面校验一下,假如对面收到一个1101,那可能是1111错1位导致的,也可能是0000错3位导致的,而错1位的概率更大,因此我就认为发送端的数据是1111,这样我就不用要求重传,而直接把他更改为1111。(当然错3位的情况也有可能,但概率小啊,这种错误就交给上层去验证和处理,比如IP层还有校验呢)
暂时就这样。
莫要吐槽封面图,我就是喜欢AA~维密真·女神。
0 条评论