如何理解 OSI七层模型?
OSI (Open System Interconnect),即开放式系统互联。一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互联模型。
为什么要有这个模型呢?
主要是为了实现开放系统环境中的互连性、互操作性和应用的可移植性。
有了这个模型,各个层的实现就可以独立开发,复用性强,增加自由度的同时,也提高了生产效率。
数据的发送过程
数据包的发起方,一定都是从高层发起,然后从上往下传输数据,下层为上层提供传输服务,下方不关心传输内容,上层不关心下层如何传输。
就如下面这张图所示
应用层
代表协议有:HTTP,HTTPS,FTP,SMTP,TELNET
由于日常开发中,我们接触的基本都是 HTTP,这里就以 HTTP 为例。
这层负责的是真正业务上的内容,比如你在你的浏览器上,请求一个百度的首页。
览器会将你请求的信息,封装成一个 HTTP 数据包,这个数据包头会包含一些基本的头部信息及请求体(如果有的话)。然后交由下一层处理。
表示层
代表协议有:ASCII,SSL/TLS 等
这一层的作用是,将应用处理的信息转换为适合网络传输的格式。
比如我只会说中文,而日本友人只会说日文,那么我们两个是无法交流的。但如果我们都会说英文,交流时我先在心里想好要说的话是什么,再用英语说出来,日本友人听到英文,在心里转换为日语,他就能弄懂我的意思,此时表示层就是各自在心里转化语言。
当浏览器请求回一堆数据,是解析成文本还是图片,就由表示层决定。数据的压缩、加密、打包等功能也都在这层完成。
会话层
代表协议有: ADSP
、RPC
等。
负责建立和断开通信连接(数据流动的逻辑通路),以及数据的分割等数据传输相关的管理。
比如,何时建立连接,何时断开连接以及保持多久的连接,都是由会话层来进行管理的。
传输层
代表协议有 :TCP,UDP等
传输层起着可靠传输的作用。
对于 DNS 域名解析,传输层协议是 UDP
而对于 HTTP 请求,传输层协议是 TCP
那这两种协议有什么区别呢?
TCP
协议提供可靠的通信传输,简单说就是确认目标能通信的情况下才会传输数据(因此需要三次握手),传输过程如果丢了数据,也会重发。而 UDP
协议则不然,不会确认目标能否通信,只会根据协议发到对方地址的端口。至于对方收不收到,丢不丢包,一概不管。
无论是哪种协议,其协议头信息都会包含本地端口号,和目标端口号(还有报文长度)。
加上这层头信息后,封装好的数据包再交由网络层。
网络层
代表协议有:IP,ICMP 协议等,其也叫IP层,主要应用是路由器(并非我们家中的路由器,扩展阅读:https://www.zhihu.com/question/52176116)。
网络层负责将数据传输到目标地址。
网络层将数据从发送端的主机发送到接收端的主机,两台主机间可能会存在很多数据链路,但网络层就是负责找出一条相对顺畅的通路将数据传递过去。传输的地址使用的是IP地址。
IP地址和我们的住址有点相似,我们的住址可以从省到市再到街逐步缩小范围,直至我们住址。IP地址也有这样的能力,通过不断转发到更近的IP地址,最终可以到达目标地址。如何选择这条路,就看网络层了。
这好比是快递公司的路线规划者。快递公司有很多集散中心,根据集散中心的情况(是否拥堵),找出一条经过n个集散中心的路径将货物(数据)沿路运过去。
在这层里,会给数据包再加一些头信息,包括本地IP地址,目标IP地址(还有数据包的生存空间TTL),同时还会有一个Protocol字段 表示上层到底是 UDP还是TCP协议,这个是用于对端在接收到这个数据包后知道如何解析。
加上这些头信息后,再把数据报(或者说分组、报文)传递给链路层。
链路层
代表协议有:HDLC,PPP,SLIP 等,其也叫 MAC 层,主要应用是交换机,网桥。
该层负责物理层面(一个以太网相连)上互连的节点之间的通信传输。
数据链路层会将0、1序列划分为具有意义的数据帧传送给对端(数据帧的生成与接收)。举个例子可能会更好理解,暂且把需要传输的数据看作为不同来源的水,如果直接倒入池子中时,是无法重新分辨出不同来源的水的。但如果将不同来源的灌入瓶子中并打上记号,那就能区分出不同来源的水。这也就是为什么要划分为具有意义的数据帧传送给对端。
数据链路层可以看作是快递公司的司机,他们驾驶着汽车,将打包好的货物(数据帧)从一个城市(物理节点)运输到另一个城市。
在这层里,会给数据包再加一些头信息,包括本地的mac地址,目标mac地址,同时还有一个type字段表示上层协议是使用的是IP协议,还是其他什么协议,也是用于对端在接收到这个数据包后知道如何解析。
需要注意的是,数据链路层只负责将数据运送给物理相连的两端,并不负责直接发送到最终地址。
加上这些头信息后,再把数据帧传递给物理层。
这一层主要解决两个问题:
第一个问题:网络包是发给谁的,由谁来接收
链路层协议头会包含目标MAC和源MAC
第二个问题:大家都在发包,谁先发,谁后发?
对于这个问题,有多种算法可以解决
方法一:信道划分,就跟马路上分多个车道一样,你走你的,我走我的,互不影响
方法二:轮流协议,还是以交通举例,今天单号出行,明天双号出行,轮着来
方法三:随机接入协议,不管三七二十一,有事儿先出门,发现特堵,就回去。错过高峰再出。
物理层
代表协议有: RS 232C
、RS 449/422/423
、V.24
和 X.21
、X.21bis
等。
物理层负责0、1比特流(0、1序列)与电压高低、光的闪灭之间的互换。
物理层其实就是我们日常能接触的物理介质,比如光纤、电缆、还有空气(还有集线器、中继器、调制解调器),根据这些传输介质的不同,二进制流(0和1)会相应地转化成光信号,电信号,电磁波信号。
物理层是 OSI
七层模型的物理基础,没有它就谈不上数据传输了。