高大上的链路层简单介绍

前言

这一次主要讨论一下链路层,链路层属于最底层的那一层,还记得链路层相当于整个快递过程的那一部分吗?理解好这一次须要一定的硬件知识,假设你是像我一样笨的屌丝,不明确就不明确吧,没啥大不了的.

 

 

链路层究竟是什么

直观地说,链路层事实上就是我们平时接触的网卡和网卡的驱动程序(当然,也能够指其它的网络接口和驱动,比方3G和驱动).

 

那么链路层是做什么的?

 

 

 

这个问题我们能够简单地推理一下,既然链路层能够看做是网卡和网卡驱动程序的总称,那么网卡和网卡驱动程序是做什么的,链路层就是做什么的.这样我们就把问题转换了,搞清楚网卡和网卡驱动程序是做什么的就ok啦.

 

网卡,非常显然,它是数据传输过程中,一个主机(就是我们所说的主机)数据的入口和出口,就像一个城市的火车站一样,好比你去青岛旅游,去的时候要到火车站,走的时候还要到火车站(我这里指的是坐火车的穷屌丝去旅游).

 

这个入口和出口可不是随便让你制造的,你必须依照一定得协议去制作(比方以太网协议).大家会发现,我们的网卡插口都是一样的(网线的插头也是一样的),这不是巧合.网卡网线这都是有形的网卡接口,相同的,对于无线网来讲,虽然他没有让我们看得见摸得着的接口,可是道理是一样的,它在制造的时候也要遵循一定得协议(比方wifi).

 

网卡驱动程序就比較好理解了,网卡依照一定的规则数据传输(比方频率多大?

一次传多少等等问题),对应的,这些规则也须要一个软件来封装和解析,这些工作就是网卡驱动程序完毕的.这有点类似于计算机硬件和OS的关系,假设没有OS,你的那一堆硬件就相当于一堆铁.比方想计算1+1=2,你不可能直接告诉CPU说,你给我算1+1=2,算不给来我就削你.肯定是你须要通过OS,把两个1先存到CPU的存储器其中(比方寄存器),然后调用CPU其中的运算器,才干终于把结果计算出来.

 

网卡也是一样的,假设没有网卡驱动程序,就算你削死它,他也不会给你数据传输的,须要驱动程序把你要传送的数据封装一下,然后交给网卡,网卡一看,我去,你居然要给芙蓉姐姐写情书,于是网卡就得依照你的旨意把信交给芙蓉姐姐,而不是凤姐.

 

一般在驱动程序交给网卡的数据中,都带有源物理地址(也就是发送者的网卡物理地址,这玩意有时候会实用,但一般没啥用).目的物理地址(告诉网卡把数据送给谁)以及协议类型(用于对方接受到数据后用相同的协议解析),比方0f:00:11:0d:01:12这样的形式的东西,是不是非常熟悉呢?他就是网卡的物理地址,是48位的二进制数字(也就是6个字节,中间用冒号分隔),用ipconfig命令就能看到你的网卡物理地址.

 

 

TCP/IP与OSI

 

假设你看过上一篇文章,肯定会问物理层去哪里了?对于这个问题,我想说的是,爸爸去哪儿,它就去哪了...开玩笑,事实上呢物理层属于OSI的七层模型中.OSI和TCP/IP到底有什么关系,接下来咱们一起看看

 

OSI一共同拥有七层,各自是物理层,数据链路层,网络层,传输层,会话层,表示层和应用层.而在上一章中,咱们说过TCP/IP协议族共同拥有四层,各自是链路层,网络层,传输层和应用层.

 

简而言之,它们最大的差别是,OSI仅仅是參考模型,而TCP/IP是眼下实际使用的一个协议族,它已经被大部分OS所实现.他们的相应的关系例如以下图:

 

 高大上的链路层简单介绍_数据

 

能够看到,TCP/IP协议族简化了OSI模型,事实上这样的现象在实际的开发过程中也非经常见,举个简单的案例帮助大家理解:

 

相信web项目的开发大部分朋友都应该不陌生,普通情况下,咱们的分层是Action,Service,Dao这样的三层方式,可是实际开发中,往往不一定依照这个分层去开发.比方有些比較小的项目,会删除Service这一层,由Action直接引用Dao.

 

这事实上就和OSI与TCP/IP的关系一样,參考模型始终是參考用的,实际其中不一定就得依照这个去实现.

 

 

 
链路层存在的意义

 

相信大家都知道自己活得意义是啥,眼下来说,由于咱还是穷学生,所以说,眼下的意义就是挣钱...只是曾经的我感觉活着的意义就是玩大话...我也确实这么做了!不论什么事物的存在都有它的意义

 

所以,TCP/IP中的每一层都应该有它存在的意义.讲到这,不禁会让人产生一个疑问,就是链路层存在的意义是啥?

 

 

知道JAVA中的JDBC吗?(说实话,本屌了解ODBC),说白了一样,就是一写操作数据库的API.那么问题来了,这些API的意义是啥?

 

它的意义就在于,让数据库差异导致的一些细节变化对开发者透明.透明这个词实在是太贴切了,透明的意义就在于”你不知道也不须要知道”.套用这句话,就是JDBC让开发者不知道也不须要知道数据库其中的一些操作细节,仅仅须要依照API的操作说明去调用就能够了.这样带来的优点就是,减少了开发者的学习成本,也添加了程序的扩展性和健壮性.由于你不再须要分别去了解myspl的数据库连接细节,或者oracle的数据连接细节,你仅仅须要知道DriverManager.getConnection()能够给你数据库连接即可了.

 

我们再回到刚才的话题,链路层存在的意义与JDBC特别相似,它让物理传输的细节对上层是透明的.套用刚才那句话,也就是说,上层(比方网络层,传输层等等)不知道也不须要知道数据在物理上是怎样传输的.比方数据究竟是用双绞线还是用同轴电缆,究竟是有线的网络接口还是无线的网络接口传输,这些细节统统不须要链路层的上层去担心.

 

这样做肯定有优点啊,链路层给上层提供了一层封装,就像JDBC给开发者提供的一层封装一样.仅仅要是基于JDBC开发的数据,数据库厂商仅仅要都提供JDBCC的实现,开发者就能够轻易的把数据切换.相同的,仅仅要是基于链路层的协议,网络层包或更高层也能够轻易的切换链路层的实现.比方一会儿使用无线,一会儿使用有线,这对于处于网络层的IP程序,难道把有线网变成无线网就须要改变代码吗?肯定不须要啊.要是须要不就搞笑了吗.

 

所以,如今非常清楚了,链路层存在的意义用一句简单的话来说就是它让上层能够不须要考虑数据物理传输的细节,更专注于自己该做的事.这样的思想多么像MVC分层的设计初衷,MVC的初衷不就是为了让每一层能够专注于做自己的事吗,比方控制层就仅仅专注于业务逻辑,视图层就仅仅专注于界面展示,模型层就仅仅专注于应用程序与数据库的交互.

 

 
小小的总结

 

本屌挺赞赏乔布斯,肯定有人说,人家乔布斯还用得着你个屌丝赞赏啊?额..怎么说呢,我挺佩服乔布斯,老乔就认为人们就应该专心于自己擅长的事情,这样,咱们的社会才干分工明白.就像咱们程序猿一样,搞好和咱们专业相关的技能就好了,什么修马桶,修飞机啥的这些不会就不会吧,人家有专门干这个的.

 

成功者不要在意过程。失败者不要在意结果。