网络套件字(理论知识)

一、IP地址和目的IP地址

上次说到IP地址是为了是为了让信息正确的从原主机传送到目的主机,而原IP地址和目的IP地址就是用于标识两个主机的,既然叫做地址必然有着路径规划的作用,而路径规划最重要的就是,从哪来到哪去,现在在哪下一步去哪?

比如我要从山西北部骑行到江苏南京,那么我的源地址就是山西,目的地就是南京,第一步山西->河北:第二步河北->山东;第三步山东->江苏;

从上面我们看到的一个简单的路径规划,可以看到,出发地和目的地是不变的而当前位置和下一步的位置是一直在变化的,而IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址。

在数据进行传输之前,会先自顶向下贯穿网络协议栈完成数据的封装(每一层会根据对应的协议添加报头),其中在网络层封装的IP报头当中就涵盖了源IP地址和目的IP地址。而除了源IP地址和目的IP地址之外,还有源MAC地址和目的MAC地址的概念。

二、理解源MAC地址和目的MAC地址

2.1MAC地址

MAC地址(Media Access Control Address)是一个用于识别网络设备的唯一标识符。每个网络设备(如计算机、手机、路由器等)都有一个独特的MAC地址。MAC地址通常是由48位二进制数字组成,通常以十六进制表示。MAC地址由厂商在生产设备时分配,分为两部分:前24位是厂商标识符,后24位是设备标识符。MAC地址在数据链路层(OSI模型中的第二层)使用,用于在局域网中唯一标识设备。MAC地址的作用类似于身份证号码,用于在网络中确定设备的身份和位置。

 通常数据的传输是跨局域网的,数据在传输过程中会经过若干个路由器,

而在上篇博客中提到路由器是看作在TCP/IP五层(或四层)模型中的网络层。

而当数据在局域网中传输时,就需要使用到数据链路层,而在该层要使用的就是MAC地址。

2.2源MAC地址和目的MAC地址

当数据在局域网中传输时,数据帧会包含发送者和接收者的MAC地址。网络设备根据目标MAC地址来决定是否接收该数据帧,如果目标MAC地址与自身的MAC地址匹配,设备就会接收并处理该数据帧。

 上面提到的发送者和接收者的MAC地址其实就是源MAC地址和目的MAC地址。

源MAC地址和目的MAC地址是包含在链路层的报头当中的,而MAC地址实际只在当前局域网内有效,因此当数据跨网络到达另一个局域网时,其源MAC地址和目的MAC地址就需要发生变化,因此当数据达到路由器时,路由器会将该数据当中链路层的报头去掉,然后再重新封装一个报头,此时该数据的源MAC地址和目的MAC地址就发生了变化。

这样做就可以让局域网技术不同的局域网之间经行通信,就像上图一样即使局域网的技术不同(一个是以太网,一个是令牌环网)但是数据是在进入局域网的时候才会添加数据链路层的报头,如下图。

 

2.3数据传输的两套地址

  • 一套是源IP地址和目的IP地址,这两个地址在数据传输过程中基本是不会发生变化的(存在一些特殊情况,比如在数据传输过程中使用NET技术,其源IP地址会发生变化,但至少目的IP地址是不会变化的)。
  • 另一套就是源MAC地址和目的MAC地址,这两个地址是一直在发生变化的,因为在数据传输的过程中路由器不断在进行解包和重新封装。

三、端口号

知道了消息如何在两台不同的主机之间传递,那么当消息传递到另一台主机后,如何知道该消息是发送给主机上哪一个应用呢?

比如QQ之间进行通讯,,可以看作是两个不同主机之间进程之间的通讯,主机与主机之间通过ip地址不走错,而进程带有一个端口号,每个主机都有独一无二的IP而一台主机上的每个进程都有唯一的端口号。

端口号 (port) 是传输层协议的内容
  • 端口号是一个2字节16位的整数;
  • 端口号用来标识一个进程, 告诉操作系统, 当前的这个数据要交给哪一个进程来处理;
  • IP地址 + 端口号能够标识网络上的某一台主机的某一个进程;
  • 一个端口号只能被一个进程占用

既然提到了进程我们都知道进程pid是用于标识唯一进程的那么他们有什么关系呢?

虽然进程PID和端口号都是用于唯一标识某种资源(进程或网络服务),但它们之间并没有直接的关联。在实际的网络通信中,操作系统会维护一个端口号与进程之间的映射关系,使得特定端口号的数据能够被正确路由到相应的进程。通常,网络服务启动时会绑定到一个特定的端口号,并且在运行期间会监听该端口,从而等待传入的连接请求或数据包。

传输层协议(TCP和UDP)的数据段中有两个端口号, 分别叫做源端口号和目的端口号. 就是在描述 "数据是谁发的, 要发给谁";
综上 网络通信的本质就是进程间经行通信

四、浅谈UDP/TCP

在前面我们简单谈了在数据链路层(MAC)和传输层(IP)中十分重要的概念,通过这两层,我们已经能将数据从一台主机传输到另一台主机。但是数据的安全性无法保证,而数据;链路层就是用于为应用层提供可靠的、端到端的数据传输服务,隐藏了网络通信的细节,使得应用程序能够简单地进行数据交换而不需要关心底层网络的细节。传输层的核心协议包括TCP和UDP,它们提供了不同级别的服务,满足不同应用场景的需求。

3.1UDP

UDP(User Datagram Protocol)用户数据报协议是一种无连接的、不可靠的传输协议,属于网络通信协议簇的一部分。与TCP不同,UDP不提供可靠的数据传输和错误恢复机制,而是专注于在网络上传输数据包,提供简单的数据传输服务。

 以下是UDP的一些特点:

  1. 无连接性(Connectionless):UDP是一种无连接的协议,发送数据之前不需要建立连接,也不维护连接状态。

  2. 不可靠性(Unreliable):UDP不提供数据包的可靠传输,数据包可能会丢失、重复或顺序错乱。

  3. 轻量级(Lightweight):UDP的头部开销比TCP小,不需要维护连接状态,因此具有较低的延迟。

  4. 面向数据报(Datagram-Oriented):UDP以数据报为单位进行数据传输,每个数据报独立于其他数据报。

  5. 不提供拥塞控制(No Congestion Control):UDP不提供拥塞控制机制,数据包可能会因为网络拥塞而丢失。

注意 上面的不可靠性只是一个相对的概念并不是说他不可靠就一定数据会出错。

UDP常用于对实时性要求较高、数据量较小、传输延迟较低的应用场景,例如音频和视频流传输、DNS查询、实时游戏等。由于其简单和高效的特性,UDP在一些特定的网络应用中具有重要的作用。比如我们经常玩的王者荣耀和原神都是udp链接

3.2TCP

TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议,是互联网中最常用的协议之一。它提供了可靠的数据传输和错误恢复机制,用于在网络中进行端到端的数据传输。

 以下是TCP的一些主要特点:

  1. 面向连接(Connection-Oriented):在数据传输之前,TCP需要先建立连接,然后再进行数据传输,传输完成后再关闭连接。这种连接的建立和释放过程确保了数据的可靠传输。

  2. 可靠性(Reliability):TCP通过使用序号、确认和重传机制来确保数据的可靠传输。接收方会确认接收到的数据,并在需要时请求重传丢失的数据,从而保证数据的完整性和按序传输。

  3. 流量控制(Flow Control):TCP使用滑动窗口机制进行流量控制,确保发送方和接收方之间的数据传输速率匹配,防止数据发送过快导致接收方缓冲区溢出。

  4. 拥塞控制(Congestion Control):TCP使用拥塞窗口和拥塞避免机制来进行拥塞控制,防止网络拥塞导致的数据丢失和传输延迟增加。

  5. 面向字节流(Byte-Oriented):TCP是一种面向字节流的协议,它不保留消息的边界,而是将数据视为一连串的字节流进行传输。

  6. 全双工通信(Full Duplex Communication):TCP连接是全双工的,允许双方同时发送和接收数据。

TCP被广泛用于诸如网页浏览、文件传输、电子邮件和远程登录等应用中,它的可靠性和稳定性使得它成为互联网通信的重要基础。 

五、socket

在套接字编程中,常常将IP地址和端口号结合起来表示一个通信的端点,这种组合称为套接字地址。因此,可以说IP地址和端口号一起构成了一个套接字地址。然而,严格来说,套接字是操作系统中的一个抽象概念,用于表示网络通信的端点,而IP地址和端口号只是套接字地址的组成部分,用于确定通信的目的地或来源。因此,套接字通常是由IP地址、端口号和协议类型(如TCP或UDP)一起确定的.

5.1socket编程接口

在C语言中,使用套接字(socket)进行网络编程时,常见的编程接口包括:

 socket(): 创建一个套接字,返回套接字描述符。

int socket(int domain, int type, int protocol);
  • domain: 地址族,如 AF_INET(IPv4)或 AF_INET6(IPv6)。
  • type: 套接字类型,如 SOCK_STREAM(流套接字,TCP)或 SOCK_DGRAM(数据报套接字,UDP)。
  • protocol: 协议类型,通常为 0,表示由系统自动选择。

bind(): 将套接字与特定的IP地址和端口号绑定。

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  • sockfd: 套接字描述符。
  • addr: 指向要绑定的 sockaddr 结构体的指针。
  • addrlen: 地址结构体的大小。

listen(): 在服务器端开始监听连接请求。

int listen(int sockfd, int backlog);
  • sockfd: 套接字描述符。
  • backlog: 允许的连接等待队列的最大长度。

accept(): 接受客户端的连接请求,并创建一个新的套接字用于与客户端进行通信。

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
  • sockfd: 服务器套接字描述符。
  • addr: 用于存储客户端地址信息的 sockaddr 结构体。
  • addrlen: 指向存储客户端地址长度的变量的指针。

connect(): 连接到服务器。

int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

  • sockfd: 套接字描述符。
  • addr: 服务器地址的 sockaddr 结构体指针。
  • addrlen: 地址结构体的大小。

send() / recv(): 发送和接收数据。

ssize_t send(int sockfd, const void *buf, size_t len, int flags);
  • sockfd: 套接字描述符。
  • buf: 要发送的数据的缓冲区。
  • len: 要发送的数据的字节数。
  • flags: 发送标志,通常为 0
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
  • sockfd: 套接字描述符。
  • buf: 接收数据的缓冲区。
  • len: 缓冲区长度。
  • flags: 接收标志,通常为 0

sendto() / recvfrom(): 用于在无连接的套接字上发送和接收数据报

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
               const struct sockaddr *dest_addr, socklen_t addrlen);

  • sockfd: 套接字描述符。
  • buf: 要发送的数据的缓冲区。
  • len: 要发送的数据的字节数。
  • flags: 发送标志,通常为 0
  • dest_addr: 目标地址的 sockaddr 结构体指针,用于指定数据发送的目标地址。
  • addrlen: 目标地址结构体的大小。
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);
  • sockfd: 套接字描述符。
  • buf: 接收数据的缓冲区。
  • len: 缓冲区长度。
  • flags: 接收标志,通常为 0
  • src_addr: 用于存储发送方地址信息的 sockaddr 结构体指针。
  • addrlen: 指向存储发送方地址长度的变量的指针。

close(): 关闭套接字。

int close(int sockfd);

 sockfd: 要关闭的套接字描述符

5.2sockaddr结构

socket API 是一层抽象的网络编程接口 , 适用于各种底层网络协议 , IPv4 IPv6, 以及后面要讲的 UNIX Domain Socket. 然而 , 各种网络协议的地址格式并不相同,

套接字不仅支持跨网络的进程间通信(网络套接字),还支持本地的进程间通信(域间套接字)。在进行跨网络通信时我们需要传递的端口号和IP地址,而本地通信则不需要。网络的设计者想要把跨网络通信和本地通信进行大一统,因此套接字提供了sockaddr_in结构体和sockaddr_un结构体,其中sockaddr_in结构体是用于跨网络通信的(网络套接字),而sockaddr_un结构体是用于本地通信的(域间套接字)。
为了让套接字的网络通信和本地通信能够使用同一套函数接口,于是就出现了sockeaddr结构体,该结构体与sockaddr_in和sockaddr_un的结构都不相同,但这三个结构体头部的16个比特位都是一样的,这个字段叫做协议家族。

​ 

最上面那个是表示是那种套件字(.sin_family)然后是端口号(.sin_port)和IP地址(.sin_addr)

此时当我们在传递在传参时,就不用传入sockeaddr_in或sockeaddr_un这样的结构体,而统一传入sockeaddr这样的结构体。在设置参数时就可以通过设置协议家族这个字段,来表明我们是要进行网络通信还是本地通信,在这些API内部就可以提取sockeaddr结构头部的16位进行识别,如果前16为地址类型是AD_INET,就是网络间通信,如果地址类型是AD_UNIX,就是本地间通信。如上我们就通过通用sockaddr结构,将套接字网络通信和本地通信的参数类型进行了统一。

注意 

  • IPv4和IPv6的地址格式定义在netinet/in.h中,IPv4地址用sockaddr_in结构体表示,包括16位地址类型, 16 位端口号和32位IP地址.
  • IPv4、IPv6地址类型分别定义为常数AF_INET、AF_INET6. 这样,只要取得某种sockaddr结构体的首地址, 不需要知道具体是哪种类型的sockaddr结构体,就可以根据地址类型字段确定结构体中的内容.
  • socket API可以都用struct sockaddr *类型表示, 在使用的时候需要强制转化成sockaddr_in; 这样的好处是程序的通用性, 可以接收IPv4, IPv6, 以及UNIX Domain Socket各种类型的sockaddr结构体指针做为 参数; 

我们可以包含如下四个头文件查看或使用sockaddr、sockaddr_in、in_addr的相关信息:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

 sockaddr 结构

sockaddr_in 结构
虽然 socket api 的接口是 sockaddr, 但是我们真正在基于 IPv4 编程时 , 使用的数据结构是 sockaddr_in; 这个结构里主要有三部分信息: 地址类型 , 端口号 , IP 地址

 in_addr结构

 in_addr用来表示一个IPv4IP地址. 其实就是一个32位的整数。

在这个里面我们并没有看到sin_family这个部分,事实上这个就是第二个图片240那行那个在 sockaddr_in 结构体中,sin_family 是 __SOCKADDR_COMMON(sin_) 的一部分。这个设计是为了确保不同的套接字地址结构(例如,IPv4、IPv6等)在内部布局上是一致的,以便于通用的套接字地址处理。

##可以把位于它两边的符号合成一个符号。它允许宏定义从分离的文本片段创建标识符

注: 这样的连接必须产生一个合法的标识符。否则其结果就是未定义的。 所以上面直接被替换成sin_family  

 六、网络字节序

 我们都知道不同的计算机在内存存储中存在大小端问题

  • 大端模式: 数据的高字节内容保存在内存的低地址处,数据的低字节内容保存在内存的高地址处。
  • 小端模式: 数据的高字节内容保存在内存的高地址处,数据的低字节内容保存在内存的低地址处。

磁盘文件中的多字节数据相对于文件中的偏 移地址也有大端小端之分, 网络数据流同样有大端小端之分. 那么如何定义网络数据流的地址呢?

  • 发送主机通常将发送缓冲区中的数据按内存地址从低到高的顺序发出;
  • 接收主机把从网络上接到的字节依次保存在接收缓冲区中,也是按内存地址从低到高的顺序保存;
  • 因此,网络数据流的地址应这样规定:先发出的数据是低地址,后发出的数据是高地址.
  • TCP/IP协议规定,网络数据流应采用大端字节序,即低地址高字节.
  • 不管这台主机是大端机还是小端机, 都会按照这个TCP/IP规定的网络字节序来发送/接收数据;
  • 如果当前发送主机是小端, 就需要先将数据转成大端; 否则就忽略, 直接发送即可;

 

为使网络程序具有可移植性 , 使同样的 C 代码在大端和小端计算机上编译后都能正常运行 , 可以调用以下库函数做网络字节序和主机字节序的转换。

 

  • 这些函数名很好记,h表示host,n表示network,l表示32位长整数,s表示16位短整数。
  • 例如htonl表示将32位的长整数从主机字节序转换为网络字节序,例如将IP地址转换后准备发送。
  • 如果主机是小端字节序,这些函数将参数做相应的大小端转换然后返回 ;
  • 如果主机是大端字节序,这些 函数不做转换,将参数原封不动地返回

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

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

相关文章

计算机毕业设计 | SSM超市进销存管理系统(附源码)

1&#xff0c;绪论 1.1 开发背景 世界上第一个购物中心诞生于美国纽约&#xff0c;外国人迈克尔库伦开设了第一家合作商店&#xff0c;为了更好地吸引大量客流量&#xff0c;迈克尔库伦精心设计了低价策略&#xff0c;通过大量进货把商品价格压低&#xff0c;通过商店一次性集…

论文封面下划线总是对不齐,这3步你肯定没做!

论文封面 在写论文时&#xff0c;总会遇到论文封面下划线对不齐&#xff0c;学会下面这三招轻松搞定封面。 解决方法 ①选中文字&#xff0c;点击“插入”&#xff0c;选择“表格”&#xff0c;找到“文本转化为表格”。列数为2&#xff0c;文字分割位置选空格&#xff0c;设置…

路由器如何映射端口映射?

在现代互联网中&#xff0c;随着网络应用的不断发展&#xff0c;很多用户需要进行远程访问或搭建服务器来满足自己的需求。由于网络安全的原因&#xff0c;直接将内网设备暴露在公网中是非常危险的。为了解决这个问题&#xff0c;路由器映射端口映射技术应运而生。本文将介绍什…

Python进阶--爬取美女图片壁纸(基于回车桌面网的爬虫程序)

目录 一、前言 二、爬取下载美女图片 1、抓包分析 a、分析页面 b、明确需求 c、抓包搜寻 d、总结特点 2、编写爬虫代码 a、获取图片页网页源代码 b、提取所有图片的链接和标题 c、下载并保存这组图片 d、 爬取目录页的各种类型美女图片的链接 e、实现翻页 三、各…

HACKTHEBOX通关笔记——mango(退役)

信息收集 端口扫描 ┌──(root㉿kali)-[~] └─# nmap -sC -sV -A -p- --min-rate10000 10.129.229.185 Starting Nmap 7.94SVN ( https://nmap.org ) at 2024-01-31 20:44 EST Warning: 10.129.229.185 giving up on port because retransmission cap hit (10). Nmap scan …

秘塔科技推出AI搜索产品「秘塔AI搜索」

近日&#xff0c;国内一家人工智能科技公司&#xff08;秘塔科技&#xff09;推出了一款AI搜索产品——秘塔AI搜索&#xff0c;能够大幅提升搜索效率&#xff0c;解决日常生活、工作学习等场景中遇到的各类搜索需求。 秘塔AI搜索官网&#xff1a;https://metaso.cn/ 相较于传统…

《小狗钱钱2》读书笔记

目录 前言 作者简介 经典语句摘录 前言 尽管[ 智慧是无法传授的], 但读书可以启发思路&#xff0c;开拓解题方法。 《小狗钱钱2》这本书是在《小狗钱钱》的基础上&#xff0c;作业进一步阐述了关于人生出生的智慧。 当然了&#xff0c;这本书感觉更适合成年人来看&#xff0…

【集合系列】Map 双列集合

Map双列集合 1. 概述2. 方法3. 代码示例4. 输出结果5. 注意事项 实现类&#xff1a; HashTable、HashMap、TreeMap、Properties、LinkedHashMap 其他集合类 具体信息请查看 API 帮助文档 1. 概述 Map是Java中的一种数据结构&#xff0c;用于存储键值对&#xff08;key-value p…

LayUI中表格树折叠 --

1、先将插件源码进行下载&#xff0c;新建 tableTree.js 文件&#xff0c;将源码放进去 2、将 tableTree.js 文件 配置之后&#xff0c;在需要使用的页面进行引入&#xff1a; layui.define(["tableTree"],function (exports) {var tableTree layui.tableTree;// …

JavaScript相关(四)——事件循环

参考&#xff1a; 极客时间-消息队列和事件循环 js中的宏任务与微任务 javascript是单线程的原因是什么 JS是单线程语言&#xff0c;在浏览器执行渲染进程时&#xff0c;会遇到很多不同的事件类型&#xff0c;比如操作DOM节点、计算样式布局、执行JS任务、用户输入等&#xff…

Transformer实战-系列教程13:DETR 算法解读

&#x1f6a9;&#x1f6a9;&#x1f6a9;Transformer实战-系列教程总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 点我下载源码 1、物体检测 说到目标检测你能想到什么 faster-rcnn系列&#xff0c;开山之作&…

【Spring Boot】第二篇 自动装配原来就这么简单

导航 一. 什么是自动装配?二. 如何实现自动装配?1. 配置清单在哪里?2. 自动装配实现核心点1: 从META‐INF/spring.factories路径读取配置类清单核心点2: 过滤第一次过滤: 根据EnableAutoConfiguration注解中exclude和excludeName属性第二次过滤: 通过AutoConfigurationImpor…

【学网攻】 第(23)节 -- PPP协议

系列文章目录 目录 系列文章目录 文章目录 前言 一、PPP协议是什么&#xff1f; 二、实验 1.引入 实验目的 实验背景你是某公司的网络管理员&#xff0c;现在需要与另一个公司进行通信,需要你配置PPP协议保证双方发送的人是真正的而非黑客 技术原理 实验步骤新建Pack…

Backtrader 文档学习- Plotting - Plotting Date Ranges

Backtrader 文档学习- Plotting - Plotting Date Ranges 1.概述 1.9.31.x版本增加了绘制部分图形的功能。 可以使用策略实例中保留完整长度的时间戳数组的索引或者使用实际的datetime.date 或datetime.datetime 实例来限制需要绘制的内容。 仍然可以使用标准的cerebro.plot…

自然语言学习nlp 六

https://www.bilibili.com/video/BV1UG411p7zv?p118 Delta Tuning&#xff0c;尤其是在自然语言处理&#xff08;NLP&#xff09;和机器学习领域中&#xff0c;通常指的是对预训练模型进行微调的一种策略。这种策略不是直接更新整个预训练模型的权重&#xff0c;而是仅针对模型…

YOLOv8改进 更换轻量级网络结构

一、GhostNet论文 论文地址:1911.11907.pdf (arxiv.org) 二、 GhostNet结构 GhostNet是一种高效的目标检测网络,具有较低的计算复杂度和较高的准确性。该网络采用了轻量级的架构,可以在计算资源有限的设备上运行,并能够快速地实时检测图像中的目标物体。 GhostNet基于Mo…

【大模型上下文长度扩展】RoFormer:一种结合了旋转位置编码(RoPE)的Transformer模型

RoFormer&#xff1a;一种结合了旋转位置编码&#xff08;RoPE&#xff09;的Transformer模型 提出背景旋转位置编码&#xff08;RoPE&#xff09;旋转矩阵子问题1: 位置信息编码的需求子问题2: 序列长度的灵活性子问题3: 线性自注意力与相对位置编码的整合 RoPE的创新性绝对位…

CRNN介绍:用于识别图中文本的深度学习模型

CRNN&#xff1a;用于识别图中文本的深度学习模型 CRNN介绍&#xff1a;用于识别图中文本的深度学习模型CRNN的结构组成部分工作原理 CRNN结构分析卷积层&#xff08;Convolutional Layers&#xff09;递归层&#xff08;Recurrent Layers&#xff09;转录层&#xff08;Transc…

恒创科技:怎么看云主机的性价比

随着云计算技术的不断发展&#xff0c;云主机已经成为越来越多企业和个人用户的首选计算资源。然而&#xff0c;在选择云主机时&#xff0c;性价比是一个非常重要的考虑因素。那么&#xff0c;怎么看云主机的性价比呢&#xff1f; 通常来说&#xff0c;云主机的成本主要包括硬…

相机图像质量研究(10)常见问题总结:光学结构对成像的影响--光圈

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…