计算机网络+操作系统八股总结
Last updated on November 3, 2024 pm
备份一下机组知识,从0背操作系统😇
一、计算机网络
(1)网络协议
1、域名解析
多张图带你彻底搞懂DNS域名解析过程_dns解析的过程是怎么样的-CSDN博客
域名系统作为将域名和 IP 地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。
🦥递归查询
主机首先向其本地域名服务器进行递归查询,本地服务器收到递归查询委托后,向根域名服务器进行递归查询,根域名接着向顶级域名服务器递归查询,顶级域名向权限域名服务器查询。
查询到对应的IP后,结果会在之前受委托的各域名服务器间传递,最后传回用户主机。
🦥迭代查询
(主机向本地域名服务器进行的是递归查询)
本地服务器开始发送迭代查询,收到查询的服务器要么给出所要查询的IP地址,要么告诉本地服务器下一步应该找哪个域名服务器进行查询,让本地服务器进行后续的查询。
🦥高速缓存
为了提高DNS的查询效率,减轻根域名服务器的负荷和减少因特网上DNS查询的报文数量,在域名服务器中使用高速缓存。用以存放最近查询过的域名以及从何处获得域名映射信息的记录。
- 为每项高速缓存设置计时器并删除超过合理时间的项
- 主机也需要维护高速缓存
2、如何判断两个IP地址处于同一个网络
将两个IP地址和相同的子网掩码做按位与运算,如果结果相同说明在同一网络。
3、MAC地址的作用
MAC地址是每个网络接口卡(NIC)制造时分配的一个唯一标识符。它通常以16进制格式表示,并由六组两位数字组成,例如
00:1A:2B:3C:4D:5E
。分为单播、广播和多播地址,位于数据链路层。
🐰设备的唯一标识:
每个网络接口卡(NIC)都拥有一个唯一的MAC地址,用于在局域网中唯一标识设备。这使得网络能够准确地识别和区分不同的设备。
🐰数据链路层通信:
以太网帧使用源和目的MAC地址来确定数据包的发送者和接收者。这样可以在同一网络段内实现设备间的直接通信。
🐰局域网内的数据转发
交换机使用MAC地址来构建MAC地址表(也称为转发表),以决定如何将数据包转发到特定的端口。这样可以提高网络的效率和速度。
🐰地址解析协议
当设备需要通过IP地址发送数据时,它会使用ARP协议将目标IP地址解析为MAC地址。这允许网络设备找到其他设备并进行有效通信。
🐰网络安全
在某些安全机制中,MAC地址可以用作访问控制列表(ACL)的一部分,限制哪些设备可以连接到网络。
🐰多播和广播通信
MAC地址的多播和广播功能允许将数据发送给一组设备或网络中的所有设备,而不仅仅是单个设备。例如,广播地址 FF:FF:FF:FF:FF:FF
可用于向网络中的所有设备发送消息。
🐰网络监控和管理
网络管理员可以使用MAC地址进行设备管理、监控和故障排除。通过分析MAC地址,管理员可以识别出异常流量和潜在的安全问题。
🐰虚拟局域网
在VLAN配置中,MAC地址可以帮助实现不同VLAN之间的通信管理,以便有效地划分和管理网络流量。
4、0-RTT连接
0-RTT(Zero Round Trip Time)握手是一种网络协议的优化技术,主要用于加快连接建立的过程。它允许客户端在建立连接时就发送数据,而不需要等待传统的握手过程完成,从而显著减少延迟。0-RTT通常与QUIC协议结合使用。
🐶握手过程
- 之前的连接:客户端与服务器在之前的会话中成功建立过连接,并且服务器提供了相应的0-RTT支持。
- Session Ticket:在之前的连接中,服务器发送给客户端一个“会话票据”(Session Ticket),包含了会话状态的信息。
- 客户端发送数据:在建立新连接时,客户端使用之前的会话票据立即发送数据,而不需要等待完整的握手完成。
- 服务器验证:服务器接收到客户端的0-RTT数据后,可以使用会话票据验证客户端的身份,并响应相应的数据。
- 握手完成:即使在发送数据的同时,握手仍在后台进行,最终完成后,连接就建立成功。
🐶优点:
- 减少延迟:0-RTT可以显著降低建立连接的延迟,特别是在高延迟的网络环境中。
- 更快的应用响应:由于可以在握手期间发送数据,应用程序可以更快地响应用户操作,提高用户体验。
- 效率提升:对于需要频繁建立连接的应用(如移动设备或高频率的请求),0-RTT可以显著提升性能。
🐶缺点:
- 重放攻击风险:由于客户端在握手之前就发送了数据,这可能使得某些类型的重放攻击变得更容易,尤其是当传输的数据不是一次性的。
- 安全性考量:使用0-RTT时,服务器需要对会话票据进行安全管理,以防止滥用。
- 数据完整性:由于客户端在握手完成之前就发送了数据,服务器必须小心处理这些数据,以确保在验证身份之前不处理任何敏感操作。
5、包过滤防火墙
一种通过检查网络数据包的头部信息,根据预设的规则来决定是否允许数据包通过的防火墙类型。它工作在网络层(OSI 模型的第三层),对数据包的 IP 地址、端口号、协议等信息进行过滤。是最早的一种防火墙类型,也是目前最简单、性能最高的防火墙之一。
缺乏上下文:包过滤防火墙只检查单个数据包,无法感知连接的状态或上下文,容易受到某些攻击,如 IP 欺骗。
灵活性差:无法深入到应用层进行过滤,无法对内容进行检查,只能基于 IP、端口和协议进行粗粒度过滤。
容易被绕过:如果攻击者知道某些开放的端口,可能通过伪装包绕过包过滤规则。
6、ARP协议
ARP(Address Resolution Protocol,地址解析协议) 是用于将IP地址解析为MAC地址的协议。它在局域网(LAN)中非常常用,特别是在IPv4环境中,用来帮助主机在网络中找到其他主机的硬件地址,以实现数据的正确传输。工作在数据链路层(网络接口层)
基本工作原理
- 当一台主机想要与同一个局域网中的另一台主机通信时,发起通信的主机已经知道对方的 IP 地址(如 192.168.1.2),但是并不知道对方的 MAC 地址。
- 这时,发起通信的主机会在网络上广播一个 ARP 请求,请求中包含了自己知道的目标主机的 IP 地址,目的是询问“谁拥有这个 IP 地址?”。
- 网络中的每个主机都会收到这个 ARP 请求包,但只有目标 IP 地址匹配的主机会回应一个 ARP 回复,并告知自己的 MAC 地址。
- 发起通信的主机接收到 ARP 回复后,将目标 IP 地址和 MAC 地址缓存到自己的 ARP 缓存表 中,以便后续的通信不需要再次发送 ARP 请求。
请求与响应
- ARP 请求:广播消息,查询目标 IP 地址对应的 MAC 地址。
- 包含发起主机的IP地址和MAC地址,以及目标主机的IP地址
- ARP 响应:目标主机接收到请求后,单播回复自己的 MAC 地址。
- 包含发起主机和目标主机的IP地址和MAC地址
局限
- 局域网范围:ARP是基于广播的协议,工作在局域网(同一子网中),无法跨网段工作。
- ARP欺骗:由于ARP没有验证机制,容易受到ARP欺骗攻击。攻击者可以伪造ARP相应包,将自身MAC地址和目标IP地址绑定,从而窃听或劫持网络通信。
7、GET和POST的区别
🐸GET
- 用于从服务器获取数据
- 请求参数通过URL的查询字符串传递,通常在URL末尾?开始,以key=value的形式
- 适合传递少量数据
- 由于请求参数在URL中可见,不适合传递敏感信息
- 请求可以被缓存,以提高性能
- 幂等的,即多次请求相同的 URL 应返回相同的结果,而不改变服务器状态。
🐸POST
- 用于向服务器发送数据(例如提交表单数据)
- 请求参数放在请求体中
- 可以发送大量数据,几乎没有大小限制(具体取决于服务器)
- 相对来说更安全,但仍然需要通过 HTTPS 加密传输以确保安全。
- 通常不会被缓存,因为通常涉及更改服务器的状态
- 不是幂等的,重复提交相同的 POST 请求可能会导致不同的结果,例如多次创建相同的资源。
(2)HTTP协议
1、Header
在HTTP(超文本传输协议)中,Header(头部)用于在客户端和服务器之间传递额外的元数据。HTTP请求和响应都包含头部,头部由多个键值对组成,格式为:
键: 值
。
@通用头部
适用于请求和响应,提供协议层面的通用信息,不针对具体的资源或内容。
- **
Date
**:指示请求或响应发送的日期和时间。 - **
Connection
**:控制连接的类型,常见值为keep-alive
(保持连接)和close
(关闭连接)。 - **
Cache-Control
**:用于控制缓存策略,如no-cache
、max-age
等。
@请求头部
用于发送客户端请求时,传递与客户端、请求资源、客户端希望的响应格式等相关的信息。
- **
Host
**:指定服务器主机名和端口号,表示请求的目标主机(例如Host: www.example.com
)。 - **
User-Agent
**:描述发出请求的客户端(如浏览器或其他应用程序)的类型和版本(例如User-Agent: Mozilla/5.0
)。 - **
Accept
**:表示客户端可以处理的内容类型,如Accept: text/html
、application/json
等。 - **
Authorization
**:用于提供身份验证信息,常用于Bearer
、Basic
等认证机制(例如Authorization: Bearer <token>
)。 - **
Cookie
**:用于在请求中传递存储在客户端的Cookie(例如Cookie: sessionId=abcd1234
)。
@响应头部
用于传递服务器的响应元数据,告知客户端如何处理响应的附加信息。
- **
Server
**:表示响应是由哪个服务器或服务器软件处理的(例如Server: Apache/2.4.41
)。 - **
Set-Cookie
**:用于服务器指示客户端存储Cookie(例如Set-Cookie: sessionId=abcd1234; Path=/; Secure; HttpOnly
)。 - **
Location
**:用于重定向,指示客户端应重新请求的URL(例如Location: https://www.example.com/new-page
)。 - **
WWW-Authenticate
**:用于定义客户端需要使用的认证方式(例如WWW-Authenticate: Basic realm="Access to the site"
)。
@实体头部
描述资源的元数据,提供有关实体主体的信息。
- **
Content-Type
**:表示响应内容的类型和编码(如Content-Type: text/html; charset=UTF-8
)。 - **
Content-Length
**:表示响应体的字节长度(如Content-Length: 348
)。 - **
Content-Encoding
**:指定实体内容的压缩方式,如gzip
、deflate
等。 - **
Last-Modified
**:指示资源最后修改的时间,用于缓存验证和条件请求(如Last-Modified: Tue, 15 Nov 2022 12:45:26 GMT
)。 - **
ETag
**:给资源分配的唯一标识符,常用于缓存机制和版本控制(如ETag: "abc123"
)。
2、各个版本
🌑HTTP/0.9
◾请求方式:仅支持GET请求
◾无HTTP头部:无法发送和接收请求响应头
◾只能传输HTML:无法传输其他格式的数据,如图片、视频等
🔻简单的单项协议,用于获取网页
🔻仅支持HTML内容的传输,页面响应的灵活性很差
🌒HTTP/1.0
🔹请求头和响应头:支持发送和接收头信息,包括 Content-Type
、Content-Length
等
🔹支持不同的数据类型:可以传输图片、文本、视频等
🔹状态码:引入了状态码(如 200 OK
、404 Not Found
)来表示请求的结果。
🔹短连接:每个请求/响应之后连接关闭,即每次请求资源时都会新建一个TCP连接。
🔻短连接模式,效率低,每次请求需要建立和关闭连接,增加了延迟。
🌓HTTP/1.1
🔷持久连接(Keep-alive):默认启用持久连接,允许复用TCP连接以减少连接建立的开销,大大提高了性能。
🔷分块传输编码:允许服务器在不确定相应内容长度的情况下开始发送响应,支持动态生成内容。
🔷缓存机制:引入了Cache-Control、ETag等头部,支持更好的缓存控制和验证
🔷虚拟主机:允许多个域名共享同一IP地址,解决了早期IP地址不足的问题(Host字段)
🔷带宽优化:增加了压缩、范围请求等机制,以便更好地利用带宽
🔷管道化(Pipelining):允许在同一TCP连接上并发发送多个请求,但服务器必须按照顺序返回响应。(虽有这个机制,但是由于实现复杂,使用较少)
🔻虽然支持持久连接,但同一连接中仍然存在“队头阻塞”(Head of Line Blocking)问题,一个请求的响应需要等到前一个请求完成后才能处理。
🌔HTTP/2
💠二进制传输:将消息格式从1.1的纯文本转换为二进制,解析更加高效、灵活
💠多路复用:同一个TCP连接上可以并发多个请求和响应,一个连接同时处理多流
💠头部压缩:使用专门的算法对HTTP头部进行压缩,减少带宽占用,提高传输效率
💠服务器推送:服务器可以在客户端未请求时主动推送相关资源,减少页面加载时间
💠流优先级:允许客户端指定不同请求的优先级,优化资源传输顺序
🔻多路复用的实现依赖于单一的TCP连接,当TCP丢包时,所有流的传输都可能受到影响。
🌕HTTP/3
🔶基于UDP的QUIC协议:HTTP/3 在QUIC协议上运行,QUIC 是一种在用户态实现的快速、低延迟传输协议,解决了TCP的队头阻塞问题。
🔶减少延迟:由于QUIC集成了TLS,握手过程比TCP快,连接建立的延迟显著降低
🔶多路复用改进:(基于UDP)即使某个数据包丢失其他流也不受影响,提高整体传输效率
🔶0-RTT连接建立:QUIC允许在某些情况下进行0-RTT握手,进一步减少延迟
🔺更高的传输效率和更低的延迟,适用于现代网络的需求,特别是在移动网络和高延迟环境下的表现出色。
3、HTTP和HTTPS的区别
HTTP
- 数据以明文形式传输,任何在传输过程中拦截数据的攻击者都可以查看和修改信息。
- 没有身份验证机制,无法验证服务器的身份,用户无法确定自己访问是合法网站。
- 由于没有加密和解密过程,HTTP 的传输速度相对较快。
- 不再被搜索引擎优先考虑,可能会影响网站的搜索排名。
- 默认使用端口 80
HTTPS
- 通过 SSL/TLS 协议加密传输的数据,确保数据在传输过程中不被第三方窃取或篡改。这使得 HTTPS 更加安全,能够保护用户的隐私和敏感信息。
- 在发送数据之前,客户端和服务器之间会进行安全连接的握手,生成加密密钥以确保通信的安全性。
- 通过证书验证服务器身份,用户可以查看证书信息,确保与合法的网站进行通信。只有受信任的证书颁发机构(CA)签发的证书才能被浏览器接受。
- 加密和解密会消耗一些性能,尤其是在握手和密钥交换阶段,可能会稍微增加延迟。但现代硬件和优化技术使得这种性能差距逐渐缩小。
- 搜索引擎(如 Google)更倾向于优先考虑使用 HTTPS 的网站,认为它们更安全。此外,用户在访问 HTTPS 网站时,通常会看到浏览器中的安全锁图标,增加用户的信任感。
- 默认使用端口 443。
4、HTTPS的握手过程
TCP连接会先建立好。
基于SSL(安全套接层)或 TLS(传输层安全性)
1️⃣客户端发送“Hello”
- 协议版本:客户端支持的最高版本
- 随机数:用于密钥生成
- 支持的加密套件:客户端支持的加密算法列表
- 压缩方法:客户端支持的压缩算法(如果有)
2️⃣服务器回复“Hello”
- 协议版本:服务器选择的协议版本。
- 随机数:服务器随机生成的数值。
- 选择的加密套件:服务器选择的加密算法。
- 选择的压缩方法:服务器选择的压缩算法(如果有)。
3️⃣服务器向客户端发送SSL/TLS证书
- 服务器的公钥。
- 证书颁发机构(CA)的信息。
- 证书的有效期等。
4️⃣服务器Hello Done
表示服务器Hello消息已经结束,客户端可以开始处理服务器的消息
5️⃣客户端密钥交换
客户端生成一个称为“预主密钥”的随机数,并用服务器的公钥对其进行加密。然后客户端将加密后的预主密钥发送给服务器。
6️⃣密钥生成
客户端和服务器都是用预主密钥和之前交换的随机数生成会话密钥(对称密钥)。对称密钥用于后续的数据加密和解密。
7️⃣完成握手
客户端完成:客户端发送一条消息表示握手完成,消息会使用会话密钥加密
服务器完成:服务器收到客户端的消息后也发送加密消息
8️⃣安全通信开始
完成握手后,客户端和服务器之间的通信将会使用会话密钥加密。此时,数据传输的机密性和完整性得到保障。
(3)跨域
跨域(Cross-Origin)是指浏览器处于安全性考虑,阻止来自不同域的网页请求资源。跨域请求通常由浏览器的同源策略(Same-Origin Policy)引起。浏览器默认只允许同源请求。
1、同源请求
规定只有协议、域名、端口都相同的两个页面,才能共享资源或进行请求。
为什么会有跨域限制?
跨域限制的主要目的是保护用户数据,避免一些恶意网站或脚本未经授权访问用户在其他网站上的敏感信息。例如:
- CSRF 攻击(跨站请求伪造):攻击者伪造用户请求,利用用户的身份在合法网站上执行未授权操作。
- 数据泄露:攻击者可能利用跨域访问,获取用户的敏感信息。
跨域的场景:
- Ajax 请求:前端通过 XMLHttpRequest 或
fetch
API 向不同源的服务器发送请求。 - 前端和服务器分开部署,接口请求需要跨域
- 页面中的资源加载:比如通过
<img>
、<script>
、<iframe>
、<link>
标签加载外部资源时,可能涉及跨域。 - 跨域嵌套的页面:通过
<iframe>
嵌套不同域的页面时会受到限制。
2、CORS
Cross-Origin Resource Sharing(跨域资源共享)事最常用的解决跨域问题的机制。服务器通过设置特定的响应头,允许浏览器访问来自不同源的资源。
- 当浏览器发起跨域请求时,会自动添加Origin请求头,标记请求的来源。
- 如果服务器允许该跨域请求,会发出以下响应头。
🔹常见的响应头:
- Access-Control-Allow-Origin:允许的源,可以是具体的域名(如
http://example.com
),也可以是*
(允许所有域)。 - Access-Control-Allow-Methods:允许的 HTTP 方法(如
GET
、POST
、PUT
等)。 - Access-Control-Allow-Headers:允许的请求头(如 Content-Type、Authorization)。
- Access-Control-Allow-Credentials:是否允许发送凭证(如 Cookies)。
🔹CORS请求类型
- 简单请求:如GET和POST,且请求头比较简单(如Content-Type:text/plain),这种请求头不需要预检。
- 预检请求:非简单请求,浏览器会先发送一个OPTIONS请求,询问服务器是否允许当前跨域请求。服务器相应允许后,才会发送实际的请求。
🔹示例
- 前端请求
1 |
|
- API服务器的响应
1 |
|
🔹注意:
- 如果希望允许凭据(如Cookies)随请求一起发送,必须明确指定允许的域名,而不是*
3、JSONP(JSON with Padding)
早期的跨域解决方案,适用于只进行GET请求的场景。
🔸工作方式
前端通过动态创建<script>
标签向服务器发送请求,服务器返回一段JavaScript代码,其中包含了一个函数调用。该函数是由前端提前定义好的,服务器返回的数据作为该函数的参数。
🔸示例
- 前端代码
1 |
|
- 服务器返回的内容
1 |
|
通过这种方式前端就可以绕过同源策略成功获取跨域数据。
🔸缺点
只能用于GET请求,存在风险,容易受到XSS攻击
4、Websocket协议
Wedsocket协议是一种在客户端(浏览器)和服务器之间进行全双工通信的协议,它允许双方在单个持久连接的基础上,进行双向的数据传输。与传统的HTTP协议不同,Websocket不是基于请求-响应模式的,而是可以在连接建立后,双方随时主动发消息。这使得它适合实时应用,如聊天、游戏、实时数据推送。
🦄特点:
- Websocket 不受同源策略影响,只要服务器端支持,无需任何配置就支持跨域。
- 双向通信(Full-Duplex): 允许服务器和客户端同时发送和接收数据,而不必等待对方发起请求
- 低延迟:由于只需要进行一次初始握手,并且链接一旦建立变持续存在,后续的数据传输不需要重新建立连接,因此可以减少延迟。
- 节省带宽:通信报文头部比HTTP端,后续的消息交换只需要很少的协议头数据
- 持久连接:连接一旦建立便会一直保持,除非客户端/服务器主动关闭连接或发生错误
🦄与HTTP的关系
并非取代HTTP,而是建立在HTTP协议之上。握手成功后接管。
- 握手:它的握手是通过标准的HTTP/1.1请求来完成的,客户端发起的HTTP请求带有Upgrade:websocket头部,表示请求服务器升级协议。
- HTTP/2:由于HTTP/2采用多路复用流的方式,与Websocket的单连接设计不兼容
🦄优缺点
优点:高效、实时、占用资源少
缺点:不支持断线重连(HTTP会自动发起新请求)、防火墙兼容问题(非标准HTTP通信)
(4)常见的网络攻击
【面试篇】寒冬求职之你必须要懂的Web安全 · Issue #29 · YvetteLau/Blog
1、XSS攻击(跨站脚本攻击)
攻击者将恶意的脚本代码注入到受信任的网站中,其他用户在访问时执行这些恶意脚本,从而被攻击者窃取会话信息、用户数据等。
本质:恶意代码没有经过过滤,与网站的正常代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行;由于直接在用户的终端执行,恶意代码可以直接获取用户用户的信息,利用这些信息冒充用户向网站发起攻击者定义的请求。
如何避免
- 对所有用户输入进行严格的验证和过滤。可以使用白名单策略,只允许特定格式或内容的输入。
- 将敏感信息(如会话 cookie)设置为 HttpOnly,这样 JavaScript 无法访问这些 cookie。
- 设置 Secure 标志,确保 cookie 仅通过 HTTPS 传输。
- 使用现代的前端框架
2、CSRF攻击(跨站请求伪造)
攻击者诱使已经登陆的用户访问恶意网站或者链接,从而在用户不知情的情况下以用户身份执行未经授权的操作。
- 使用 CSRF 令牌:为每个表单生成唯一的 CSRF 令牌,并在请求中验证该令牌。
- 检查 Referer 头:验证请求的来源,以确保请求来自合法的页面。
- 同源策略:确保敏感操作只能从同源域进行。
3、中间人攻击
HTTPS 中间人攻击(Man-in-the-Middle Attack, MITM)是一种网络攻击方式,攻击者通过在用户和网站之间插入自己,从而拦截和操纵通信数据。尽管 HTTPS(超文本传输安全协议)提供了加密和安全性,但如果攻击者能够控制某些网络条件,依然可以实施中间人攻击。
SSL Stripping:
- 攻击者将 HTTPS 请求转换为 HTTP 请求,使用户与网站之间的连接不再加密,从而能够拦截数据。
Wi-Fi 热点攻击:
- 攻击者设置伪造的 Wi-Fi 热点,诱使用户连接,从而监控用户的网络流量。
DNS Spoofing:
- 攻击者通过伪造 DNS 响应将用户引导到恶意网站,尽管该网站看起来与原网站相同。
二、操作系统
(1)进程调度
1、阻塞和就绪
🐅阻塞状态
进程处于阻塞状态时,表示它正在等待某个事件的发生,通常是等待 I/O 操作完成、信号量、条件变量或资源的释放。通常是因为请求的资源不可用(等待磁盘读写、网络数据接收)。
一旦等待的时间发生,阻塞的进程会被唤醒,转变为就绪状态,等待CPU资源的分配。
🐆就绪状态
进程处于就绪状态时,表示它已经准备好可以运行,等待 CPU 分配时间片。通常是一个准备执行的进程已经获得了所有所需的资源,但是由于CPU正在被其他进程使用,所以处于就绪状态。
2、进程和线程和协程
线程是进程中的一个执行流,是程序执行的最小单元。每个线程都拥有自己的栈、寄存器、和程序计数器,但它们共享进程的资源(如内存和文件描述符)。
进程是系统中资源分配的基本单位,而线程是程序执行的基本单位。
一个进程可以包含多个线程,这些线程可以并发执行。
线程之间的创建、销毁和切换的开销通常比进程更小,因此线程通常被认为是更轻量级的执行单位。
协程是一种协作式的多任务处理机制,它允许程序在执行过程中挂起(暂停)某个任务,然后在需要的时候恢复该任务的执行。