在前一篇博客运维往事 一次负载均衡坏点检测事故中我提到了在生产环境中在第四层和第七层做healthCheck,这个第四层和第七层到底是什么意思呢?除了第四层第七层之外,其他的几层到底是什么?这几层到底做了啥? OSI把整个网络分为7层,但tcp/ip只分为4层,osi的七层从上到下分别是 应用层,表示层,会话层 传输层,网络层,数据链路层,物理层,如下图。
但是TCP/IP有不同的分层模型,分别为应用层,传输层,网络层,网络接口层
其实就是讲OSI中的应用层 表示层 会话层统称为应用层,或者是将数据链路层和网络层通称为网络接口层。接下来我们就以OSI 7层模型为例,来简单说下网络协议。为什么选7层而不是4层,我觉得划分越详细越容易理解其中的细节。这估计也是为什么将网络分层的原因。
应用层
我们先从离大多数人最近的一层开始,这也是大多数人能接触到的一层。应用层最关注的起始是数据的用途,比如应用层常见的协议 __http https ftp ssh socks…… __。应用参的协议都是给用户提供某种功能,其实还是封装了下层的网络协议。
表示层
我觉得表示层和会话层这两层被强制从应用层划分出来还是有点别扭的,因为有时候它俩就像是应用层的东西,有些协议也没法彻底定性为表示层或者应用层。回到表示层,见名知意,这层主要关注于数据是如何“表示”的,数据是二进制形式还是文本形式!是加密还是没有加密! 我觉得像是google的protobuf、facebook的thrift,还有大家所熟知的json,以及https会用到的RSA、椭圆加密加密都能被勉强归到表示层。
会话层
会话层有点抽象,它主要关注的是数据交换双方是如何传输数据的,它向上屏蔽了端到端的连接信息,但这里和tcp连接却不一样,会话层的协议会关注到数据内容,而tcp所关注的数据只有网络报文。 会话层常见协议比如各种RPC协议,例如gRPC,上文提到的thrift等,还有mysql的连接池。 很明显这些协议其实就是向上层屏蔽了服务器之间的数据寻址。
传输层
这层要保证的是把数据从一台机器传输到另一台服务器上,至于数据丢不丢,乱不乱序,不同的协议有不同的做法。大家耳熟能详的tcp和udp就是传输层的协议,他们俩都是网络中数据传输的协议,但是有很大的区别,tcp有丢包重传机制,保序,拥塞控制,所以是很可靠的协议。但它的优点也导致了它的缺点,正是因为它那么可靠,所以它效率低,所以就有了不可靠的udp协议,它只管发数据,收不收到不管,堵不堵不管,虽然不可靠,但是效率高啊。 大家在qq或者微信语音视频的时候感觉视频声音卡,就是因为用的是udp协议,网络不好丢包严重。很多游戏也是用的udp协议,所以有时候会感觉飘啊。现在很多大厂基于udp也做了好多改在,在udp基础上实现部分tcp的功能,来都达到tcp可靠和udp高效之间的权限,比如之前就传出http3.0要使用google的QUIC协议来传输数据。
网络层
网络层关注的是网络的寻址,IP协议就是在这一层,IP地址也是这一层的产物,路由器、集线器就是运行在网络层的硬件。网络层除了大家都知道的IP协议外,还有DHCP协议(很多人应该在路由器里见过这个),还有很多人都不太知道ARP协议。 网络层之间,数据都是通过ip 端口号传输的。
数据链路层
数据链路层,又称为MAC层,原因是因为它和MAC地址相关。所有可以上网的机器都有一个全球唯一的MAC地址,它是在厂商生产网络设备的时候写死在硬件里的,虽然是不能改动的,但很多操作系统提供了修改的功能,都是软改。局域网中通信都是依靠mac地址的。 可能有人很好奇,既然有了mac地址,为什么还会有ip地址?二者存其一不就行了!mac地址虽然是全球唯一的,但它并不具备寻址的功能,就比如身份证号码一样,给你一个身份证号码,你能知道这个人现在在哪吗?但ip地址就不一样了,它具备寻址的能力,就好比现实世界中的地址,北京市 朝阳区 大望路 xxx楼 15层 ……,你很容易就找过去。但是你想在这个地方找具体某个人就不行了,这个时候还得依靠mac地址(身份证号),如果不怕被揍大吼一声“身份证号是xxxx的是哪位啊?”。 数据在局域网之间传输,除了ip地址得对的上之外,mac地址也得对的上。
物理层
这层离很多人包括大多数程序猿就很远了,这层规定了机械和电气规范,比如什么样的电信号表示0什么样是1、通用网线是什么标准,还有WIFI那几个很难记住的802.11/a b g n ac什么的。 最后附上一张神图