Linux学习记录——이십팔 网络基础(1)
文章目录
- 1、了解
- 2、网络协议栈
- 3、TCP/IP模型
- 4、网络传输
- 1、同一局域网(子网)
- 2、局域网通信原理
- 3、跨一个路由器的两个子网
- 4、其它
详细的网络发展历史就不写了
1、了解
为什么会出现网络?一开始多个计算机之间想要共享文件,就得一点点存起来,然后给另一个计算机读取,久而久之,这样就是个麻烦事,所以出现了网络,将几台机器都处于一个网络环境下,就可以更好地通信了。当这个范围不断扩大,越来越大的区域都可以用网络了,之后网络开始往民间发展,各个地区之间,各个国家之间也就都能通过网络联系了。
几台机器通过网络形成通信,这也就组成了一个局域网,两个局域网通过交换机,路由器等相互连接,就形成了一个广域网,也可以说成一个更大的局域网。网络能连接如此多的个体,必然要有规则来约束其沟通,也就出现了协议。网络间的协议为什么存在?这就像两个人之间形成某种约定一样,本质上是为了更高效地沟通效率。一个协议通常由行业中的顶级组织来决定,提出规则后,并不一定要由提出者来完成整个协议的实现,而是由行业内顶级的团队来做。
如果要发信息到欧洲,传输距离变得很长,只有两台机器之间发送是很难保证成功的,所以会通过很多中间机器来传输信息,这也就保证信息的不丢失,但即使这样,如何保证就一定能不丢失,并且还能准确地发送到对应的主机上呢?这个问题之后会写。出现上述事实的原因就是传输距离变长了,所以问题是有前后上下关系的,所以在设计网络功能时,不同的功能设计成不同的模块,这就是低耦合;有了问题,就有了需求,就需要解决,网络通信还有很多不同性质的问题,要高效地解决它们,需要把相关的问题放在一起,做出解决方案,不相关的不要放在一起,这就是高内聚。通过高内聚,低耦合,可以设计出很多模块,这些模块被设计成层状结构,体现了前后关系。
传输距离的变长,衍生出新的问题,需要制定网络协议来约束信息的传输
协议被设计成层状结构,各种问题按照高内聚,低耦合的方式组织成层状结构,方便维护代码和方案的设计
分层设计,这种设计在学习C++时学到过,就是继承体系,一个基类可以有多个派生类,用基类指针指向不同派生类对象,就可以使用对应派生类对象的方法,在外部看来,只有基类,但内部却有很多派生类,这就是一切皆基类;C语言库中,用FILE结构体来封装了各种文件的系统接口,用户只需要使用FILE就可以调用系统接口,通过这个结构体来屏蔽了各种接口之间的差异,这也是种分层思想;每个进程都有虚拟地址空间,它们以同样的视角来看待自己要使用的空间,地址空间里屏蔽了硬盘,内存等硬件,而是通过页表,地址空间来访问它们,这也是分层结构,硬件在下面,地址空间在上面,进程在更上面;所以分层可以屏蔽软件,也可以屏蔽硬件,任何计算机问题都可以添加软件层来解决。
协议分层有什么好处?层与层之间通过接口进行交互,比如打电话,人和人之间属于一层,通信设备属于一层,还有电话的协议,语言等层,拨电话就像是给电话传参,通信时就是使用设备来输入输出。上层不关心下层的实现,任何一层出现问题,都不会直接影响另一层,减少后期开发者的维护成本,各层解决各层的功能,就是高内聚,不同层只通过接口交互,没有其它操作,就是低耦合。
分层有好处,但也可以不分层。分层是一种选择。
2、网络协议栈
OSI定义了网络协议层,这是一个七层结构。从低到高,物理层,数据链路层,网络层,传输层,会话层,表示层,应用层。这个协议层是很完美的一个设计,不过实际应用中,因为很多细节不能在OSI的这个模型中实现出来,它的很多模块功能不能由网络协议层来实现,它的协议层不是全由操作系统来实现,会话、表示、应用没有实现,这三层会被压缩成应用层,因为会话表示应用要自己实现出来,而在我们使用中,不考虑物理层,所以总体就是四层。我们实际使用的就是TCP/IP五层模型,包括应用层,传输层,网络层,链路层,物理层。
OSI定制了标准,但不是OSI实现出来的。
像TCP/IP五层模型,OSI七层模型就是协议栈。
对于计算机来说,它也有分层,最下面是硬件层,往上走,驱动层,系统层,系统层里的最上方有系统调用层,应用层/用户层。使用计算机的时候就是在通过操作系统给的系统调用来操作硬件,网络也是一样,它也有系统给到它的系统调用,用户通过系统调用来操作网络。
网络的分层和计算机分层相对应,物理层对物理层,比如有网卡硬件,链路层对驱动层,网络层和传输层对系统层,应用层对用户层。传输层和网络层属于操作系统,网络的应用层对应计算机的用户层,由用户来实现,用户也包括开发人员,程序员这些,传输层最具有代表性的是TCP协议,网络层最具有代表性的是IP协议。系统层里的系统调用层有网络的系统调用,还有很多其他东西的系统调用。网络本质就是系统的一部分,网络的核心部分属于操作系统,所以网络协议栈会被叫做TCP/IP协议栈,取核心来起名的。对于系统来说,一切皆文件,网卡也是文件,而协议栈就属于文件系统的一部分,系统也会用管理文件的方式来管理他们,所以很多网络接口,和文件也有关系。操作系统的种类非常多,但网络只有一种,不管系统如何,网络协议栈的实现都一样。
3、TCP/IP模型
TCP/IP是一组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇。
数据链路层是负责传送数据帧和检查的,物理层发出来的信息,要通过数据链路层来识别出来,才可以被使用。链路层有很多局域网通信标准,比如以太网,无线LAN,但网络不是只有一种吗?链路层的标准不只有一个,链路层的实现是在网卡驱动内部实现的,所以链路层会有不同的标准,而网络只有一种指的是操作系统层的,那里只有TCP/IP,但链路层可以有不同,由驱动程序内部实现,但这些标准也遵守TCP/IP协议。
网络层就有IP地址,win + R,输入cmd,然后输入ipconfig就可以查看到自己电脑的IP地址,无线局域网中IPv4地址。而Linux中,输入命令ifconfig,在第二行inet后面的地址是云服务器的内网地址/私有IP。网络层可以指定某一个主机。路由器工作在网络层。
网络层让主机之间有能力传送过去数据,但不一定做得到,而传输层就是保证传输成功的。
应用层解决数据如何使用的问题,也就诞生了很多软件。
工作在哪一层,就一定拥有下面的所有层,通常不会使用在上面的层,比如路由器不会使用传输层,不过现在的硬件来讲,很多都集成了上层的东西,比如有的路由器也有应用层的方法。
4、网络传输
1、同一局域网(子网)
同一局域网的两台机器,可以直接通信。两个主机通信的本质,是两个主机的OS与网络协议栈在通信。
每一层都有自己的协议,协议的表现形式是协议报头,也就是每一层都有自己的协议报头,这个报头相当于一个说明书。聊天发送信息,信息在应用层,信息前加上应用层的报头,传给传输层,应用层报头+信息整体,再加上传输层报头,传给网络层,直到最后的物理层,信息前面就有四个报头。根据冯诺依曼体系,用户发送的信息会先给硬件,然后由硬件,再交给收信息的人的链路层,网络层,一层层向上传,每一层都识别自己的报头。每一层都把上一层交付给自己的数据当作自己的有效载荷,当前层给有效载荷添加报头就是在做封装。而且可以发现,发送者和接收者的每一层得到的数据都是一样的,所以在逻辑上,同层协议都认为自己在和对方的同层协议在通信。并且同层协议都能够互相认识对方的报头,就能够将报头和有效载荷分离,将有效载荷交付给上层的哪一个具体协议。==每一层的协议都得能分离报头和有效载荷以及交付给上层有效载荷。==有效载荷交付给上层的功能叫做数据报分用;用户发的信息,通过每一层加报头传给硬件,这是封装;硬件逐一给到上面的层,每一层都会解包,以及数据分用,就会成功发出信息。这也就是数据如何在两台主机之间流通。
2、局域网通信原理
数据在主机中的运作已经了解了,那么在局域网中,还没到主机前数据是如何被运作的?
发送的信息每一个主机都会接收,然后封装交给自己的网卡,网卡会去解包,如果发现不是和自己有关的数据,就会丢弃,是自己的就继续传给上一层。不过网卡可以设置成混杂模式,这个模式什么数据都接收,都向上传,这也就是抓包工作的做法。
任何时刻,局域网中只允许一个人向局域网中发送消息,如果有很多人发,就有可能导致数据碰撞问题,比如很多人都去一个网站抢考试位置,这个网站就有可能崩掉。但局域网是怎么让很多人发信息的?不是只让一个人吗?这个问题后续再写。
任何人要通信,需要有唯一的一个标识符,比如自己的名字。机器也是一样,每台计算机都有网卡,网卡在出厂时就在网卡内部写入了网卡的sn号,也就是MAC地址,这个号是全球唯一的标识符。
3、跨一个路由器的两个子网
首先认识路由器。路由器有3层功能,第一层是网络层,第二层是链路层,第三层是物理层。路由器也是一台主机(节点),路由器至少连接两个子网,至少有两个网络接口。
以太网和令牌环是局域网通信的两个标准,对应着不同的链路层实现方案,链路层处于驱动程序中,也就是两者的驱动就不一样。路由器有两个子网,一个连接以太网,一个连接令牌环。
用户发送信息后,添加报头,一直传到最下面一层,但以太网,令牌环都不是只有路由器这一个主机,它们可能还有其它主机,那么为什么就可以指定给到路由器?每一个主机都会被标识,通过主机的IP地址来标识,也就是IPv4地址,这是一个4字节的整数,我们电脑上的IP地址是从0.0.0.0到255.255.255.255的,每个位置能表示0~255(2^8),总共8个比特位,总共32个比特位,4个字节。这种字符串风格的点分十进制方案的地址是给人看的,但机器不认它,机器要把它转成4字节,每一个字节8个比特位,就能取出这个字符串IP地址。网络协议栈的核心TCP/IP协议是在网络层和传输层,这两个层在操作系统中,所以TCP/IP是内核中的,内核是C语言实现的,TCP/IP也是C语言实现的。这个转换是用位段来实现的。
struct ip
{int patr1: 8;int part2: 8;int part3: 8;int part4: 8;
}int srcIp = xxx;
struct ip *p = (struct ip*)&srcIp;
p->part1;//这样就能找到每一部分的数字
p->part2;
...
IP地址能够唯一标识公网环境下的主机。网络层有一个路由表,也就是IP协议所在的那一层。用户在发消息时,也会被加上要发给谁的信息,传到了网络层时,会根据接收者IP地址和路由表来判断发给谁。发送者只知道自己在哪个网络中以及接收者的IP地址,路由表也不知道发给谁,但它知道数据不是发给自己所在网络的其他主机的,比如它知道不是发给以太网中其他主机的。数据到了网络层,网络层会添加一个目的报头,是接收者的IP地址,然后给到路由器,路由器通过路由表知道了要发给谁,路由器再把这些信息给自己的链路层,链路层会添加一个目的报头,是接收者的MAC地址,到了这里这个数据就有了目的地的IP和MAC地址。
目的IP地址是为报文定制的最终目标,根据该地址来进行路径选择,目的MAC地址会变化,根据路径选择的结果,来选择下一个主机。不只有两个子网,可能要跨多个子网才能找到接收信息的一方。
当在以太网的某个主机发的信息,来到路由器,又往下传,来到以太网,以太网的所有主机都收到了这个信息,但只有路由器发现这是属于它的信息,所以其他主机抛弃掉,让路由器来处理。报头中发送者的主机的网卡的MAC地址,把这个分离后,来到网络层,路由器查看信息的目的IP地址,查看路由表,知道要选择哪条路径,比如如果就是发给令牌环网某个主机的,那么路由器就会往下传给自己的链路层,加上接收者主机的令牌环网的MAC地址,向下传给令牌环网,令牌环网的所有主机都收到后,发现这个MAC地址不是自己就弃掉,只有一个主机接收了这个地址,交给链路层,去掉MAC地址报头,交给网络层,网络层查看目的IP地址发现是自己的信息,然后就分离IP地址,逐渐上传,最终给到接收者。这个过程中,同层的都认为是和对方同层的在交流,只是链路层的信息不一样。
IP协议往上,也就是网络层往上,是没有信息变化的,发什么收什么,差别发生在链路层。IP地址屏蔽了底层子网机制的差异,这是路由器+IP地址共同作用的结果。正是因为如此,IP地址是全球网络的底层基础。所以任何一个软硬件问题,都可以通过添加一层软件层来解决,比如网络里,这个软件层就是IP地址所在的网络层。
4、其它
发送的数据包,在传输层叫做数据段,在网络层叫做数据报,在链路层叫做数据帧。每一层的信息交给每一层来处理,就是分用。
Linux中用ifconfig命令
第一个inet后面的地址是内网的IP地址,不是公网的。ether则是基于以太网的MAC地址,它有48位,每一位都用16进制表示,用冒号分隔。
结束。
相关文章:
Linux学习记录——이십팔 网络基础(1)
文章目录 1、了解2、网络协议栈3、TCP/IP模型4、网络传输1、同一局域网(子网)2、局域网通信原理3、跨一个路由器的两个子网4、其它 详细的网络发展历史就不写了 1、了解 为什么会出现网络?一开始多个计算机之间想要共享文件,就得…...
CSS动效合集之实现气泡发散动画
前言 👏CSS动效合集之实现气泡发散动画,速速来Get吧~ 🥇文末分享源代码。记得点赞关注收藏! 1.实现效果 2.实现步骤 定义一个数组bubbles,用来存储气泡列表的基本新,w表示宽高,x表示绝对定位…...
六、串口通信
六、串口通信 串口接口介绍使用串口向电脑发送数据电脑发送数据控制LED灯 串口接口介绍 SBUF是串口数据缓存器,物理上是两个独立的寄存器,但占用相同的地址。写操作时,写入的是发送寄存器;读操作时,读出的是接收寄存器…...
如何将 JavaScript Excel XLSX 查看器添加到Web应用程序
在 JavaScript 中创建 Excel 查看器可能是一项艰巨的任务,但使用 SpreadJS JavaScript 电子表格,创建过程要简单得多。在本教程博客中,我们将向您展示如何使用 SpreadJS 的强大功能来创建一个查看器,该查看器允许您在 Web 浏览器中…...
网安周报|CISA发布增强开源安全性的计划
1、CISA发布增强开源安全性的计划 美国一家领先的安全机构发布了一项期待已久的计划,详细说明了它将如何增强联邦政府和整个生态系统的开源安全性。美国网络安全和基础设施安全局(CISA)开源软件安全路线图在安全开源峰会上发布。据估计&#…...
使用 Docker 安装 Elasticsearch (本地环境 M1 Mac)
Elasticsearchkibana下载安装 docker pull elasticsearch:7.16.2docker run --name es -d -e ES_JAVA_OPTS“-Xms512m -Xmx512m” -e “discovery.typesingle-node” -p 9200:9200 -p 9300:9300 elasticsearch:7.16.2docker pull kibana:7.16.2docker run --name kibana -e EL…...
Visual Studio中MD与MT的区别及运行库类型选择
MT与MD的区别 /MT:是multithread-static version,是多线程静态版本的意思,项目会使用运行时库的多线程静态版本,编译器会将LIBCMT.lib放入.obj文件中,以便链接器使用LIBCMT.lib解析外部符号;/MTdÿ…...
Vue3函数式编程
文章目录 前言一、三种编程风格1.template2.jsx/tsx3.函数式编写风格 二、函数式编程1.使用场景2.参数3.例子3.render渲染函数 总结 前言 本文主要记录vue3中的函数式编程以及其他编程风格的简介 一、三种编程风格 1.template Vue 使用一种基于 HTML 的模板语法,…...
【逗老师的无线电】艾德克斯TTL串口转网口
最近手搓了一个可以用于艾德克斯ITECH电源或者电子负载的TTL串口转网口的模块,用上之后,上位机软件就可以配置以太网IP连接设备啦。就像这样。 一、ITECH TTL接口定义 二、整体逻辑 嗯,就这么简单。IT9000控制软件的Ethernet功能就是直接S…...
如何修改jupyter notebook默认打开路径
1、用jupyter notebook在其他位置打开自己的ipython项目: jupyter notebook是一个很好用的工具,可以保存运行结果,还可以给项目添加很多可视化操作与介绍文字。安装anaconda后,jupyter notebook就会自动安装,点开它会…...
【leetcode】数组排序
【leetcode】数组排序 task03 主要了解了数组中常见的排序方法: 1.常见数组排序方法 冒泡排序(Bubble Sort): 冒泡排序是一种简单的排序算法,它多次遍历数组,比较相邻的元素并交换它们,直到整…...
【C刷题训练营】第四讲(打好基础很重要)
前言: 大家好,这是c语言刷题训练营的第四讲,打好基础便于对c语言语法与算法思维的提高,感谢你的来访与支持! 💥🎈个人主页:Dream_Chaser~ 🎈💥 ✨✨刷题专栏…...
MySQL 某个字段存储不了内容
1. 原因 某个字段存储的内容过大 2. 解决 修改max_allowed_packet参数 max_allowed_packet参数是指mysql服务器端在一次传送数据包的过程当中最大允许的数据包大小。如果超过了设置的最大长度,则会数据库保持数据失败。 2.1 查询参数 show variables like %max…...
7.代理模式
1.UML 2.代码 #include <iostream> using namespace std;class Subject{ public:virtual void Request() 0; };class RealSubject:public Subject { public:virtual void Request(){cout << "RealSubject" << endl;} }; class Proxy:public Subj…...
单例模式的安全写法
要想知道怎么写单例模式,那么必须得知道什么是单例模式。单例模式是一种设计模式,它确保某个类只有一个实例,并且提供一个全局访问该实例的方法。单例模式不会创建实例副本,而是返回对已创建实例的引用。单例模式的创建可以分为两…...
牛客网SQL156
各个视频的平均完播率_牛客题霸_牛客网 方法一 select a.video_id,format(count(b.video_id)/count(a.video_id),3) 完播率 from (select uid,video_id,(end_time-start_time) 播放时长from tb_user_video_logwhere year(start_time)2021 or year(end_time)2021 ) a left joi…...
【MongoDB】docker部署社区版(一)
0、背景介绍 项目中使用MongoDB了,服务器挂掉,自己在本地搭一个试试。 1、版本选择 首先有社区版和和商业版。我选的是社区版。链接:https://hub.docker.com/r/mongodb/mongodb-community-server/tags 1.1、标签选择 看到标签有两个大类…...
【Graph Net学习】GNN/GCN代码实战
一、简介 GNN(Graph Neural Network)和GCN(Graph Convolutional Network)都是基于图结构的神经网络模型。本文目标就是打代码基础,未用PyG,来扒一扒Graph Net两个基础算法的原理。直接上代码。 二、代码 …...
RocketMQ 发送顺序消息
文章目录 顺序消息应用场景消息组(MessageGroup)顺序性生产的顺序性MQ 存储的顺序性消费的顺序性 rocketmq-client-java 示例(gRPC 协议)1. 创建 FIFO 主题生产者代码消费者代码解决办法解决后执行结果 rocketmq-client 示例&…...
【面试经典150 | 双指针】判断子序列
文章目录 写在前面Tag题目来源题目解题解题思路方法一:双指针方法二:动态规划 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法,两到三天更新一篇文章,欢迎催更…… 专栏内容以分析题目为主,并附带一些对…...
自动驾驶信息安全方案
目录 1. 修订历史... 3 2. 概述... 4 2.1 目的... 4 2.2 适用范围... 4 2.3 参考文档... 4 2.4 术语和缩写... 4 3. 安全分析... 5 4. 总体设计... 6 4.1 ACU的安全防护... 7 4.1.1 系统安全引导... 7 4.1.2 密钥安全存储... 8 4.1.3 应…...
【云原生】kubernetes中pod(最小的资源管理组件)
目录 前言 一、pod 1.1pause容器使得Pod中的所有容器可以共享两种资源: 1.2 通常把Pod分为两类 1.2.1自主式Pod 1.2.2控制器管理的Pod 1.3 Pod 容器的分类 1.3.1基础容器(infrastructure container) 1.3.2初始化容器(initc…...
[DB]数据库--lowdb
[DB]数据库--lowdb lowdb基本应用获取数据数据变更写入文件 lodash的使用获取数据lodash方法使用数据变更写入文件 lowdb lowdb ,是一个基于文件存储的非关系型数据库 基于loadsh的轻量级数据库 可用于在json中存储数据,大小一般为0~200M的json文件 方便简单的数…...
Kotlin | 在for、forEach循环中正确的使用break、continue
文章目录 for循环中使用break、continueLabel标签forEach中如何退出循环资料 Kotlin 有三种结构化跳转表达式: return:默认从最直接包围它的函数或者匿名函数返回。break:终止最直接包围它的循环。continue:继续下一次最直接包围…...
【C++】详解std::mutex
2023年9月11日,周一中午开始 2023年9月11日,周一晚上23:25写完 目录 概述头文件std::mutex类的成员类型方法没有std::mutex会产生什么问题问题一:数据竞争问题二:不一致lock和unlock死锁 概述 std::mutex是C标准库中…...
Matlab图像处理-Lab模型
Lab模型 Lab模型是由CIE(国际照明委员会)制定的一种彩色模型。该模型与设备无关,弥补了RGB模型和CMYK模型必须依赖于设备颜色特性的不足; 另外,自然界中的任何颜色都可以在Lab空间中表现出来,也就是说RGB和…...
分布式ETL工具Sqoop实践
Mysql数据准备 1、在node02节点登录Mysql。 mysql -uroot -proot2、新建数据库testdb。 create database testdb;3、新建数据表ts。 use testdb; create table ts(id int, name varchar(10), age int, sex char(1));4、向表中插入数据。 insert into ts values(10001,张三…...
展会预告 | 图扑邀您共聚 IOTE 国际物联网展·深圳站
参展时间:9 月 20 日- 22 日 图扑展位:9 号馆 9B 35-1 参展地址:深圳国际会展中心(宝安新馆) IOTE 2023 第二十届国际物联网展深圳站,将于 9 月 20 日- 22 日在深圳国际会展中心(宝安…...
如何下载安装 WampServer 并结合 cpolar 内网穿透,轻松实现对本地服务的公网访问
文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境,是一组常用来…...
iOS添加Mapbox地图库
配置凭据 注册并导航到Account页面。你将需要: 公共访问令牌: 从帐户的tokens页面,你可以复制默认的公共令牌或单击"create a token"按钮来创建新的公共令牌。 带有Downloads:Read范围的秘密访问令牌: 从你帐户的t…...
充值网站制作/最新中高风险地区名单
转载请注明出处:http://blog.csdn.net/u011733020前言:在Android开发中,对于图片的加载可以说是个老生常谈的问题了,图片加载是一个比较坑的地方,处理不好,会有各种奇怪的问题,比如 加载导致界面…...
仙居谁认识做网站的/重庆网站建设与制作
mysql 误删,误更新数据恢复 脚本,基于row格式binlog恢复时需要指定-s columnsize(字段行数) -t update/delete(恢复类型)update语句需要手动更新colunmlist的值(字段列表)python脚本如下:#!/usr/bin/python#codingutf-8#Author:ea…...
网页传奇版本/潍坊seo关键词排名
下一代安全企业Palo Alto Networks(纽交所代码:PANW)近日详细披露了一款最新“BackStab”恶意软件,该攻击模式主要是从存储在被感染电脑上的移动设备备份文件中窃取私人信息。Palo Alto Networks公司Unit 42威胁情报团队在白皮书中…...
网页设计页面设计/宁波seo推广外包公司
传送门: 设 dp[i][j]为第一个号i等级,第二个号j等级的期望值 a[i]存每个等级上分的概率 dp[i][j]a[i]*dp[i1][j](1-a[i])*dp[j][i]1 dp[j][i]a[j]*dp[j1][i](1-a[j])*dp[i][j]1 这个鬼东西改变上面值会影响下面值,所以要化简 联立得: dp[i][j…...
海勃湾网站建设/市场调研报告1000字
配置是如何进行的每个GNU发布版本都应该还有一个名为configure的shell脚本。你需要把你希望在那种机器和系统上编译程序作为参数告诉这个脚本。脚本configure必须记录配置信息以便它们可以影响编译工作。这样做的一种方式是把一个诸如config.h的标准名字和为选定的系统匹配的正…...
网站制作的收费/优化seo教程技术
操作PDF文档时,打印是常见的需求之一。针对不同的打印需求,可分多种情况来进行,如设置静默打印、指定打印页码范围和打印纸张大小、双面打印、黑白打印等等。经过测试,下面将对常见的几种PDF打印需求做一些归纳总结,这…...