寻找数据链路层的实现


    因为要考试,我又一次拿起了计算机网络教程。翻到数据链路层这一层,我突然想起一个老问题,我是否能找到一个数据链路层的实际例子呢?

    先是wireshark来抓一下包,这个数据链路层很简单,就一个目标地址,源地址,协议 类型。这与教科书上复杂的差错控制,流量控制功能相差太多了,实际上根本没有这些。


    回头一想,这也难怪,OSI7层模型本来就是概念上的。实际情况应有所差别。但即然这书上大写特写,它至少也有些理论依据,是能更好的解决问题的吧。上面的说的差错控制等,在实际的网络传输中确实也是需要考虑的。那是否有实现呢?我在自己电脑上找了Http与ping发的ICMP协议。没有这玩意的具体实现,但我找到了一篇文章是《在VB中实现基于HDLC的数据链路层协议》。那么从这点也可以说明白,这个东西是可以写程序实现的。

    那么,我之前玩arduino用的串口协议,是在那一层。java的Socket又是那一层?我以前认为socket是在传输层,因为我们new Socket时总是要指定一个ip与端口,这不正是传输层的东西么?现在想也不完全对。因为传输层下面还有很多层,但我们写代码时并没有去写协议的东西,而是直接OutputStream.write,就是直接写数据了。而且,无论什么编程语言,计算机之间的通信都是基于IP+端口,没有这两就无法通信。当然串口程序又是另一种情况,他不需要指定IP,但还是需要指定端口,像arduino在ide的配置中,程序都是写到一个端口。

    而在路由器这个层面,它应该也只关心wireshark抓的包里的目标地址,源地址与协议类型(IPV4,IPV6)。家里的几十元的路由器可没太多的计算能力,无法做太多的解包与计算工作。路由功能应该也只限于区分本地与外网。

    所以我们如果不涉及自定义协议去实现计算机或计算机与外设之间的通信,根本找不到协议实现的例子。如果写要把串口通信写得好一点(可靠),就要用协议了,比如服务器就发个abc,除了协议客户端无法知道abc是什么意思。

    所以我了解的这些计算机技术来看,如果要找这些协议的实际用途,只有从串口通信(物理层)出发。到了数据链路层,看帧同步就要想,如果我们arduino的一句Serial.println就当成一个帧。那么\r\n就是首尾定界符,那么数据内容里就不能有\r\n。比如我的小车的控制命令,我可以做到没有\r\n。但如果数据是网页里的文本,这个就不能保证了。

    教材知识是从0开始的,应该说实现数据链路层,有差错管理。毕竟信号从一个地方到另一个地方,各种因素,是会出错的。但这个差错控制我在串口编程与Socket上都没找到差错控制的影子,当然Socket可能会报Exception,但这是不是检错或纠正啊。但Socket上的输入输出流有同步异步一说,这个正好与流量控制(停止等待方案与滑动窗口机制)相对应。
    另外,OSI其它层也有类似的功能。
    所以我们可以把实际与理论做类比,会得到很多相似或相同的地方,但不能完全匹配上。



文/中中 浏览次数:0次   2020-03-22 21:41:15

相关阅读


评论: