OSI模型的精炼分析-网络0
前言: 本文作为我的第一篇掘金文章,会从我较擅长的网络当中,最基础的osi模型开始讲解。虽然很基础,但我结合自身的学习、工作场景,有一些和网上主流描述不同的理解(见1.2)。因此不论你此前是否了解该模型,可能都会有所收获。如果你是新手,则看完本文的粗略介绍后,推荐逐层深入研究该模型,方便你更加透彻的研究各种网络协议。
1、简单介绍
1.1、OSI模型的简单介绍
严谨一点描述,OSI模型就是终端与终端之间网络传输必须遵守的协议模型 。协议,就是大家为了可以进行沟通而共同默认遵守的约定。这样任何沟通,都可以按照该约定按部就班的进行,保证不会出现传输的数据无法理解的情况。
这里之所以加上模型二字,是因为它并非目前的主流协议栈了。目前的主流协议栈为TCP/IP,但即便是TCP/IP也是从其中衍生而来,每层都在OSI中可以找到映射的一个协议栈。因此它是一个非常好的参考模型,更细的颗粒度可以让你更加深入的了解到网络分层处理的思想。以及网络架构所实现的种种功能,彼此之间存在的递进关系。
1.2、理解OSI模型的意义
OSI模型虽然基础,但它确实是网络之本。能透彻的理解OSI模型,是学习网络的 重要基础。 比如说,你对网络的概念是什么?网络传输的本质概念到底是什么?
其实对初学者来说最精炼、最泛用的理解,就是从协议栈到协议栈。承载这个协议栈的不仅会是一个物理网卡,也可能是一个虚拟机中的虚拟网卡。
当然虚拟网卡如docker0,veth等,也都是物理网卡的资源通过namespace(或类似资源隔离功能)进行分割所隔离出来的虚拟资源,本质上也仍旧是物理网卡所提供的网络能力。也就是上面所说的,一个完整的网络协议栈。
同样的,OSI模型对于理解抓包一样重要,在你了解了多种协议它们都属于OSI的哪一层后,再去抓包、剖析。就会变的目的明确,一眼就可以找到自己想要的字段,判断这个包是否符合预期。
2、OSI模型分析
OSI模型结构示意图
这里我会结合上图,自上而下,逐层分析。看一看我们发出的数据是如何打包并进入网络传输过程的。这个过程在对方收到后,会以相反的顺序,逐层解包处理,从而让接收方用户读取到筛选后的数据。2.1、第七层--应用层
这一层的协议,直接为用户提供功能交互。如HTTP传输网页、FTP提供文件下载、DHCP负责IP自动下发等。它们都是网络协议栈中,最直接实现用户需求的协议。应用中的各种传输能力,都由它们作为基础。用户对种种功能的请求,也会在发送至对应功能的协议后,被标记上对应功能的tag作为应用层首部,完成应用层的打包。同时,接下来的表示层与会话层的概念,其实现在已经很少讨论,一般都并入应用层考虑,因此简单了解即可。
2.2、第六层--表示层
该层协议定义了信息的语法、语义,如加密、解密、压缩、解压缩等。
2.3、第五层--会话层
实现应用间建立、管理会话,如客户端访问服务端的会话进程。
2.4、第四层--传输层
2.4.1、端口
每次发包使用、指向的端口号,就是由本层指定。端口号的意义是为了同设备、同IP的交互可以复数利用。端口号范围为1~65535。而彼此交互使用的端口号要么是公共默认的端口号,要么是两端约定好的端口号。常见协议默认使用的端口号如下:
21/tcp FTP
22/tcp SSH
23/tcp Telnet
80/tcp HTTP
110/tcp POP3
443/tcp HTTPS
2.4.2、传输质量的选择
TCP(Transmission Control Protocol,传输控制协议),该协议通过三次握手与四次挥手,保障了其传输链路的可靠性;通过超时重传机制,确保了每个包都能被对方收到;通过协商最大消息长度,确保不被网络层分块传输;通过滑动窗口确保了可靠前提下的最大效率传输。以上种种机制,使得TCP传输实现了相对高的可靠性。
UDP(User Data Protocol,用户数据报协议),TCP协议虽然有滑动窗口实现了尽可能的性能最大化,但其繁杂的机制决定了实现功能的字节占用很高,传输效率大大降低。
举个例子:比如一百字节的报文,UDP只要用8字节实现功能。但比如TCP这样,为了实现更多功能来保证可靠性,占用了20个字节,那么效率就比原来低了九分之一还多。这些损耗不仅会直接呈现在传输数据的速度上,还会影响单个报文的长度,造成被切块甚至丢包的情况。
因此UDP虽然只是尽力而为的转发,并不能保证传输可靠性,但可以大大提高效率。因此不同的上层协议,会根据应用场景的区别,选择性的使用TCP或UDP转发方式。
2.5、第三层--网络层
2.5.1、IP地址
作为网络当中最常接触的属性,IP地址是一个网卡的身份证,当然与人不同的是,网卡可以同时绑定多个IP地址。设备彼此通讯,IP地址就是双方表明身份和锁定对方的唯一标识。因此如果是在公网使用公网IP,就要保证在公网中的唯一性;在局域网中使用私有IP地址就要保证该地址在本局域网中的唯一性。如果发生IP地址冲突,将导致设备无法入网。
2.5.2、路由
首先,网络的传输通常不可能是终端直接连接终端,而是中间要经过一个网络链路。该链路通常也由数台,甚至是十几台的设备传递。 那么在这个传递的过程中,每个设备该如何判断每个数据包接下来要交给与之相邻的哪台设备呢?
为了解决这个问题,便有了路由。路由通常由网段、掩码、下一跳地址(也就是与相邻设备连接的接口IP)所构成。网段与掩码来匹配每个数据包的目的IP地址;下一跳则决定该数据包接下来要交给的相邻设备。从而确定数据包的接下来的走向。而这些自动生成或学习得来的路由,汇总在一起就是路由表。
比如每个终端通常都会有一个网关地址。网关的含义就是每个终端,向外发送数据包,通常所有的包都会直接发给网关设备,让网关设备来决定包的下一步走向。而网关的实现,就是通过写一条默认路由指向网关IP实现。默认路由就是网段、掩码部分全零,可以匹配所有的目的IP地址,下一跳为网关设备的IP,如此便可以将所有的数据包发给网关设备。
2.5.3、ICMP协议
该协议的主要功能,就是实现对IP地址或域名的可达性探测。 最基本的ping命令,就是通过该协议实现。衍生出的更高级用法则有traceroute、MTR等。
2.5.4、数据包限制
最大传输单元MTU(Maximum Transmission Unit),该属性由两个传输设备互联的接口决定,接口配的MTU值,决定了它能接收的数据包最大尺寸(单位为字节,默认值通常为1500)。
之所以会设置该属性,是因为如果单个数据包过大会导致处理单个数据包的时间变长,这是决定延迟的主要因素之一,所以过大的MTU会导致延迟升高。并且如果这个报文丢掉了,重传的代价也很大。而由于每个数据包实现功能封装的部分大小基本固定,MTU如果太小会导致相同带宽的数据传输效率降低,并且处理相同数据量时转发设备要处理更多的报文,这很考验设备的转发的处理能力。
如果报文出现大于MTU的情况,会被分片。切片本身不仅浪费设备处理能力,同时对于有序列号标注的TCP,更是一定要避免切片的存在。所以当网络环境中出现了如VXLAN包这种巨型帧的情况,就需要对MTU做出调整防止包被切片甚至丢失。
2.6、第二层--数据链路层
2.6.1、MAC地址
当我们完成了三层封装后,知道接下来要去往哪台临近设备了,可我们只知道对端IP是多少,我们如何得知该从设备本身的哪个物理接口转发出去呢?这时候就要用到物理地址了。每个网卡在出厂的时候都会被分配一个单独物理地址,该地址是唯一拥有,不会存在冲突(手动修改源MAC地址的情况除外)。
2.6.2、ARP协议
设备可以将连接的对端设备接口IP,和自己与邻居设备连接的接口的MAC地址进行映射,并将所有这样的映射汇总成一张表,就是ARP映射表。该表由ARP协议制作。
这样通过三层路由确认下一跳的IP后,根据ARP表中对应的映射,就可以确认接下来该包要从自身的哪个接口转发出去。
2.6.3、CRC校验
因为数据链路层是数据包封装的最后一层,因此可以对整个包的完整性进行统计,给接收端提供计算该包是否完整的手段。通过CRC校验判断收到的包长度是否和原始长度匹配,可以判断传输过程中是否有字节丢失。
2.7物理层
物理层的定义就很简单,其实就是每种协议栈的物理传输介质标准,如接口、通信介质等。实现物理传输介质的标准化。
3、结语
完成对OSI模型的理解后,对网络中的其他协议或协议栈,都可以以此为参考,更加清晰、快速的学习,因此任何对网络只是有需求的人,都一定要充分学习该模型。
作为我的第一篇技术性文章,文中个别描述可能并不那么准确,是为了更形象的描述而做的形容。如果有更专业的名词,欢迎评论区指正。同时对于文中的一些专业名词,我都会在后续更新的文章中进一步解析,如有感兴趣的部分也可以评论区留言为你解答。