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

相关文章

Python中实现进度条的多种方法总结

《Python中实现进度条的多种方法总结》在Python编程中,进度条是一个非常有用的功能,它能让用户直观地了解任务的进度,提升用户体验,本文将介绍几种在Python中实现进度条的常用方法,并通过代码... 目录一、简单的打印方式二、使用tqdm库三、使用alive-progress库四、使用progres

SSID究竟是什么? WiFi网络名称及工作方式解析

《SSID究竟是什么?WiFi网络名称及工作方式解析》SID可以看作是无线网络的名称,类似于有线网络中的网络名称或者路由器的名称,在无线网络中,设备通过SSID来识别和连接到特定的无线网络... 当提到 Wi-Fi 网络时,就避不开「SSID」这个术语。简单来说,SSID 就是 Wi-Fi 网络的名称。比如

Java实现任务管理器性能网络监控数据的方法详解

《Java实现任务管理器性能网络监控数据的方法详解》在现代操作系统中,任务管理器是一个非常重要的工具,用于监控和管理计算机的运行状态,包括CPU使用率、内存占用等,对于开发者和系统管理员来说,了解这些... 目录引言一、背景知识二、准备工作1. Maven依赖2. Gradle依赖三、代码实现四、代码详解五

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

Linux 网络编程 --- 应用层

一、自定义协议和序列化反序列化 代码: 序列化反序列化实现网络版本计算器 二、HTTP协议 1、谈两个简单的预备知识 https://www.baidu.com/ --- 域名 --- 域名解析 --- IP地址 http的端口号为80端口,https的端口号为443 url为统一资源定位符。CSDNhttps://mp.csdn.net/mp_blog/creation/editor

git使用的说明总结

Git使用说明 下载安装(下载地址) macOS: Git - Downloading macOS Windows: Git - Downloading Windows Linux/Unix: Git (git-scm.com) 创建新仓库 本地创建新仓库:创建新文件夹,进入文件夹目录,执行指令 git init ,用以创建新的git 克隆仓库 执行指令用以创建一个本地仓库的