网络协议

详解网络分层和网络协议工作原理
帅旋
关注
充电
IT宅站长,技术博主,架构师,全网id:arthinking。

网络是如何分层的? | OSI,TCP/IP

发布于 2020-07-26 | 更新于 2024-05-16

1、OSI七层模型

为了制定一个统一的计算机网络体系,国际标准化组织ISO提出了一个试图使各种计算机可以在世界范围内互联成网的标准框架:OSI/RM(Open System Interconnection Reference Model 开放系统互连基本参考模型),该模型如下:

image-20211024132136056

媒介层: 第一到第三层称为媒体层,它们主要与硬件相关,例如路由,交换和电缆规格;

主机层: 第四到第七层称为主机层,它们是实现网络服务相关的软件。

大致介绍一下各层(注意:看看就好,这不是重点,重点是后面的TCP/IP协议):

  • 物理层:物理层负责在设备和物理传输介质直接传输和接收非结构化原始数据。这一层中,把数字位转换为电,无线电或光信号。可以发现这一层往往跟各种材质啊信号呀什么的打交道,所以称为物理层;
  • 数据链路层:在通过物理层连接的两个节点之间进行传输数据帧,检测并且纠正物理层中可能发生的错误。它定义了在两个物理连接的设备之间建立和终止连接的协议,还定义了他们之间的流控制协议;
  • 网络层:构建和管理多节点网络,包括寻址、路由、流量控制。网络层是一种可以连接许多节点的介质,每个节点都在其上有一个地址,通过目标地址就可以在节点之间传输数据到目标地址。网络层消息传输不一定要保证可靠,网络层系可以可以提供可靠的消息传递,但不必这样做;
  • 传输层:传输层提供了将可变长度数据序列从源传输到目标主机的功能和过程方法,同时又保持了服务功能的质量。一些协议是面向状态和面向连接的,这意味着传输层可以进行分段传输、支持失败重传;
  • 会话层:控制计算机之间的连接,负责建立、管理和终止本地和远程引用程序之间的连接,提供全双工、半双工或者单工操作;
  • 表示层:网络服务和应用程序之间的数据转换,如字符编码、数据压缩、加密解密;
  • 应用层:最接近最终用户的OSI层,该层直接与实现通信组件的软件应用程序进行交互。

可以发现,这个模型还真有点复杂。但很可惜,这个模型似乎不怎么流行,原因如下:

  • OSI专家缺乏实际经验,缺少商业驱动;
  • OSI协议实现过于复杂,运行效率低;
  • 标准制定周期长,市场已被其他标准占据;
  • 层次划分不太合理,部分功能在多个分层中出现。

在1980年代末和1990年代初的一段时间内,工程师、组织和国家对哪种标准(OSI模型或Internet协议套件)将更能塑造最佳和最强大的计算机网络存在争端,导致两极分化。尽管OSI在1980年代后期开发了其网络标准,后来更多的供应商网络上更多采用的却是TCP / IP标准,最终TCP/IP成为了实时的国际标准。

2、TCP/IP四层模型

下面我们把TCP/IP模型和OSI模型放一起对比下:

image-20211023113039028

可以发现,TCP/IP体系少了表示层和会话层,数据链路层和物理层用链路层取代。

  • 应用层:最高层,应用层的任务是通过应用进程间交互来实现特定网络应用。主要负责把应用程序中的用户数据传达给另一台主机或同一主机上的其他应用程序。这是所有应用程序协议的运行层,如SMTP、FTP、SSH、HTTP等;
  • 传输层:负责向两个主机中的进程之间的通信提供通用的数据传输服务。UDP是基本的传输层协议,提供了不可靠的无连接数据报传输服务;
  • 网络层:负责为分组交换网上的不同主机提供通信服务。该层定义了寻址和路由功能,主要协议是IP协议(Internet Protocol),它定义了IP地址,它在路由中的功能是将数据报传输到充当IP路由器的下一个主机,该主机更接近最终数据目的地;
  • 链路层:也称为数据链路层或者网络接口层,通常包括操作系统中设备驱动程序和计算机对应的网络接口卡。它们负责处理与传输媒介的物理接口细节。

而后面我们除了讲到各种协议之外,还会顺便提及一些底层硬件,为了更好的进行阐述,我们将把链路层再分为物理层和数据链路层,采用以下这种五层模型:

image-20211023113441744

根据运行模式分为以下两种:

  • 运行于用户进程:应用层,关注应用程序的细节,不关注底层网络通信细节;
  • 运行于内核:传输层、网络层、链路层,在内核中执行,主要处理所有的通信细节。

介绍了这么多概念,是不是比较难懂呢,没关系,我们列一下每一层主要的协议,接下来我们会详细的讲解各种协议的原理。

3、分层模型如何工作

这里我们通过一个FTP客户端的通信流程,来说明下两台主机是如何工作在TCP/IP分层模型上的:

image-20211023113417608

如上图,A主机的FTP客户端要与B主机的FTP服务器进行交互。

我们对设备做一下划分:

  • 端系统(End system):A主机和B主机
  • 中间系统(Intermediate system):路由器

其中用到的协议也做一下划分:

  • 端对端协议(End-to-end):包括应用层和传输层,端系统直接直接进行交互;
  • 逐跳(Hop-by-hop)协议:网络层,需要经过端系统中所有的中间系统。

对于应用层来说,他们好像是直接与端系统进行交互的,应用层根本不知道底层通信用了多少个路由器,是在以太网上还是在令牌环网上的。

什么是三层设备,二层设备?

如上图,路由器工作在网络层,属于第三层,所以经常有人称他为三层设备;而后面我们会讲到交换机,他是工作在第二层-数据链路层,所以也成为二层设备。

3.1、为什么要分层?

正如上面的例子,分层之后是的顶层屏蔽了底层的物理和通信细节。底层的通信原理是在较低的协议层中实现的,因此每个进程都将隐藏大多数通信细节。以此类推,在传输层,通信表现为主机到主机,而无需了解应用程序数据结构和连接的路由器。而在互联网络层,则在每个路由器上遍历各个网络边界。

就像我们搞软件开发划分层次一样,**分层之后,提高了软件的复用度,封装每层细节,使用者只需要关注使用的API就可以了,不用关注实现细节。**你不要告诉我你的一个功能涉及的一万行代码是写在一个函数里面的,那太可怕了。

想要了解底层细节的人,就只能拆开TCP/IP协议潘多拉之盒,逐个协议去了解了,这也是本文后边会继续探讨的内容。高度的封装,使得顶层开发人员能更快速的通过API开发应用程序。**作为一个API工程师,你知道怎么调用API发送HTTP请求就够了,但是作为一个有追求的工程师,你了解了这些细节之后,就能够胜任程序调优以及更加底层的开发工作了。**这也是为什么我坚持写IT宅 itzhai.com博客的原因:我想探索技术的本质,而不是生活在API构造的童话世界里面,这样即使童话世界谎言被拆穿的那天,也不至于失掉技术的信仰,因为我仍然有能力构建一个新的童话世界。

image-20200711122943411

image-20200711120503245

接下来我们看看数据包从在传输过程中是如何封装的。

3.2、数据包的封装和分用

为了演示,我们需要构建一个局域网(LAN)。

假设我们现在直接通过两个网线把两台电脑连起来进行通信,需要做哪些工作呢。多亏我大学学的是网络工程,也是拉过网线的,所以多少还知道一点:

  • 准备一根网线,两个水晶头;
  • 水晶头要做交叉线,采用1-3,2-6交叉接法,保证两个水晶头之间能够正常收发信号;
  • 把两个水晶头分别插在两台主机的电脑上;
  • 给两台电脑配置IP、子网掩码和网关,必须要配置到同一个网络中。

这样我们就构建好了一个最简单的局域网了。

image-20211023113345788

3.2.1、封装

所谓封装,就是每一层都会根据用到的协议,把数据封装成最终的一个数据单元(不同分层有不同的叫法,参考上图最左边每层的描述),每一层拿到的上一层的内容,把上一层封装好的内容作为当前层的数据,然后加上自己的协议头或者尾,接着执行该层协议的相关处理逻辑。

有没有发现,这有点像装饰者模式,每一层拿到上一层的内容之后都添加额外的处理逻辑,但是不改变上层传过来的内容。

image-20211023113956138

如上图,左边部分为封装的过程:

  • A主机请求B主机的HTTP服务,应用层使用HTTP协议对请求内容进行封装,加上HTTP请求头,然后传给下一层;
  • 传输层拿到HTTP数据,使用TCP协议进行处理,加上自己的TCP头,封装成数据段,通过TCP协议传输给下一层。这一层通过TCP协议保证了可靠的传输
  • 网络层拿到TCP传输段之后,使用IP协议进行处理,加上IP头,封装成包进一步传给下一层。这个IP决定了什么路由或者主机需要接收处理这个包;
  • 数据链路层拿到网络层的包之后,进一步封装成数据帧,最终通过数据链路层进行发送处理,最终数据帧通过物理层传输给接收端。

3.2.2、分用

所谓分用,指的是主机或者中间设备接收到一个物理层传输过来的数据帧时,数据开始从协议栈中由底向上升,逐层处理,每层去掉对应的协议的报文首部。每层协议盒都要检查报文首部的协议标识进行对应的协议处理。

image-20211023113956138

在上图中,右边部分为分用的过程:

  • 主机B接收到物理层传过来的数据帧之后,首先从首部找到MAC地址,判断是否发送给自己的,如果不是则进行丢弃;
  • 如果发送包是自己的,则从数据帧确定数据协议类型,再传给对应的协议模块,如IP、ARP等;
  • IP模块接收到数据后获取IP首部判断首部接收的IPIP地址匹配,如果匹配则根据首部协议类型转发给对应的模块,如TCP、UDP等;
  • 传到TCP模块之后,首先TCP模块会计算校验和,判断数据的完整性,然后处理数据包的顺序接收相关逻辑;最后检查端口号,确定具体应该要转发给应用层的哪个应用程序。
  • 应用层接收到数据之后,解析数据进行展示,这里是HTTP数据包,所以按照HTTP协议的约定进行解析展示。

可以发现,以上流程中,大家感知最深刻的就是传输层的TCP或者UDP协议,以及应用层的HTTP协议了,因为做网站开发,或者网络通信编程经常会用到它们的API。

上面介绍的并不是很详细,不过没关系,后面我们会把主要的协议都拿出来详细的讲解。

当然,正常的网站请求中,中间肯定会涉及到很多路由器,交换机,光纤等底层的物理设备,中间会产生很多的逐跳(Hop-by-hop),每个中间系统都会对数据帧进行分用和封装的过程。

4、TCP/IP协议簇

TCP/IP协议簇内容非常多,这里列出的是本文可能会介绍到的相关协议,以及他们之间的交互关系:

image-20211023114102785

References

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/network/network-layering.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。

请帅旋喝一杯咖啡

咖啡=电量,给帅旋充杯咖啡,他会满电写代码!

IT宅

关注公众号及时获取网站内容更新。