四大件知识
操作系统
死锁
是什么?
死锁:两个或两个以上的进程、线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们将无法推进下去
满足条件
- 互斥条件
资源同一时间只能被一个线程占有(比如锁)。 - 请求与保持
线程已经持有一个资源,又去请求别的资源,且不释放已有的。 - 不可剥夺
资源只能由持有者主动释放,别人不能强行抢走。 - 循环等待
线程 A 等 B,B 等 C,C 等 A,形成一个环形等待链。
解决方法
破坏 4 个条件中的任意一个即可
- 破坏循环等待(最常用、最实用)
所有线程统一按固定顺序获取锁
比如:永远先锁 A 再锁 B,不反过来。 - 破坏请求与保持
要么一次性申请所有需要的锁,要么一个都不申请。 - 破坏不可剥夺
允许抢占资源,超时放弃锁。 - 破坏互斥
用无锁编程、CAS、乐观锁等(不太常用)
进程与线程
是什么?
进程 = 正在运行的程序实例,是资源分配的基本单位。
- 一个运行中的程序,比如打开一个浏览器、一个微信
- 拥有独立的资源:内存空间、文件句柄、网络连接等
- 进程之间相互独立,不能直接访问对方内存
- 一个进程至少有一个线程(主线程)
- 创建 / 销毁开销大
线程 = 进程内部的执行路径,是 CPU 调度的基本单位。
- 进程内部的执行单元
- 同一个进程内的线程共享进程资源(内存、文件等)
- 线程之间切换快、创建销毁开销小
- 线程自己几乎不占资源,只占栈、程序计数器等少量执行上下文
虚拟内存
是什么?
- 每个进程都有一套独立的虚拟地址空间(比如 4GB)
- 程序访问的都是虚拟地址,不是真实物理内存地址
- 操作系统通过页表把虚拟地址 → 翻译成物理地址
作用
- 扩大内存空间
- 进程隔离,更安全
- 内存使用更高效
- 方便程序加载运行
关键机制
- 把虚拟内存和物理内存都切成固定大小的页(Page),通常 4KB
- 每个进程有一张页表,记录:虚拟页号 → 物理页号 / 是否在内存 / 是否在硬盘
- CPU 访问地址时,硬件(MMU)自动查页表翻译
缺页中断
- 要访问的页不在物理内存,在硬盘上
- CPU 触发缺页中断
- 操作系统把页从 swap 读回物理内存
- 更新页表,继续执行程序
虚拟内存是计算机中用于临时存储数据的一种技术,操作系统给每个进程提供的独立虚拟地址空间,通过页表映射到物理内存或硬盘交换区。
它可以扩大可用内存、实现进程地址隔离、提高内存利用率,并通过分页和缺页中断完成地址翻译和数据换入换出。
计算机网络
网络分层
OSI 七层模型
- 应用层:给应用用的协议(HTTP、FTP、DNS)
- 表示层:数据加密、压缩、格式转换
- 会话层:建立、管理、断开会话
- 传输层:端到端传输(TCP、UDP)
- 网络层:寻址路由(IP、ARP)
- 数据链路层:帧传输、MAC 地址(以太网)
- 物理层:光电信号、网线、接口
应 表 会 传 网 链 物
TCP/IP 模型
- 应用层
对应 OSI 上三层:HTTP、HTTPS、DNS、FTP - 传输层
TCP、UDP - 网络层
IP、ARP、ICMP - 网络接口层(链路层)
设备驱动、网卡、MAC、以太网
协议
定义
描述网络通信协议,定义网络通信的规则,两者交流的的规则
分类
TCP 协议
规定了:
- 怎么建立连接(三次握手)
- 怎么断开连接(四次挥手)
- 数据怎么编号
- 丢了怎么重传
- 怎么保证不乱序
可靠、有序、慢 → 网页、文件、接口
特点:面向连接、可靠、基于字节流,全双工通信,有流量控制和拥塞控制,适用于对数据准确性要求高的场景。
UDP 协议
规定了:
- 怎么打包数据
- 怎么加上目标端口
- 发出去就行,不保证到达
不可靠、快、实时 → 直播、游戏、DNS
特点:无连接、不可靠、面向数据报、开销小、速度极快,适用于对数据实时性要求高的场景。
HTTP 协议
规定了:
- 客户端怎么发请求(GET / POST)
- 服务端怎么回响应
- 头怎么写、内容怎么放
- 状态码代表什么
应用层协议,底层用 TCP → 网页、接口
访问网站过程
- 先做 DNS 解析,域名转 IP
- 进行 TCP 三次握手 建立连接
- HTTPS 则进行 TLS 握手 加密
- 浏览器发送 HTTP 请求报文
- 服务器返回 HTTP 响应(HTML 等资源)
- 浏览器解析渲染,并加载图片、JS、CSS 等额外资源请求
- 最后 TCP 四次挥手 断开连接
域名解析过程
浏览器先查自身缓存,再查系统缓存和 hosts,没有就请求本地 DNS。
本地 DNS 依次问根 DNS、顶级域 DNS、权威 DNS,拿到 IP 后缓存并返回。
tcp三次握手
- 客户端向服务器发送SYN包,请求建立连接。c 发生带着syn标志和随机序列号seq的报文到s,C 进入状态:SYN_SENT,等待服务器返回ACK包。
- 服务器收到c的SYN包,回复ACK包和SYN包,序列号seq也随机生成,确认号是收到的序列号+1,s进入状态:SYN_RCVD,等待客户端返回ACK包。
- 客户端收到s的ACK包,回复ACK包和SYN包,序列号seq是第一次的+1,确认号是收到的序列号+1,进入状态:ESTABLISHED,完成三次握手,开始通信。
丢失其中的一次会怎么样?
第一次握手 SYN 丢失:
S 完全收不到任何包,无感知
C 在 SYN_SENT 等待 ACK
超时后,内核自动重传 SYN(指数退避重发)
重传多次仍失败 → 连接超时,建立失败第2次握手 ACK 丢失:
C:还在 SYN_SENT,收不到 ACK → 超时重传 SYN
S:已经进入 SYN_RCVD,但收不到第三次握手
S 会超时重传 SYN+ACK
结果:
重传多次失败 → 两端都认为连接失败
服务端 SYN_RCVD 队列会占用一个位置,极端情况可能导致 SYN 洪水第3次握手 ACK 丢失:
C 已经认为连接建立成功,进入 ESTABLISHED
S 还在 SYN_RCVD,没收到 ACK,认为连接没建好
S 超时后重传 SYN+ACK
C 收到重复的 SYN+ACK,会重新发送 ACK
若 S 最终收到 ACK → 连接正常建立
若一直收不到 → S 放弃连接,C 还以为连着,c发包会触发 RST重置连接。
http详解
基础概念
HTTP(超文本传输协议,Hypertext Transfer Protocol)是一种用于从网络传输超文本到本地浏览器的传输协议。它定义了客户端与服务器之间请求和响应的格式。HTTP 工作在 TCP/IP 模型之上,通常使用端口 80,基于 TCP/IP 通信协议来传递数据。
HTTP 本身是不安全的,因为传输的数据未经加密,可能会被窃听或篡改,为了解决这个问题,引入了 HTTPS,即在 HTTP 上加入 SSL/TLS 协议,为数据传输提供了加密和身份验证。
HTTPS(超文本传输安全协议,Hypertext Transfer Protocol Secure)是 HTTP 的安全版本,它在 HTTP 下增加了 SSL/TLS 协议,提供了数据加密、完整性校验和身份验证。HTTPS 通常使用端口 443。
工作原理
HTTP 协议工作于客户端-服务端架构上。
工作过程:- 客户端发起请求:用户通过客户端(如浏览器)输入 URL,客户端向服务器发起一个 HTTP 请求。
- 服务器处理请求:服务器接收到请求后,根据请求的类型(如GET、POST等)和请求的资源,进行相应的处理。
- 服务器返回响应:服务器将处理结果包装成HTTP响应消息,发送回客户端。
- 客户端渲染页面:客户端接收到响应后,根据响应内容(如HTML、图片等)渲染页面,展示给用户。
- 无连接:HTTP 协议是一种无连接的协议。HTTP/1.0 中一次请求完成后立刻断开 TCP 连接;HTTP/1.1 通过
Keep‑Alive实现长连接复用,一条 TCP 连接可传输多次请求,但HTTP 本身依然是无连接的应用层协议,连接状态不由 HTTP 协议维护。 - 无状态(状态无保持):HTTP 协议是一种无状态的协议,服务器不会记忆客户端上一次请求产生的任何状态信息,每一条请求都是相互独立、互不感知的。如需保存登录、浏览记录等会话状态,需要借助 Cookie、Session、Token (JWT) 等额外技术实现。
- 支持缓存:HTTP 协议内置完整的缓存机制。客户端可对静态资源进行缓存;通过
Cache‑Control、Expires(强缓存)、Last‑Modified、ETag(协商缓存)控制缓存策略,减少重复请求、降低服务器压力、节省带宽并提升访问速度。 - 请求‑响应模式,服务器无法主动推送:通信采用一问一答模式,只能由客户端主动发起请求,服务器被动返回响应。原生 HTTP 无法由服务器主动向客户端推送消息;实时双向通信场景可采用 WebSocket、SSE 等技术方案扩展实现。
- 明文传输:默认 HTTP 为明文传输,请求与响应数据直接裸奔,存在被窃听、篡改、身份冒充的风险;安全传输可使用 HTTPS(HTTP+TLS/SSL)进行加密。
- 灵活可扩展:通过请求头、响应头可自由扩展功能;依靠
Content‑Type可以传输 HTML、JSON、图片、视频、文件等任意类型的数据资源。
HTTP 与 HTTPS的区别
- 加密:
- HTTP:明文传输,数据未经加密,可能会被窃听或篡改。
- HTTPS:在 HTTP 上增加了 SSL/TLS 协议,提供了数据加密、完整性校验和身份验证。
- 端口:
- HTTP:默认端口为 80。
- HTTPS:默认端口为 443。
- 安全性:
- HTTP:不安全,数据未经加密,可能会被窃听或篡改。
- HTTPS:安全,数据通过 SSL/TLS 加密传输,提供了数据加密、完整性校验和身份验证。
- 证书:
- HTTP:由于不加密数据,性能略高于HTTPS。
- HTTPS:由于需要进行加密和解密,可能会有一定的性能开销。
- 性能:
- HTTP:由于不加密数据,性能略高于HTTPS。
- HTTPS:由于需要进行加密和解密,可能会有一定的性能开销。
- 搜索引擎:
- HTTP:搜索引擎可能会对没有使用HTTPS的网站进行降权。
- HTTPS:搜索引擎会优先考虑 HTTPS 协议,因为 HTTPS 协议更安全、更符合搜索引擎的安全要求。
- 成本:
- HTTP:通常免费。
- HTTPS:需要购买SSL证书,可能会有一定的成本。
- 应用场景:
- HTTP:适用于静态资源传输,如图片、视频等。
- HTTPS:适用于需要加密传输的场景,如登录、支付等。
请求方法
- http/1.0
1996 年发布,短连接为默认模式,每一次 HTTP 请求都会新建一条 TCP 连接,请求完成立即断开。
支持的请求方法:
- get 获取资源
- post 提交数据
- head 请求资源的响应头信息。
缺点: - 每次请求都需要新建一条 TCP 连接,导致传输效率低。
- 服务器无法主动推送消息,只能由客户端主动发起请求。
- 缺少缓存机制,导致重复请求。
- http/1.1
1999 年发布,在 1.0 基础上扩展方法;默认开启长连接 keep‑alive;强制要求
Host请求头;支持管道化请求。
支持的请求方法:
- GET - 请求指定的资源。
- POST - 提交数据以处理请求。
- HEAD - 请求资源的响应头信息。
- PUT - 上传文件或者更新资源。
- DELETE - 删除指定的资源。
- OPTIONS - 请求获取服务器支持的请求方法。
- TRACE - 回显服务器收到的请求,主要用于诊断。
- CONNECT - 建立一个隧道用于代理服务器的通信,通常用于 HTTPS。
- http/2.0
请求方法语义完全继承 HTTP/1.1,没有新增请求方法;底层传输依然基于 TCP
但对协议进行了优化,提高了传输效率和速度。HTTP/2 也引入了新的特性,如多路复用、头部压缩和服务器推送等。 - http/3.0
HTTP/3 基于 QUIC 协议实现,继续使用 HTTP/2 的方法。HTTP/3 主要改进了传输层,使用 UDP 代替 TCP 以提高传输速度和可靠性。
消息结构
客户端请求消息客户端发送一个HTTP请求到服务器的请求消息包括以下格式:请求行(request line)、请求头部(header)、空行和请求数据四个部分组成,下图给出了请求报文的一般格式。
- 请求行(Request Line)
告诉服务器本次请求要做什么、访问哪个资源、使用哪个 HTTP 协议版本
格式:请求方法 请求URL HTTP版本
- 请求方法:GET、POST、PUT、DELETE 等。
- 请求URL :如
/index.html、api/data等。 - HTTP版本号:HTTP/1.0 或 HTTP/1.1。
请求行的格式示例:GET /index.html HTTP/1.1
- 请求头(Request Headers)
携带客户端附加信息,给服务器传递请求的附加条件
常见字段
Host:目标服务器域名 / IP(HTTP1.1 必须带此字段)User‑Agent:客户端浏览器、操作系统标识Accept:客户端可接收的数据类型Accept‑Encoding:客户端支持的压缩格式 (gzip/deflate)Content‑Type:请求体的数据类型(POST 提交 JSON、表单时使用)
- 空行:隔开请求行和请求头部。
必不可少! 代表请求头部结束,后面如果有内容就是请求体。
- 请求数据:根据请求方法,可能是表单数据、JSON 数据等。
- GET 请求:不包含请求体,所有数据都在 URL 中。
- POST 请求:包含请求体,用于提交表单数据、JSON 数据等。
客户端(get)请求示例:
GET /index.html HTTP/1.1 # 请求行
Host: www.example.com # 请求头
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Accept-Encoding: gzip, deflate
Connection: keep-alive
服务器响应消息客户端(post)请求示例:
POST /api/user/login HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: application/json,text/html,/;q=0.8
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: application/json; charset=UTF-8
Content-Length: 52
#空行
{“username”:”zhangsan”,”password”:”123456”} #请求体数据
HTTP 响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
- 状态行(Status Line):包含HTTP版本号、状态码、状态描述。
- http版本号:HTTP/1.0 或 HTTP/1.1。
- 状态码:200、404、500 等。
- 状态描述:OK、Not Found、Internal Server Error 等。
状态行的格式示例:HTTP/1.1 200 OK
- 响应头(Response Headers):作用:服务器返回的附加说明信息,描述响应体、服务器信息等。
Content‑Type:响应体的数据类型与编码,如text/html; charset=UTF‑8、application/jsonContent‑Length:响应体字节大小Date:服务器生成响应的时间Server:服务器软件信息Connection:连接方式keep‑alive(长连接) /close(短连接)
空行:隔开状态行和消息报头。
响应正文(Response Body):包含实际的响应数据,如HTML、图片、视频等。
服务器返回给客户端的真实数据;可以是 HTML、JSON、图片、文件、视频等资源。
服务器响应示例:
HTTP/1.1 200 OK
Date: Wed, 18 Apr 2024 12:00:00 GMT
Server: Apache/2.4.1 (Unix)
Last-Modified: Wed, 18 Apr 2024 11:00:00 GMT
Content-Length: 12345
Content-Type: text/html; charset=UTF-8
1 |
|


