计算机基础
![logo](https://i-blog.csdnimg.cn/blog_migrate/25fefafc7aaa5717f735532968e8eed4.jpeg)
http状态码
HTTP 是超文本传输协议,也就是HyperText Transfer Protocol。
「301 Moved Permanently」表示永久重定向,说明请求的资源已经不存在了,需改用新的 URL 再次访问。
「302 Moved Permanently」表示临时重定向,说明请求的资源还在,但暂时需要用另一个 URL 来访问。
如果客户端使用 POST 方法发起的请求被重定向,且使用 302 状态码重定向,那么重新发起的请求可能会变成 GET 方法,从而可能造成已经提交的数据丢失。而如果使用 307 状态码重定向,客户端会按照原来的方法继续发起请求,因此不会造成数据丢失
![img](https://i-blog.csdnimg.cn/blog_migrate/7e8f1816ab7bed5851bbb435b05303b9.jpeg)
Http请求头
**HTTP(Hypertext Transfer Protocol)**请求头结构包含以下几个部分:
- 请求方法(Request Method):指定客户端请求的动作或者操作类型,如GET、POST、PUT、DELETE等。
- 请求路径(Request URL):指定请求的资源路径,包括主机名、端口号、路径和查询参数等信息。
- 协议版本**(HTTP Version)**:指定所使用的HTTP协议版本号,通常是HTTP/1.0或HTTP/1.1。
- 请求头部**(Request Headers)**:包含一些附加的请求头信息,如Accept、Accept-Encoding、Content-Type、User-Agent等。
- 实体主体**(Request Body)**:包含请求发送的数据信息,在POST和PUT等请求方法中常用到。
请求头的格式通常为:
<Method> <URL> HTTP/<Version>
<Header Name>: <Header Value>
<Header Name>: <Header Value>
...
<Header Name>: <Header Value>
<Request Body>
例如,一个POST请求头可能如下所示:
POST /api/user/register HTTP/1.1
Host: www.example.com
Content-Type: application/json
Content-Length: 45
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64)
Accept: */*
{"username": "example", "password": "password123"}
其中,请求方法为POST,请求路径为/api/user/register,协议版本为HTTP/1.1,请求头部包含Host、Content-Type、Content-Length、User-Agent、Accept等字段,请求实体主体为JSON格式的用户注册信息。
Http版本
![HTTP/1 ~ HTTP/3](https://i-blog.csdnimg.cn/blog_migrate/85212845e5ffaa6866d7ed653b6f3a35.jpeg)
下面是各个版本之间的主要特点对比:
版本 | 发布时间 | 主要特点 |
---|---|---|
HTTP/0.9 | 1991 | 只支持传输纯文本的 HTML 页面 |
HTTP/1.0 | 1996 | 支持多种数据类型;定义了 GET、POST、HEAD 请求方法;引入了状态码和 Header 和 Body 数据结构 |
HTTP/1.1 | 1999 | 引入了持久化连接,长连接、分块传输编码、管线化机制、缓存机制(强制缓存和协商缓存)等 |
HTTP/2 | 2015 | 引入了二进制分帧机制、多路复用机制、头部压缩机制、服务器推送机制等 |
无状态 明文传输 1.1
![img](https://i-blog.csdnimg.cn/blog_migrate/b92030a961554947121027379a233eb0.png)
RPC 与Http对比
- 纯裸 TCP 是能收发数据,但它是个无边界的数据流,上层需要定义消息格式用于定义消息边界。于是就有了各种协议,HTTP 和各类 RPC 协议就是在 TCP 之上定义的应用层协议。
- RPC 本质上不算是协议,而是一种调用方式,而像 gRPC 和 Thrift 这样的具体实现,才是协议,它们是实现了 RPC 调用的协议。目的是希望程序员能像调用本地方法那样去调用远端的服务方法。同时 RPC 有很多种实现方式,不一定非得基于 TCP 协议。
- 从发展历史来说,HTTP 主要用于 B/S 架构,而 RPC 更多用于 C/S 架构。但现在其实已经没分那么清了,B/S 和 C/S 在慢慢融合。很多软件同时支持多端,所以对外一般用 HTTP 协议,而内部集群的微服务之间则采用 RPC 协议进行通讯。
- RPC 其实比 HTTP 出现的要早,且比目前主流的 HTTP/1.1 性能要更好,所以大部分公司内部都还在使用 RPC。
- HTTP/2.0 在 HTTP/1.1 的基础上做了优化,性能可能比很多 RPC 协议都要好,但由于是这几年才出来的,所以也不太可能取代掉 RPC。
OSI 七层模型
![image-20230408205813514](https://i-blog.csdnimg.cn/blog_migrate/e75e4845b2a0270684ced8a82a12def6.png)
- 各层之间是独立的
- 灵活性好
- 结构上可分割开
- 易于实现和维护
- 能促进标准化工作
TCP 与UDP 8 20
1.是否面向连接:UDP在传送数据之前不需要先建立连接。而TCP提供面向连接的服务,在传
送数据之前必须先建立连接,数据传送结束后要释放连接。
2.是否是可靠传输:远地主机在收到UDP报文后,不需要给出任何确认,并且不保证数据不丢
失,不保证是否顺序到达。TCP提供可靠的传输服务,TCP在传递数据之前,会有三次握手来
建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制。通过TCP连接传输的数
据,无差错、不丢失、不重复、并且按序到达。
3.是否有状态:这个和上面的“是否可靠传输”相对应。TCP传输是有状态的,这个有状态说的是
TCP会去记录自己发送消息的状态比如消息是否发送了、是否被接收了等等。为此,TCP需要
维持复杂的连接状态表。而UDP是无状态服务,简单来说就是不管发出去之后的事情了(这很
渣男!)。
4.传输效率:由于使用TCP进行传输的时候多了连接、确认、重传等机制,所以TCP的传输效
率要比UDP低很多。
5.传输形式:TCP是面向字节流的,UDP是面向报文的
6.首部开销:TCP首部开销**(20~60字节)**比UDP首部开销(8字节)要大。
7.是否提供广播或多播服务:TCP只支持点对点通信,UDP支持一对一、一对多、多对一、多对
多;
- 可靠传输的原理:停止等待协议、ARQ协议。
- TCP连接:TCP连接(套接字1,套接字2)。TCP套接字(IP地址:端口号);
TCP报文段的首部格式(书225页,重在理解)
-
TCP的运输连接管理:三报文握手建立连接,四报文挥手释放连接。(书247-250,注意发送报文段和确认报文段seq和ack之间的关系)
ack=seq+1
msl 最长报文寿命
如果只有两次握手,存在以下情况:
- 主机 A 发送 SYN 报文段,但是该报文段在网络中滞留,无法到达主机 B。主机 A 没有收到主机 B 的 ACK 报文段,就重复发送 SYN 报文段,此时主机 B 收到了两个 SYN 报文段。
- 主机 B 回复 ACK 报文段后,主机 A 没有收到确认信息,会继续发送数据,此时主机 B 并不知道主机 A 是否准备好了数据传输
操作系统
进程有哪⼏种状态
![image-20230408213323628](https://i-blog.csdnimg.cn/blog_migrate/b516172df53ceb3ccc52eefd490b9f32.png)
进程最⼤的不同在于基本上各进程是独⽴的,进程是资源分配最小单位,线程是调度的最小单位
创建状态 (new) :进程正在被创建,尚未到就绪状态。
就绪状态 (ready) :进程已处于准备运⾏状态,即进程获得了除了处理器之外的⼀切所需资源,⼀旦得到处理器资源(处理器分配的时间⽚)即可运⾏。
运⾏状态 (running) :进程正在处理器上上运⾏(单核 CPU 下任意时刻只有⼀个进程处于运⾏状态)。
阻塞状态 (waiting) :⼜称为等待状态,进程正在等待某⼀事件⽽暂停运⾏如等待某资源为可⽤
或等待 IO 操作完成。即使处理器空闲,该进程也不能运⾏。
结束状态 (terminated) :进程正在从系统中消失。可能是进程正常结束或其他原因中断退出运
⾏。
![1680968687046.png](https://i-blog.csdnimg.cn/blog_migrate/11bc118446cd1089940e6678794ee666.png)
进程间的通信⽅式
1.管道/匿名管道(Pipes):
2.有名管道(Names Pipes):
3.信号(Signal):
4.消息队列(Message Queuing):
5.信号量(Semaphores):
6.共享内存(Shared memory):
7.套接字(Sockets):
线程间的同步的⽅式
-
互斥量 (Mutex):采⽤互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限。因为互斥对象只有⼀个,所以可以保证公共资源不会被多个线程同时访问。⽐如 Java 中的synchronized 关键词和各种 Lock 都这种机制。
-
信号量 (Semaphore) :它允许同⼀时刻多个线程访问同⼀资源,但是需要控制同⼀时刻访问此资源的最⼤线程数量。
-
事件 (Event) :Wait/Notify:通过通知操作的⽅式来保持多线程同步,还可以⽅便的实现多线程优先级的⽐操作
内核态
在Java中,通常使用系统调用来进行一些需要操作系统支持的操作,例如文件 I/O 和网络通信等。这些系统调用实际上是由内核态的线程来执行的,而用户态的线程则可以通过调用相关的 Java API 来触发这些系统调用。
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
FileInputStream fis = new FileInputStream("test.txt"); // 在用户态打开文件
byte[] buffer = new byte[1024];
int bytesRead = fis.read(buffer); // 用户态线程触发文件读操作,触发内核态线程执行实际的读操作
fis.close();
}
}
在这个示例中,从FileInputStream的构造函数开始到read()方法被调用,所有的操作都是在用户态下执行的。但是,当read()方法被调用时,实际的文件读操作需要依赖内核态线程来完成,因为它需要进行系统调用。所以,read()方法将导致线程从用户态切换到内核态。而在read()方法返回后,又会恢复到用户态。
这个示例中展示了用户态和内核态之间的概念,并通过文件 I/O 操作来说明了它们如何共同工作。
进程的调度算法
![image-20230408213617594](https://i-blog.csdnimg.cn/blog_migrate/542ce2e8a34a6d1df8c8ce0252480d2d.png)
死锁
多个进程/线程同时被阻塞,它们中的⼀个或者全部都在等待
四个条件
- 循环等待
- 请求与保持 一个进程因请求资源而阻塞时,对已获得的资源保持不放。
- 互斥 一个资源每次只能被一个进程使用。
- 不可剥夺 程已获得的资源,在末使用完之前,不能强行剥夺。
解决死锁的⽅法 预防,避免,检测和解除四种。
-
预防 是采⽤某种策略,限制并发进程对资源的请求,从⽽使得死锁的必要条件在系统执⾏的任何时间上都不满⾜。
-
避免则是系统在分配资源时,根据资源的使⽤情况提前做出预测,从⽽避免死锁的发⽣
-
检测是指系统设有专⻔的机构,当死锁发⽣时,该机构能够检测死锁的发⽣,并精确地确定与死锁有关的进程和资源。
-
解除 是与检测相配套的⼀种措施,⽤于将进程从死锁状态下解脱出来。
常⻅的⼏种内存管理机制
-
块式管理 : 远古时代的计算机操作系统的内存管理⽅式。将内存分为⼏个固定⼤⼩的块,每个块中只包含⼀个进程。如果程序运⾏需要内存的话,操作系统就分配给它⼀块,如果程序运⾏只需要很⼩的空间的话,分配的这块内存很⼤⼀部分⼏乎被浪费了。这些在每个块中未被利⽤的空间,我们称之为碎⽚。
-
⻚式管理 :把主存分为⼤⼩相等且固定的⼀⻚⼀⻚的形式,⻚⼩,相⽐于块式管理的划分度更⼩,提⾼了内存利⽤率,减少了碎⽚。⻚式管理通过⻚表对应逻辑地址和物理地址。
-
段式管理 : ⻚式管理虽然提⾼了内存利⽤率,但是⻚式管理其中的⻚并⽆任何实际意义。 段式管理把主存分为⼀段段的,段是有实际意义的,每个段定义了⼀组逻辑信息,例如,有主程序段MAIN、⼦程序段 X、数据段 D 及栈段 S 等。 段式管理通过段表对应逻辑地址和物理地址。
⻚是物理单位,段是逻辑单位。分⻚可以有效提⾼内存利⽤率,分段可以更好满⾜⽤户需求,段⻚式管理机制 。段⻚式管理机制结合了段式管理和⻚式管理的优点。简单来说段⻚式管理机制就是把主存先分成若⼲段,每个段⼜分成若⻚,也就是说 段⻚式管理机制 中段与段之间以及段的内部的都是离散的。
快表(Translation Lookaside Buffer,TLB)是一种硬件缓存,用于加速虚拟地址到物理地址的转换过程。在计算机中,当 CPU 访问内存时,需要先将虚拟地址转换成物理地址,这个过程需要通过页表来实现,页表将虚拟页号转换成物理页号。由于每次访问内存都需要进行这样的转换,如果每次都从主存中读取页表项,将会带来较大的延迟。
快表就是一种缓存页表项的机制,存储最近使用的页表项,以便在下一次访问同一虚拟页时,能够更快地获取到对应的物理页号。快表通常位于 CPU 的芯片中,具有较小的容量,但访问速度非常快,可以极大地提高页面访问的效率。
快表中存储的是虚拟页号和物理页号之间的映射关系,当 CPU 访问内存时,它首先查找快表,如果快表中存在对应的映射关系,则可以直接获取物理页号,否则需要访问主存中的页表来获取对应的物理页号。快表采用了类似于哈希表的机制来实现快速查询,通常配合着高速缓存使用,可以有效降低内存访问时的延迟。
局部性原理
- 时间局部性 :如果程序中的某条指令⼀旦执⾏,不久以后该指令可能再次执⾏;如果某数据被
访问过,不久以后该数据可能再次被访问。产⽣时间局部性的典型原因,是由于在程序中存在着
⼤量的循环操作。
- 空间局部性 :⼀旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即
程序在⼀段时间内所访问的地址,可能集中在⼀定的范围之内,这是因为指令通常是顺序存放、
顺序执⾏的,数据也⼀般是以向量、数组、表等形式簇聚存储的。
加密算法和摘要算法
都是常见的密码学算法,它们在保障信息安全方面发挥着重要作用。
- 加密算法
加密算法又称为密码算法,是一种能够将明文转换成密文的算法,用于保护通信过程中的数据安全。加密算法主要包括对称加密算法和非对称加密算法两种类型。
对称加密算法指的是加密和解密使用相同的密钥,其特点是加密速度快、运算效率高,但缺点是密钥容易泄露,从而导致信息被攻击者窃取。
非对称加密算法则采用了公钥和私钥的方式进行加密和解密,其中公钥可以公开发布,任何人可以使用这个公钥对信息进行加密,但只有拥有私钥的人才能够解密,从而保证了信息的安全性。非对称加密算法适合在通信过程中传输少量数据,并且需要保证通信双方的认证和数据的完整性。https
- 摘要算法
摘要算法又称为哈希算法,是一种用于生成消息摘要的算法,其主要作用是用来验证接收到的数据是否与原始数据完全一致。摘要算法通常将任意长度的消息转换成固定长度的摘要值,当数据受到篡改时,摘要值也会发生改变,因此可以用来验证数据的完整性。
摘要算法一般是单向函数,即不可逆的,也就是说摘要值无法还原成原始数据。常用的摘要算法有MD5和SHA-1等**,MD5**和SHA-1算法的输出结果均为一个128位或160位的字符串。由于现代计算机计算能力的提高,MD5和SHA-1算法容易受到暴力破解攻击,因此近年来更常用的摘要算法包括SHA-256和SHA-512等。
总之,加密算法和摘要算法在保障信息安全方面都扮演着重要角色,加密算法可以用于保障通信过程中数据的机密性,摘要算法则用于验证数据的完整性,避免数据被篡改。