OSI 网络互联参考模型的思考与总结

2024-05-14 21:20

本文主要是介绍OSI 网络互联参考模型的思考与总结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言:

最近一个项目用到了SmartLink配网, 涉及到了UDP的广播和组播,所以就想着回顾总结了下ISO参考模型的相关知识。

OSI(Open System Interconnect),即开放式系统互连。 一般都叫OSI参考模型,是ISO组织在1985年研究的网络互连模型。

该体系结构标准定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层和应用层),所以我们也称作OSI七层模型。

这些模型中的每一层都为下一层提供服务,通过分层的方式,网络互联模型简化了网络设计和故障排除的过程。

数据在各层的形式叫PDU(Protocol Data Unit, 协议数据单元),每层有不同的称呼和封装方式。

  • 应用层(Application Layer)​​​​​​​​​​​​​​

功能:为用户和网络应用程序提供各种网络服务,如文件传输、电子邮件、远程登录等,这部分协议主要是规定应用软件如何去进行通信的。

协议:HTTP(Hypertext Transfer Protocol)、FTP(File Transfer Protocol)、SMTP(Simple Mail Transfer Protocol)、DNS(Domain Name System)等。

数据单元名称:报文/数据(Data),一般指完整的信息,格式由应用程序定义,如HTTP请求、SMTP邮件等。

  • 表示层(Presentation Layer)

功能:对数据进行表示和转换,确保数据在应用层之间的传输具有一致性。这包括数据的加密、解密、压缩、解压缩以及数据格式的转换等。

协议:MIME(Multipurpose Internet Mail Extensions)、ASCII(American Standard Code for Information Interchange)等。

  • 会话层(Session Layer)

功能:负责建立、管理和终止会话,以及同步不同设备上的应用程序之间的对话。

协议:会话层通常不单独使用协议,而是利用其他层次提供的服务来实现其功能。

  • 传输层(Transport Layer)

功能:提供端到端的通信连接,确保数据的可靠传输,实现流量控制和差错控制。

协议:TCP(Transmission Control Protocol,提供可靠传输)、UDP(User Datagram Protocol,提供无连接不可靠传输)等。

TCP数据单元名称:报文段(Segment), 包括TCP头部和数据部分,TCP头部包含源端口、目标端口、序列号、确认号等控制信息。如果应用层数据长度超过了TCP最大分段长度(MSS, Maximum Segment Size),则会进行分段。由于网络层基于链路MTU(最大传输单元,通常是1500字节),会将数据分为若干分片进行传输,因此为了避免在网络层可能的IP分片,MSS值通常会设置为略小于MTU的值,以确保分段后的数据段不用再分片就可以传输了。

UDP数据单元名称:数据报(Datagram),包括UDP头部和数据部分,UDP头部包含源端口、目标端口、数据报长度、校验和等控制信息。

有时候,我们会把传输层的数据单元统称为数据段,但请注意,这个术语可能在不同的上下文中具有不同的含义。例如,在操作系统或内存管理的上下文中,“数据段”通常是指用来存放程序中已初始化的全局变量的一块内存区域。

  • 网络层(Network Layer)

功能:负责数据包的路由选择和转发,实现不同网络之间的通信,同时提供拥塞控制和分片等功能。

协议:主要是IP协议(Internet Protocol,互联网协议,它定义了IP数据包的格式和寻址方式),以及其他如ICMP(Internet Control Message Protocol,互联网控制报文协议)、IGMP(Internet Group Management Protocol,互联网组管理协议)等辅助协议。

数据单元名称:数据包/IP包(Packet),对于IPv4,数据包包括IPv4头部和数据部分。IPv4头部包含版本、头部长度、总长度、TTL(生存时间)、协议类型、源IP地址、目标IP地址等字段。对于IPv6,数据包的格式有所不同,但总体结构类似。

IP分片:如果IP头信息加上数据报文后的长度大于链路MTU,就会对数据进行分片,使每一片的长度都小于或等于MTU,在IP头部有四个字节标识分片信息,这些分片会在目标系统中进行重组。需要注意的是,IP分片可能会带来一些问题。例如,由于IP层没有超时重传机制,如果某个分片在传输过程中丢失,那么整个数据报文都需要重传,这可能会降低传输效率。因此,在可能的情况下,应该尽量避免IP分片的发生。

  • 数据链路层(Data Link Layer)

功能:在物理层的基础上,建立、维护和管理数据链路,提供数据帧的封装/解封装、差错控制和流量控制等功能。

协议:以太网(Ethernet)、点对点协议(PPP)、高级数据链路控制(HDLC)等。

数据单元名称:数据帧(Frame),帧通常包括帧头、数据部分和帧尾。帧头和帧尾包含必要的控制信息,如同步信息、地址信息、差错控制信息等。数据部分则包含来自网络层的IP包报文。不同的数据链路层协议(如以太网、PPP等)可能有不同的帧格式。

  • 物理层(Physical Layer)

功能:处理物理信道上传输的原始比特流,包括比特流的同步、传输和物理接口的相关特性。

协议:不涉及具体的协议,但包括线缆规范、集线器、中继器、网桥、调制解调器等硬件设备。

数据单元名称:数据位/比特流(Bit),没有特定的格式。

虽然OSI模型在理论上被广泛讨论,理解它的层次结构有助于我们更深入地理解网络通信,但在实际网络环境中,TCP/IP四层模型更为常见和实用,也是事实上的工业标准,有时也表述为TCP/IP协议栈。

如下图所示的两种模型的对应关系(最下面是第一层):

有了上面的基本概念,我们通过UDP和TCP通信的实际应用,来认识OSI参考模型每一层的主要作用。

这里特别说明一下,会话层和表示层的功能并不像理论模型中那样明显,特别是在TCP/IP四层模型中被合并到了应用层,所以例子中都省略了这两层。另外为了方便描述,这里不考虑数据段分段和IP分片,假设每次通信用户数据报文只需要一个IP包就可以发完。 

UDP通信

发送方发送字符串 "Hello,Wolrd"

应用层

将用户的数据(有效载荷)封装成应用层协议数据单元,并传给下一层。在应用层我们一般会使用DiagramSocket进行发送和接收,DiagramSocket是一个抽象层,它位于应用层和传输层之间,为应用程序提供了一套接口。

传输层

传输层负责建立、维护和终止端到端的连接。对于UDP协议,连接是无连接的,即不建立专门的通信链路。

接收来自应用层的数据,并为这些数据添加UDP头部信息(8字节),包括源端口号、目的端口号、长度和校验和等。

将封装好的UDP数据报传递给网络层。

网络层

接收来自传输层的UDP数据报后,添加IP头部信息,包括源IP地址、目标IP地址、生存时间(TTL)等。

源IP地址通常是发送数据的主机的网络接口卡(NIC)的IP地址,由主机自动处理的,不需要用户干预,如果主机有多个网络接口和IP地址,操作系统通常会根据路由表和特定的策略来选择使用哪个IP地址作为源IP地址。

目标IP是如何获取呢?按照理论模型,应用层不会将目标IP传递到传输层,也就传递不到网络层,但是在实现程序中会传入了目标IP和目标端口,比如在创建socket的时候需要传入目标IP和目标端口。所以只要有socket句柄,就能获取到目标IP。

将封装好的IP数据包传递给数据链路层。

数据链路层

接收来自网络层的IP数据包后,添加帧头部和尾部信息。

帧头部信息包括源MAC地址、目标MAC地址等。帧尾部通常包含校验和等信息。

将帧数据传递给物理层。

物理层

物理层是OSI模型中的最低层,负责将来自数据链路层的帧转换为适合在传输介质上传输的比特流。

数据封装过程

接收方

当UDP数据包到达目标主机时,上述过程在接收方以相反的顺序进行。

物理层

接收比特流并将其组装为数据帧(根据数据帧中的控制信息和校验信息来判断接收是否完成),然后传递给数据链路层。

数据链路层

处理帧信息(一般只会接受目标MAC地址是本地MAC的数据帧),去除帧头和帧尾后将解析到的IP数据包传递给网络层。

网络层

处理IP头部信息,检查其中的目标IP地址是否是发送给本机的,如果是则继续将解析出的UDP数据报递给传输层。

传输层

处理UDP头部信息,报头中包括源端口号,找到该端口对应的应用程序,然后将数据部分交给应用程序来处理数据。

应用层

应用程序根据协议处理数据,读取到了"Hello,Wolrd"字符串。

经过上述过程,用户数据已经从发送方传输到了目标主机。

我们应该也注意到了在网络通信中传输数据报文时,数据链路层使用的是目标主机的MAC地址,而不是其IP地址。

那这个MAC地址是如何获取到的呢?

ARP(Address Resolution Protocol, 址解析协议)

ARP协议是一个在TCP/IP协议栈中用于解析IP地址到MAC地址的协议。虽然在功能上跨越了网络层和数据链路层,但我认为更适合将其归类为数据链路层的一部分,因为它直接涉及到MAC地址的解析和使用,而MAC地址是数据链路层的关键组成部分。

ARP协议的工作原理:

当源设备需要获取目标设备的MAC地址时,会先在自己的ARP缓存表中查找IP对应的MAC。ARP缓存表记录了之前解析过的IP地址和MAC地址映射关系。

如果没有找到,那么它会发送一个ARP请求广播到局域网中的所有设备,问这个IP地址是谁的。目标设备收到ARP请求后,会检查请求中的IP地址是否与自己的IP地址匹配。如果匹配,目标设备就会将自己的MAC地址封装在一个ARP响应报文中,并发送给源设备。

源设备收到ARP响应后,会将目标IP地址和MAC地址的映射关系存储在ARP缓存表中,以便后续使用。然后,源设备就可以根据目标设备的MAC地址发送数据包了。

TCP通信

TCP 和上面的UDP有几个关键区别:

1.连接性

TCP是面向连接的协议,在发送数据之前,必须首先建立连接(三次握手),并在数据发送完毕后关闭连接(四次挥手)。

UDP则是无连接的协议,它不需要建立连接就可以直接发送数据。

2.可靠性

TCP提供可靠的数据传输服务。它确保数据按序、可靠地传输到目的端。如果数据在传输过程中丢失或损坏,TCP会负责重传,比如发出了报文段,然后一定时间内没有收到ACK确认,就会重传。

UDP不保证数据的可靠传输。它不提供数据排序、确认或重传机制,因此UDP通常用于那些不需要可靠传输的应用,如实时多媒体流或DNS查询。

3.头部开销

TCP的头部开销较大,因为它需要更多的字段来确保数据的可靠传输(如序列号、确认号、窗口大小等)。

UDP的头部开销较小,只有8个字节(包括源端口、目的端口、长度、校验和)。

4.传输效率

由于TCP需要建立连接、确认和重传等机制,因此其传输效率相对较低。

UDP没有这些机制,因此其传输效率更高,延迟更小,但也可能导致数据丢失或乱序。

5.流控制和拥塞控制

TCP具有流控制和拥塞控制机制。流控制用于防止发送方发送过多数据导致接收方缓冲区溢出,而拥塞控制则用于防止网络拥塞。

具体来说,TCP在发送端会预留一个发送窗口,表示发送端可以不断发送数据。在接收端接收数据并发回确认报文之前,发送端不会停止发送数据。当接收端收到数据后,会发回一个带有ACK的确认报文,并在报文中告知当前可用的接收窗口大小。发送端在收到这个确认报文后,会根据接收窗口的大小来调整自己的发送窗口,从而控制发送数据的速率。

UDP没有这些机制。

所以,只要是需要可靠传输的场合,都采用TCP通信。

相对UDP而言, TCP还是比较复杂的,在开始分析TCP报文在OSI网络模型中的传输过程之前,有必要先了解一些TCP协议的核心知识。

TCP报文段数据结构

TCP头部 (20字节) + TCP数据

序列号(seq): 

发送数据时,用来标记报文段的顺序,TCP把连接中发送的所有数据字节都编上一个序号,第一个字节的编号由本地随机产生;给字节编上序号后,就给每一个报文段指派一个序号;序列号就是这个报文段中的第一个字节的数据编号。 序列号会随着发送的字节而增加。

确认号(ack)

期待收到对方下一个报文段的第一个数据字节的序号。序列号表示报文段携带数据的第一个字节的编号,而确认号指的是期望接收到下一个报文段的第一个字节的编号。

因此当前报文段最后一个字节的编号+1即为确认号(比如序号是1000, 数据长度为100个字节,那么ack就为1000+100=1100)。 仅当控制位ACK=1时,确认号字段才有效,即。(注意:为了防止混淆确认号和ACK,一般确认号写作ack,而控制位ACK就写作ACK)

主要作用是解决丢包问题。当接收端收到一个数据段时,它会回复一个ACK(确认)数据段给发送端来确认接收。这个确认号通常是接收端已经接收到的数据的下一个字节的序号。发送端收到这个确认消息后,可以认为序号小于确认号的所有数据都已经被正常接收。

控制位:  

SYN位为1时表示这是一个连接请求,仅在三次握手过程中有效;

ACK位为1表示确认号字段有效,说明接收方成功收到了当前序号的数据,并期待从发送端接收的下一个字节的序号;

RST位为1是重新连接;

FIN位为1 是结束连接;

因为 TCP 是面向连接的,因此需要双方维护连接的状态,这些状态位的包会引起双方的状态变更。

窗口大小:TCP 要做流量控制,需要通信双方各声明一个窗口,标识自己当前的处理能力。

建立TCP连接

建立连接的三次握手示意图:

TCP服务器创建传输控制块TCB,进入监听LISTEN状态,准备接收请求。

第一次握手:客户端——请求(发送请求SYN)

客户端创建传输控制块TCB,进入监听LISTEN状态。

设置序列号seq=x,x是随机序列号。

设置SYN=1,表示这是握手报文。

发送报文段到服务器,此时客户端处于同步已发送(SYN-SENT)状态。

第二次握手:服务器——确认(发送应答SYN-ACK)

设置序列号seq=y,y是服务器端的随机系列号,接收端在回复ACK时,其序列号会是其接下来要发送的数据的序列号(如果接收端也要发送数据的话)。对于ACK本身来说,序列号不是重点。

设置ack=x+1,表示已收到客户端x之前的数据,希望下次数据从x+1开始。

设置ACK=1,表示确认应答。

设置SYN=1,表示握手报文。

发送报文段到客户端,此时服务器处于同步已接收(SYN-RCVD)状态

第三次握手:客户端——确认服务器的确认 (发送应答ACK)

设置ack=y+1,表示已收到服务器发来的序列号为seq=y的报文段,希望下次数据从y+1开始。

设置seq=x+1,表示接着上一个数据的字节序号seq=x继续发送。

设置ACK=1,表示确认应答

发送报文段到服务器,至此三次握手结束,连接建立。

TCP通信中OSI各层作用

发送方通过TCP发送"Hello,Wolrd"字符串

应用层

将用户的数据(有效载荷)封装成应用层协议数据单元,并传给下一层。在应用层我们一般会使用Socket进行发送和接收,Socket是一个抽象层,它位于应用层和传输层之间,为应用程序提供了一套接口。

传输层
创建TCP连接(三次握手), 并维护和终止TCP连接。

接收来自应用层的数据,进行数据分段(前文有说过分段规则)、添加TCP头部信息(包括源端口、目标端口、序列号、确认号等)等操作,以确保数据能够按照正确的顺序到达目的地,并处理丢失或损坏的数据包,如重传。

将封装好的TCP报文段传递给网络层。

网络层、数据链路层、物理层就和UDP几乎一样了,所以此处我们省略。

接收方

当TCP数据包到达目标主机时,上述过程在接收方以相反的顺序进行。

在物理层、数据链路层、网络层的处理也和UDP一样,此处也省略, 直接看传输层。​​​​​​​

传输层

从网络层接收数据包后,根据TCP协议进行数据包的组装、排序和重传等操作(发送方如果发送的数据被分段了,就会有多个数据包,到达接收方的顺序可能是错乱的)。

当收到的数据完整且正确后,找到报头中源端口对应的应用程序,然后将数据部分交给应用程序来处理数据。

应用层

应用程序根据协议处理数据,读取到了"Hello,Wolrd"字符串。

 

在TCP/IP四层模型中,并没有一个独立的会话层来直接管理TCP连接。虽然TCP连接是由传输层的TCP协议管理的,但实际中通常由应用层协议(如HTTP)通过TCP协议来建立、管理和终止会话。

这篇关于OSI 网络互联参考模型的思考与总结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/989884

相关文章

关于C++中的虚拟继承的一些总结(虚拟继承,覆盖,派生,隐藏)

1.为什么要引入虚拟继承 虚拟继承是多重继承中特有的概念。虚拟基类是为解决多重继承而出现的。如:类D继承自类B1、B2,而类B1、B2都继承自类A,因此在类D中两次出现类A中的变量和函数。为了节省内存空间,可以将B1、B2对A的继承定义为虚拟继承,而A就成了虚拟基类。实现的代码如下: class A class B1:public virtual A; class B2:pu

【Altium】查找PCB上未连接的网络

【更多软件使用问题请点击亿道电子官方网站】 1、文档目标: PCB设计后期检查中找出没有连接的网络 应用场景:PCB设计后期,需要检查是否所有网络都已连接布线。虽然未连接的网络会有飞线显示,但是由于布线后期整板布线密度较高,虚连,断连的网络用肉眼难以轻易发现。用DRC检查也可以找出未连接的网络,如果PCB中DRC问题较多,查找起来就不是很方便。使用PCB Filter面板来达成目的相比DRC

十五.各设计模式总结与对比

1.各设计模式总结与对比 1.1.课程目标 1、 简要分析GoF 23种设计模式和设计原则,做整体认知。 2、 剖析Spirng的编程思想,启发思维,为之后深入学习Spring做铺垫。 3、 了解各设计模式之间的关联,解决设计模式混淆的问题。 1.2.内容定位 1、 掌握设计模式的"道" ,而不只是"术" 2、 道可道非常道,滴水石穿非一日之功,做好长期修炼的准备。 3、 不要为了

通信系统网络架构_2.广域网网络架构

1.概述          通俗来讲,广域网是将分布于相比局域网络更广区域的计算机设备联接起来的网络。广域网由通信子网于资源子网组成。通信子网可以利用公用分组交换网、卫星通信网和无线分组交换网构建,将分布在不同地区的局域网或计算机系统互连起来,实现资源子网的共享。 2.网络组成          广域网属于多级网络,通常由骨干网、分布网、接入网组成。在网络规模较小时,可仅由骨干网和接入网组成

关于如何更好管理好数据库的一点思考

本文尝试从数据库设计理论、ER图简介、性能优化、避免过度设计及权限管理方面进行思考阐述。 一、数据库范式 以下通过详细的示例说明数据库范式的概念,将逐步规范化一个例子,逐级说明每个范式的要求和变换过程。 示例:学生课程登记系统 初始表格如下: 学生ID学生姓名课程ID课程名称教师教师办公室1张三101数学王老师101室2李四102英语李老师102室3王五101数学王老师101室4赵六103物理陈

Toolbar+DrawerLayout使用详情结合网络各大神

最近也想搞下toolbar+drawerlayout的使用。结合网络上各大神的杰作,我把大部分的内容效果都完成了遍。现在记录下各个功能效果的实现以及一些细节注意点。 这图弹出两个菜单内容都是仿QQ界面的选项。左边一个是drawerlayout的弹窗。右边是toolbar的popup弹窗。 开始实现步骤详情: 1.创建toolbar布局跟drawerlayout布局 <?xml vers

人工智能机器学习算法总结神经网络算法(前向及反向传播)

1.定义,意义和优缺点 定义: 神经网络算法是一种模仿人类大脑神经元之间连接方式的机器学习算法。通过多层神经元的组合和激活函数的非线性转换,神经网络能够学习数据的特征和模式,实现对复杂数据的建模和预测。(我们可以借助人类的神经元模型来更好的帮助我们理解该算法的本质,不过这里需要说明的是,虽然名字是神经网络,并且结构等等也是借鉴了神经网络,但其原型以及算法本质上还和生物层面的神经网络运行原理存在

Java注解详细总结

什么是注解?         Java注解是代码中的特殊标记,比如@Override、@Test等,作用是:让其他程序根据注解信息决定怎么执行该程序。         注解不光可以用在方法上,还可以用在类上、变量上、构造器上等位置。 自定义注解  现在我们自定义一个MyTest注解 public @interface MyTest{String aaa();boolean bbb()

tensorboard-----summary用法总结

Tensorflow学习笔记——Summary用法         最近在研究tensorflow自带的例程speech_command,顺便学习tensorflow的一些基本用法。 其中tensorboard 作为一款可视化神器,可以说是学习tensorflow时模型训练以及参数可视化的法宝。 而在训练过程中,主要用到了tf.summary()的各类方法,能够保存训练过程以及参数分布图并在

七种排序方式总结

/*2018.01.23*A:YUAN*T:其中排序算法:冒泡排序,简单排序,直接插入排序,希尔排序,堆排序,归并排序,快速排序*/#include <stdio.h>#include <math.h>#include <malloc.h>#define MAXSIZE 10000#define FALSE 0#define TRUE 1typedef struct {i