【2024最新精简版】网络_Linux操作系统面试篇

在这里插入图片描述


更多相关内容可查看

简述 tcp 和 udp的区别?

  1. 连接性:TCP是面向连接的协议,通信双方在数据传输前要先建立连接,然后再传输数据,确保数据的可靠性和顺序性。而UDP是无连接的协议,通信双方直接发送数据包,不需要建立连接,因此传输速度更快,但不保证数据的可靠性和顺序性。
  2. 可靠性:TCP保证数据的可靠传输,会通过序列号、确认应答、重传等机制来确保数据不丢失、不重复、按顺序到达。UDP不保证数据的可靠传输,数据包可能会丢失或者乱序。
  3. 传输方式:TCP是面向字节流的传输方式,数据在传输时会被拆分成以字节为单位的数据包进行传输,保证数据的完整性。UDP是面向数据包的传输方式,每个数据包都是独立的,没有顺序要求。
  4. 适用场景:TCP适用于对数据完整性要求较高的场景,如文件传输、网页浏览等。UDP适用于对实时性要求较高、可以容忍少量数据丢失的场景,如音视频传输、在线游戏等

get 和 post 请求有哪些区别?

• GET请求只能进⾏url编码,⽽POST⽀持多种编码⽅式。
• 对参数的数据类型,GET只接受ASCII字符,⽽POST没有限制。

  1. 数据传输方式:
    • GET:通过URL的查询字符串传输数据,数据会附加在URL的末尾,以键值对的形式出现,例如http://example.com/page?name=value。
    • POST:通过请求体传输数据,数据不会显示在URL中,而是作为请求的一部分发送给服务器。
  2. 安全性:
    • GET:数据以明文形式出现在URL中,因此不适合传输敏感信息,如密码等。
    • POST:数据被包含在请求体中,不会显示在URL中,相对于GET更安全,适合传输敏感信息。
  3. 数据长度限制:
    • GET:由于数据是附加在URL中的,URL的长度有限制,因此GET请求传输的数据量较小,一般限制在几千个字符以内。
    • POST:由于数据是作为请求体发送的,因此POST请求传输的数据量较大,一般没有特定的限制。
  4. 缓存机制:
    • GET:可以被浏览器缓存cache,
    • POST:通常不会被浏览器缓存
  5. 幂等性:
    • GET:幂等,多次请求相同的URL会得到相同的结果,不会产生副作用。
    • POST:不幂等,多次请求相同的URL可能会产生不同的结果,会产生副作用,比如向数据库中添加数据。

常用HTTP请求方式有哪些 ?

HTTP/1.1协议中共定义了八种请求方式来以不同方式操作指定的资源分别是
GET,POST,PUT,DELETE,TRACE,OPTIONS,HEAD,CONNECT
其中前四种会用的比较多一些 , 在RestFull风格中一般

  • GET用于查询请求
  • POST用于新增请求
  • PUT用于修改请求
  • DELETE用于删除请求

进程跟线程的区别?

  1. 定义:
    • 进程:进程是程序的一次执行过程,是系统进行资源分配和调度的一个独立单位。每个进程都有独立的内存空间
    • 线程:线程是进程中的一个执行单元,一个进程可以包含多个线程,线程共享进程的资源,如内存空间
  2. 资源占用:
    • 进程:每个进程都有独立的内存空间和系统资源,因此进程之间的切换开销较大。
    • 线程:线程共享进程的内存空间和资源,线程之间的切换开销相对较小。
  3. 创建和销毁:
    • 进程:创建和销毁进程的开销较大,需要分配和释放独立的内存空间和系统资源。
    • 线程:创建和销毁线程的开销相对较小,因为线程共享进程的资源,只需分配和释放少量的线程相关资源。
  4. 并发性:
    • 进程:进程之间相互独立,通信需要通过进程间通信(IPC)机制来实现。
    • 线程:线程之间可以共享同一进程的资源,可以直接访问进程的全局变量等共享数据,通信更加方便。
  5. 执行性质:
    • 进程:进程可以看作是程序的一次执行,拥有独立的执行序列。
    • 线程:线程是进程的执行单元,多个线程可以同时执行不同的任务,提高了程序的并发性和响应速度。

僵尸进程?

僵尸进程(Zombie Process)是指一个已经完成执行任务但其父进程尚未调用wait()或waitpid()函数来获取其状态信息的子进程。在这种情况下,子进程虽然已经终止,但是其在系统进程表中的表项依然存在,称为僵尸进程。
当一个进程结束时,操作系统会向其父进程发送一个 SIGCHLD 信号,通知父进程子进程已经终止。父进程可以通过调用wait()或waitpid()等系统调用来获取子进程的状态信息,并释放其在进程表中的资源。如果父进程没有及时处理这个信号,或者忽略了这个信号,子进程就会成为僵尸进程。
僵尸进程占用系统资源,尤其是进程表中的条目,如果系统中有大量的僵尸进程,就会影响系统的性能和稳定性。因此,及时处理僵尸进程是很重要的。
通常,父进程可以通过以下方式处理僵尸进程:

  1. 使用wait()或waitpid()函数等待子进程结束,并获取其状态信息,然后释放资源。
  2. 使用信号处理程序捕获 SIGCHLD 信号,并在信号处理程序中处理僵尸进程。
  3. 父进程退出时,操作系统会自动将其子进程的所有资源释放,包括僵尸进程。

IO的多路复用?

IO的多路复用(IO Multiplexing)是一种IO模型,通过在一个线程内同时监听多个IO事件,实现对多个IO操作的管理和调度,从而提高系统的IO效率。
在传统的阻塞IO模型中,每个IO操作都需要一个线程来处理,如果有大量的IO操作,就需要大量的线程,这样会导致系统资源的浪费和线程管理的复杂性。而多路复用IO模型通过一个线程同时监听多个IO事件,只有当有IO事件就绪时才会被唤醒,从而减少了线程的数量,提高了系统的性能和效率。
在Unix/Linux系统中,常用的多路复用IO函数包括select、poll和epoll。这些函数允许程序同时监视多个文件描述符(socket、文件等),并在其中任何一个文件描述符就绪时通知程序,从而实现了IO的多路复用。

虚拟内存

根据内存跟磁盘,给应用程序提供一个看似连续比实际可用物理内存大的空间

  1. 分页机制(Paging):
    • 将物理内存和硬盘空间划分成固定大小的页面(Page)或帧(Frame),通常大小为4KB或更大。
    • 操作系统将进程的地址空间划分为相同大小的页面,使得每个进程都可以看到一个连续的地址空间,称为虚拟地址空间。
  2. 页表(Page Table):
    • 为了跟踪虚拟内存中的页面到物理内存中的位置的映射关系,操作系统维护了一个页表。
    • 页表记录了每个虚拟页面对应的物理页面的位置信息,以及页面的状态(如是否在内存中)等信息。
  3. 页面置换算法(Page Replacement Algorithm):
    • 当物理内存不足以容纳所有进程所需的页面时,操作系统需要选择哪些页面从内存中换出到硬盘上,以便为新的页面腾出空间。
    • 常见的页面置换算法包括最近最少使用(LRU)、先进先出(FIFO)、最不常用(LFU)等。
  4. 页面访问机制:
    • 当应用程序访问虚拟内存中的某个页面时,操作系统会根据页表将虚拟地址转换为物理地址。
    • 如果所需的页面当前不在物理内存中,操作系统将触发页面调度(Page Fault),将页面从硬盘加载到内存中,并更新页表。
  5. 写回与写通过(Write-back vs Write-through):
    • 虚拟内存系统通常采用写回(Write-back)策略,即当数据被修改时,首先修改的是缓存中的数据,而不是直接写入主存。
    • 这样可以减少对主存的写操作,提高性能,但需要定期将被修改的页面写回到硬盘中,以保持一致性。

什么是OSI模型

应⽤层:⽹络服务与最终⽤⼾的⼀个接⼝。包括电子邮件、网页浏览、文件传输
表⽰层:数据的格式转换、加密解密和压缩解压
会话层:建⽴、管理、终⽌会话。
传输层:定义传输数据的协议端⼝号,负责端到端的数据传输。
⽹络层:转发数据包
数据链路层:比特流组织成数据帧
物理层:传输原始比特流
image.png

其中HTTP协议HTTPS协议属于应用层 , TCP协议UDP协议属于传输层协议

说一说HTTP协议

HTTP协议又称为超文本传输协议 , 是一种用于分布式、协作式和超媒体信息系统的应用层协议。底层基于TCP协议实现 !
通常,由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认是80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器会向客户端返回一个状态,比如"HTTP/1.1 200 OK",以及返回的内容,如请求的文件、错误消息、或者其它信息
HTTP协议格式
HTTP协议分为请求和响应 , HTTP协议规定了在网络传输中的基本标和格式
请求(Request)格式
image.png
响应(Response)格式
image.png
简单总结一下 :

  • 请求 : 请求分请求行, 请求头 , 请求体
  • 响应 : 响应分响应行, 响应头 , 响应体

说一说HTTPS协议

HTTPS(超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性
HTTPS 默认使用 TCP 协议443端口,它的工作流程一般如以下方式:

  1. TCP 三次同步握手
  2. 客户端验证服务器数字证书
  3. 协商对称加密算法的密钥、hash 算法的密钥
  4. SSL 安全加密隧道协商完成
  5. 网页以加密的方式传输,用协商的对称加密算法和密钥加密,保证数据机密性
  6. 服务端用协商的hash算法进行解密 , 保证数据完整性,保证数据不被篡改

HTTPS协议和HTTP协议有什么区别 ? 👍

  1. HTTP 明文传输,数据都是未加密的,安全性较差,HTTPS(SSL+HTTP) 数据传输过程是加密的,安全性较好
  2. 使用 HTTPS 协议需要到 CA(数字证书认证机构) 申请证书,一般免费证书较少,因而需要一定费用。证书颁发机构如:Symantec、Comodo、GoDaddy 和 GlobalSign 等
  3. HTTP 页面响应速度比 HTTPS 快,主要是因为 HTTP 使用 TCP 三次握手建立连接,客户端和服务器需要交换 3 个包,而 HTTPS除了 TCP 的三个包,还要加上 ssl 握手需要的 9 个包,所以一共是 12 个包
  4. http 和 https 使用的是完全不同的连接方式,用的端口也不一样,前者是 80,后者是 443
  5. HTTPS 其实就是建构在 SSL/TLS 之上的 HTTP 协议,所以,要比较 HTTPS 比 HTTP 要更耗费服务器资源

总结一下 : HTTPS协议比HTTP协议更加安全 , 但是传输效率和通信效率更低, 消耗服务器资源更多

常用HTTP状态码有哪些 ? 代表什么意思 👍👍👍

HTTP协议响应状态代码的第一个数字代表当前响应的类型 , 一共3位数字组成的状态代码 , 例如:

  • 1xx : 消息——请求已被服务器接收,继续处理
  • 2xx : 成功——请求已成功被服务器接收、理解、并接受

200 (OK): 请求处理成功
201 (Created) : 请求已被接受, 并处理成功
202 (Accepted) : 服务器已接受请求,但尚未处理

  • 3xx : 重定向——需要后续操作才能完成这一请求

302 (Move Temporarily) : 重定向
304 (Not Modified) : 资源未改变 , 浏览器会从缓存获取
305 (Use Proxy) : 需要使用代理

  • 4xx : 请求错误——请求含有词法错误或者无法被执行

400 (Bad Request) : 一般是请求参数错误
401 (Unauthorized) : 请求未认证
403 (Forbidden) : 请求已经被接受但是决绝执行, 一般是权限不足
404 (Not Found) : 请求资源不存在, 一般是请求路径错误
405 (Method Not Allowed) : 请求方式不被允许 , 请求方式错误

  • 5xx : 服务器错误——服务器在处理某个正确请求时发生错误

500 (Internal Server Error) : 服务器内部错误, 一般是后端程序出现异常
503 (Service Unavailable) : 服务不可用, 一般出现在微服务项目, 服务调用过程中
504 (Gateway Timeout) : 网关操作, 一般网关出现问题

常用HTTP请求方式有哪些 ? 👍👍👍

HTTP/1.1协议中共定义了八种请求方式来以不同方式操作指定的资源分别是
GET,POST,PUT,DELETE,TRACE,OPTIONS,HEAD,CONNECT
其中前四种会用的比较多一些 , 在RestFull风格中一般

  • GET用于查询请求
  • POST用于新增请求
  • PUT用于修改请求
  • DELETE用于删除请求

说一说一个请求的完整过程 👍👍

http://www.baidu.com

  1. 浏览器查询 DNS,获取域名对应的IP地址

查询搜索浏览器自身的DNS缓存
查询搜索操作系统的DNS缓存
读取本地的Host文件
向本地DNS服务器进行查询

  1. 浏览器获得域名对应的IP地址以后,浏览器向服务器请求建立链接,发起三次握手;
  2. TCP/IP链接建立起来后,浏览器向服务器发送HTTP请求
  3. 服务器接收到这个请求,并根据路径参数映射到特定的请求处理器进行处理,并将处理结果及相应的视图返回给浏览器(SpringMVC执行流程)
  4. 浏览器解析并渲染视图,若遇到对js文件、css文件及图片等静态资源的引用,则重复上述步骤并向服务器请求这些资源
  5. 浏览器根据其请求到的资源、数据渲染页面,最终向用户呈现一个完整的页面

什么是TCP的三次握手👍👍👍

TCP协议位于传输层,作用是提供可靠的字节流服务,为了准确无误地将数据送达目的地,TCP协议采用三次握手策略
image.png

第1次握手:客户端发送一个带有SYN(synchronize)标志的数据包给服务端
第2次握手:服务端接收成功后,回传一个带有SYN/ACK标志的数据包传递确认信息,表示我收到了(服务器端是OK的)
第3次握手:客户端再回传一个带有ACK标志的数据包,表示我知道了,握手结束(客户端是OK的)

什么是TCP的四次挥手👍👍👍

TCP协议在断开连接的时候, 客户端和服务端都必需单独进行关闭
当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接
收到一个 FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据
首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭
image.png

有没有了解过XSS攻击 , 如何预防

XSS全称Cross-Site Scripting(跨站脚本攻击) ,是一种代码注入攻击。
攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全
XSS 的本质是:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行
预防手段 :

  1. 利用模板引擎 开启模板引擎自带的 HTML 转义功能
  2. 避免内联事件 尽量不要使用 onLoad=“onload(‘{{data}}’)”、onClick=“go(‘{{action}}’)” 这种拼接内联事件的写法。
  3. 在 JavaScript 中通过 .addEventlistener() 事件绑定会更安全。
  4. 避免拼接 HTML 前端采用拼接 HTML 的方法比较危险,采用比较成熟的渲染框架,如 Vue/React 等
  5. 时刻保持警惕 在插入位置为 DOM 属性、链接等位置时,要打起精神,严加防范
  6. 增加攻击难度,降低攻击后果 通过输入长度配置、接口安全措施等方法,增加攻击的难度,降低攻击的后果
  7. 主动检测和发现 可使用 XSS 攻击字符串和自动扫描工具寻找潜在的 XSS 漏洞

有没有了解过CSRF攻击, 如何预防

CSRF跨站点请求伪造(Cross—Site Request Forgery),跟XSS攻击一样,存在巨大的危害性
你可以这样来理解: 攻击者盗用了你的身份,以你的名义发送恶意请求,对服务器来说这个请求是完全合法的,但是却完成了攻击者所期望的一个操作 , 如下所示 :
image.png

  1. 用户已经登录了站点 A,并在本地记录了 cookie
  2. 在用户没有登出站点 A 的情况下(也就是 cookie 生效的情况下),访问了恶意攻击者提供的引诱危险站点 B
  3. 网站B接收到用户请求后,返回一些攻击性代码 , 并发出一个请求要求访问第三方站点A
  4. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行

CSRF的防御方法

  1. CSRF漏洞检测 , 使用一些专门针对CSRF漏洞进行检测的工具,如CSRFTester,CSRF Request Builder等
  2. 验证 HTTP Referer(请求来源) 字段
  3. 增加 token并验证 ,服务器为用户的浏览器提供唯一的,随机生成的令牌,并在执行请求之前检查每个请求以查看浏览器是否将其发回

有没有了解过SQL注入攻击, 如何预防👍

SQL注入攻击是指攻击者通过构造恶意的SQL语句,利用应用程序的SQL查询功能,在数据库中执行恶意操作的一种攻击方式
例如 :
我们知道,SQL 语句可以查询、插入、更新和删除数据,且使用分号来分隔不同的命令。例如:
SELECT * FROM users WHERE user_id = ${user_id}
其中,user_id 是传入的参数,如果传入的参数值为“1234; DELETE FROM users”,那么最终的查询语句会变为:
SELECT * FROM users WHERE user_id = 1234; DELETE FROM users
如果以上语句执行,则会删除 users 表中的所有数据
避免SQL注入:

  1. 过滤输入内容,校验字符串

过滤输入内容就是在数据提交到数据库之前,就把用户输入中的不合法字符剔除掉。可以使用编程语言提供的处理函数或自己的处理函数来进行过滤,还可以使用正则表达式匹配安全的字符串。

  1. 使用预编译 , 使用jdbc中的PreparedStatement对SQL语句进行预编译, 参数使用?替代 , 之后设置参数执行

在预编译的情况下,数据库服务器不会将参数的内容视为 SQL 语句的一部分来进行处理,而是在数据库完成 SQL 语句的编译之后,才套用参数运行。因此就算参数中含有破坏性的指令,也不会被数据库所运行

  1. 安全测试、安全审计

在开发过程中应对代码进行审查,在测试环节使用工具进行扫描,上线后定期扫描安全漏洞 , 例如 :Havij,Domain SQL Injector等工具

简单介绍一下Java的IO流

IO流从流向上看,分为输入流和输出流;从操作的数据单元来看,分为字节流和字符流
**字节流的组成如下所示 : **

字符流的组成如下所示 :

思考 : 字节流如何转字符流 ? InputStreamReader OutputStreamWriter

什么是AIO、BIO和NIO

  1. BIO(Blocking I/O):
    • BIO 是最传统的 I/O 模型,在执行 I/O 操作时会阻塞当前线程,直到操作完成或者超时。这意味着当一个线程执行 I/O 操作时,其他线程无法使用 CPU。
    • 在 BIO 中,通常是通过 InputStream 和 OutputStream 来进行数据的读取和写入。
  2. NIO(Non-blocking I/O):
    • NIO 是 Java 1.4 引入的一种更为灵活和高效的 I/O 模型。它提供了 Channel 和 Buffer 的概念,使得可以使用单个线程处理多个连接,提高了系统的并发性能。
    • NIO 中引入了 Selector(选择器)的概念,通过它可以实现单线程监听多个 Channel 上的事件,从而实现非阻塞的 I/O 操作。
    • NIO 主要由 java.nio 包中的类和接口实现,如 ByteBuffer、Channel、Selector 等。
  3. AIO(Asynchronous I/O):
    • AIO 是 Java 1.7 引入的一种异步非阻塞的 I/O 模型,也称为 NIO.2。它相比于 NIO 提供了更为简洁的异步操作方式,使得可以在 I/O 操作完成后通过回调函数获取结果,而不需要手动检查状态或者轮询。
    • AIO 中主要使用了 java.nio.channels.AsynchronousChannel 和 java.nio.channels.CompletionHandler 等类和接口。

什么是网站跨域, 如何解决跨域 👍

跨域:指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
例如:a页面想获取b页面资源,如果a、b页面的协议、域名、端口、IP任意一个不同,所进行的访问行动都是跨域的,而浏览器为了安全问题一般都限制了跨域访问,也就是不允许跨域请求资源。注意:跨域限制访问,其实是浏览器的限制。
同源策略:是指协议,IP/域名,端口都要相同,其中有一个不同都会产生跨域;

如何解决跨域问题?

  1. 使用nginx作为代理服务器 , 对客户端请求进行统一处理, 转发到服务器

  1. 使用跨域资源共享CORS方案

它的总体思路是:如果浏览器要跨域访问服务器的资源,需要获得服务器的允许

  1. 使用@CrossOrigin注解配置
@RestController
@CrossOrigin
public class TestController {

    @GetMapping("test")
    public String test() {
        return "success";
    }
}
  1. 在配置类中配置CORS跨域
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
	
	@Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedHeaders("*")
                .allowedMethods("*")
                .allowCredentials(true);
    }
}

  1. 在Gateway网关中配置CORS跨域
spring:
  application:
    name: gateway  #服务名称
  cloud:
    gateway:
      globalcors:
        add-to-simple-url-handler-mapping: true
        cors-configurations:
          '[/**]':  #拦截的请求
            allowedOrigins: #允许跨域的请求
              - "http://localhost:8080"
            allowedMethods: #运行跨域的请求方式
              - "GET"
              - "POST"
              - "DELETE"
              - "PUT"
              - "OPTIONS"
            allowedHeaders: "*" #允许请求中携带的头信息
            allowedCredentials: true #是否允许携带cookie
            maxAge: 36000 #跨域检测的有效期,单位s

  • 33
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

来一杯龙舌兰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值