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协议来建立、管理和终止会话。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/625678.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux】自动化编译工具——make/makefile(超细图例详解!!)

目录 一、前言 二、make / Makefile背景介绍 🥝Makefile是干什么的? 🍇make又是什么? 三、demo实现【见见猪跑🐖】 四、依赖关系与依赖方法 1、概念理清 2、感性理解【父与子👨】 3、深层理解【程序…

30-10y国债利差反转的必要条件

国君宏观表示,30-10y期限利差定价本质上是私人部门主动加杠杆的预期,央行购债与资本市场的正向反馈是可以期待的一种场景,而企业部门的被动加杠杆须以可持续的需求动能与盈利预期作为前提。 要点: 期限利差的本质:对长…

C++:编程领域的全能王者

在编程语言的海洋中,C以其全面而强大的功能,犹如一位全能王者,屹立不倒。它不仅在科技领域有着广泛的应用,更在推动社会进步、促进人类创新方面发挥着至关重要的作用。 一、C:编程界的璀璨明星 C自诞生以来&#xff…

时间序列预测模型实战案例(三)(LSTM)(Python)(深度学习)时间序列预测(包括运行代码以及代码讲解)

目录 引言 LSTM的预测效果图 LSTM机制 了解LSTM的结构 忘记门 输入门 输出门 LSTM的变体 只有忘记门的LSTM单元 独立循环(IndRNN)单元 双向RNN结构(LSTM) 运行代码 代码讲解 引言 LSTM(Long Short-Term Memory)是一种常用的循环神经网络&a…

数据库的存储过程、函数与触发器

使用下面的场景来引入 1.创建表 CREATE DATABASE staff; USE staff; CREATE TABLE employee(id INT NOT NULL AUTO_INCREMENT,userName VARCHAR(255),birthDate DATE,idCard VARCHAR(255),loginName VARCHAR(255),PASSWORD VARCHAR(255),mobile VARCHAR(255),email VARCHAR(2…

Python爬虫——如何使用urllib的HTTP基本库

怎样通过 urllib库 发送 HTTP 请求? urllib库主要由四个模块组成: urllib.request 打开和读取 URLurllib.error 包含 urllib.request 抛出的异常urllib.parse 用于解析 URLurllib.robotparser 用于解析 robots.txt 文件 1. 使用urllib.parse解析URL 使用urlparse(…

C++:编程世界的永恒之石

在编程的广袤领域中,C犹如一块永恒的基石,历经岁月的洗礼,依旧坚固而璀璨。它的深厚底蕴、强大功能和广泛的应用领域,使其成为无数程序员心中的信仰与追求。 一、C:历史与传承的交汇点 C的历史可追溯到上世纪80年代&…

Spring自定义配置属性类

以一个minio的配置类为例 首先,由于minio模块被很多微服务需要,因此封装了一个starter,当背的微服务需要的时候就进行引入。 以下是starter模块的结构图 一、spring.factories文件 org.springframework.boot.autoconfigure.EnableAutoConf…

2.1.2 事件驱动reactor的原理与实现

LINUX 精通 2 day14 20240513 day15 20240514 算法刷题:2维前缀和,一二维差分 耗时 135min 习题课 4h 课程补20240425 耗时:4h 课程链接地址 回顾 怎么学0voice课网络io——一请求一线程,一个client一个连接再accpet分配io f…

每日两题 / 437. 路径总和 III 105. 从前序与中序遍历序列构造二叉树(LeetCode热题100)

437. 路径总和 III - 力扣(LeetCode) 前序遍历时,维护当前路径(根节点开始)的路径和,同时记录路径上每个节点的路径和 假设当前路径和为cur,那么ans 路径和(cur - target)的出现次数 /*** D…

C语言:指针(3)

1. 字符指针变量 在指针的类型中我们知道有⼀种指针类型为字符指针 char* ; 本质是把字符串 hello bit. ⾸字符的地址放到了pstr中。上⾯代码的意思是把⼀个常量字符串的⾸字符 h 的地址存放到指针变量 pstr 中。 2. 数组指针变量 2.1 数组指针变量是什么? 答案…

2024年高考倒计时精品网页

2024年高考倒计时精品网页 前言效果图部分代码领取源码下期更新预报 前言 随着季风轻轻掠过,岁月如梭,再次迎来了这个属于青春与梦想交汇的时刻——高考。这是一场知识的较量,更是一次意志的考验。在这最后的冲刺阶段,每一刻都显…

注意力机制篇 | YOLOv8改进之在C2f模块引入反向残差注意力模块iRMB | CVPR 2023

前言:Hello大家好,我是小哥谈。反向残差注意力模块iRMB是一种用于图像分类和目标检测的深度学习模块。它结合了反向残差和注意力机制的优点,能够有效地提高模型的性能。在iRMB中,反向残差指的是将原始的残差块进行反转,即将卷积操作和批量归一化操作放在了后面。这样做的好…

第 5 篇 : 多节点Netty服务端(可扩展)

说明 前面消息互发以及广播都是单机就可以完成测试, 但实际场景中客户端的连接数量很大, 那就需要有一定数量的服务端去支撑, 所以准备虚拟机测试。 1. 虚拟机准备 1.1 准备1个1核1G的虚拟机(160), 配置java环境, 安装redis和minio 1.2 准备6个1核1G的空虚拟机(161到166), …

【opencv】图像拼接实验

实验环境:anaconda、jupyter notebook 实验用到的包:opencv、matplotlib、numpy 注:opencv在3.4.2之后sift就不是免费的了 我用的是3.4.1.15版本 实验使用到的图片 一、sift函数获取特征值 读入图片 book cv2.imread(book.png, cv2.IMRE…

Winform(c#)如何上传图片等资源文件

1、首先找到工程中properties,如下图双击其中的Resources.resx文件 2、进入下面界面,点击“添加资源”,选择要添加的图片资源 3、然后我们就可以使用了

OSPF工作过程

1.OSPF的数据包 hello包——周期性的发现,建立以及保活邻居关系 hello时间 --- 10S 死亡时间 --- 4倍的hello时间 --- 40S RID --- 1,全网唯一;2,格式统一---- 格式要求和IP地址一样,由32位二进制构成,使用点分十进制…

JavaEE 初阶篇-深入了解网络原理 TCP/IP 协议

🔥博客主页: 【小扳_-CSDN博客】 ❤感谢大家点赞👍收藏⭐评论✍ 文章目录 1.0 TCP 协议概述 1.1 TCP 协议格式 2.0 TCP 协议的特性 2.1 确认应答 2.2 超时重传 2.2.1 超时的时间如何确定? 2.3 连接管理 2.3.1 三次握手 2.3.2 四次…

【C++】priority_queues(优先级队列)和反向迭代器适配器的实现

目录 一、 priority_queue1.priority_queue的介绍2.priority_queue的使用2.1、接口使用说明2.2、优先级队列的使用样例 3.priority_queue的底层实现3.1、库里面关于priority_queue的定义3.2、仿函数1.什么是仿函数?2.仿函数样例 3.3、实现优先级队列1. 1.0版本的实现…

DGC-GNN 配置运行

算法 DGC-GNN,这是一种全局到局部的图神经网络,用于提高图像中2D关键点与场景的稀疏3D点云的匹配精度。与依赖视觉描述符的方法相比,这种方法具有较低的内存需求,更好的隐私保护,并减少了对昂贵3D模型维护的需求。DGC-…