
计算机基础学习笔记
计网
一、网络分层模型
OSI七层模型与TCP/IP4层模型
报文、数据报、数据包、帧的区别
二,IP、NAT、ARP
- IP的作用:定义数据包的格式、对数据包进行路由和寻址,以便它们可以跨网络传播并到达正确的目的地。
- NAT(Network Address Translation,网络地址转换)的作用:在不同网络之间转换 IP 地址。
- ARP(Address Resolution Protocol,地址解析协议):解决IP地址和MAC地址的转换
三,TCP/UDP
1. TCP 与 UDP 的区别
- TCP是否面向连接的,是可靠传输,是有状态的,UDP不是
- TCP传输的时候多了连接、确认、重传等机制,效率低
- TCP 是面向字节流的,UDP 是面向报文的。
2. TCP 三次握手和四次挥手
三次握手(三次确保对方能接受我的信息并回应。1,2步确认服务端可接收客户端消息;2,3步确认客户端可接受服务端消息)
- 一次握手:客户端发送带有 SYN(SEQ=x) 标志的数据包 -> 服务端,然后客户端进入 SYN_SEND 状态,等待服务端的确认;
- 二次握手:服务端发送带有 SYN+ACK(SEQ=y,ACK=x+1) 标志的数据包 –> 客户端,然后服务端进入 SYN_RECV 状态;
- 三次握手:客户端发送带有 ACK(ACK=y+1) 标志的数据包 –> 服务端,然后客户端和服务端都进入ESTABLISHED 状态,完成 TCP 三次握手。
四次挥手(TCP是全双工的,前2次挥手是说明客户端不会再有消息需要发送,后2次挥手是为了说明服务器不会再有消息发送)
- 第一次挥手:客户端发送一个 FIN(SEQ=x) 标志的数据包->服务端,用来关闭客户端到服务端的数据传送。然后客户端进入 FIN-WAIT-1 状态
- 第二次挥手:服务端发送一个 ACK (ACK=x+1)标志的数据包->客户端 。然后服务端进入 CLOSE-WAIT 状态,客户端进入 FIN-WAIT-2 状态。不发送SEQ,是因为服务端可能还有数据未传输完(只是客户端数据传输完了),所以第三次挥手再确认。
- 第三次挥手:服务端发送一个 FIN (SEQ=y)标志的数据包->客户端,请求关闭连接,然后服务端进入 LAST-ACK 状态(第二次先回复ack,处理完数据再说可以FIN)
- 第四次挥手:客户端发送 ACK (ACK=y+1)标志的数据包->服务端,然后客户端进入TIME-WAIT状态,服务端在收到 ACK (ACK=y+1)标志的数据包后进入 CLOSE 状态。此时如果客户端等待 2MSL 后依然没有收到回复,就证明服务端已正常关闭,随后客户端也可以关闭连接了。(客户端等待防止server为收到ack持续fin确认)
3. TCP 传输可靠性保障(校验和、重传机制、流量控制、拥塞控制)
- 流量控制(滑动窗口实现,控制发送方发送速率,保证接收方来得及接收)
- 拥塞控制:慢启动(指数递增)、拥塞避免(线性增长)
- 流程
- 发送方的窗口大小取决于:接收方允许的窗口和拥塞窗口
- 当拥塞窗口(CWND)达到或超过拥塞避免阈值(ssthresh) 时,cwnd改为ssthresh,TCP会从慢启动阶段转入拥塞避免阶段。
- 超时或发生网络拥塞时,拥塞避免阈值会重新调整为当前拥塞窗口的一半(即减小),拥塞窗口重新设置为1,进入慢启动
- 发生三次重复 ACK,将 ssthresh和CWND调整为当前 CWND 的一半,进入拥塞避免阶段
四、HTTP协议(无状态协议)
1. HTTP
HTTP版本迭代
- HTTP 1.0 为短连接,HTTP 1.1 支持长连接(TCP 协议的长连接)
- HTTP/2.0 在同一连接上可以同时传输多个请求和响应(多路复用)
HTTP1.1:默认使用长连接(客户端可以建立tcp连接池来利用tcp长连接的特性)
- 单个TCP连接在同一时刻只能处理一个http请求,任意两个 HTTP 请求从开始到结束的时间在同一个 TCP 连接里不能重叠。
- 在应用层方面存在队头阻塞问题:同一tcp下的http请求,队头阻塞,后面请求都需要等待
- 流水线(Pipelining)优化(默认不启用,实现复杂且效果不佳):在同一条长连接上发出连续的请求,无需等待响应。服务器需要按接收顺序依次处理请求,响应也必须按顺序返回。
- http1.1基于文本分割来解析,在遇到分隔符前不能停止解析,不适合划分成基本单位来实现多路复用
- 性能优化策略
- 通常采用连接复用(长连接)和同时建立多个TCP连接的方式提升性能。但浏览器对其访问的host域名可建立的TCP连接数有限制(6~8个)
- http的长连接长时间空闲一般会断开(长时间空闲浪费服务器资源)
- 域名分片(加速图片等大资源的获取速度):通过将内容拆分到多个子域来提高网页加载速度的技术,突破浏览器对同一域名host可以使用的tcp限制(从多个子域名获取资源,而这些子域名其实都指向同一台目标服务器,这样能并发使用更多tcp连接)
- 单个TCP连接在同一时刻只能处理一个http请求,任意两个 HTTP 请求从开始到结束的时间在同一个 TCP 连接里不能重叠。
HTTP2:基于https上实现。基于二进制帧(紧凑的二进制结构)来传输数据,不再是明文传输
基本概念
- 帧(frame):最小的数据单位,帧包含数据长度、流标识符、帧类型等信息。http请求报文被拆散成帧
- 消息(message):即http报文(一个请求/响应),消息由帧组成(由头部帧和数据帧组成)
- 流(stream):一次完整的请求-响应由对应的流id标识,即流是双向的(含有一对请求消息+响应消息)
- 流id严格递增,不可复用,具有唯一性,其流id对应了一次请求-响应
- 一般规定客户端发起的流id奇数,服务端发起的流id偶数,避免冲突
- 同一个流发送的帧要有顺序,接受端按照收到帧的顺序重新组装成消息(http报文)
多路复用(Multiplexing,一个TCP段可以存在多条流)
- 同个域名只需要一个 TCP 连接,使用一个连接并行发送多个请求和响应。
- 一个tcp段会包含多个stream,一个stream可能会分成非连续多次发送。
- 不同流的帧之间可以乱序发送,因为会按照各自的流id组装
- 请求优先级:每个流可以设定优先级
- 流量控制:设定每个流可以占用一个tcp段多少带宽(接收端通过WINDOW_UPDATE帧控制其对应流的流量窗口大小),基于每一跳进行,而非端到端的控制
- 服务端推送:服务端响应时也可以使用新流推送(预加载)资源给客户端(可被拒绝),减少请求响应次数
头部压缩(HPACK)
- 原因:http1.1只针对body进行压缩,而包含协议内容,cookie等字段的请求头,有很多内容重复却没有压缩
- HPACK 压缩算法
- 客户端和服务端共同维护了一份字典表,来跟踪和存储之前发送的键值对
- 每次发送数据时,相同的数据不再通过每次请求和响应发送;新数据/修改数据要么被追加到当前表的末尾,要么替换表中之前的值
禁用域名分片
- 破坏多路复用优势:分片强制使用多个连接,反而增加握手和头部冗余。
- 加剧头部压缩失效:多个子域名的请求需携带独立头部信息,无法充分复用HPACK字典。
缺点
- TCP层面的队头阻塞并没有彻底解决:“超时重传”机制,丢失的包必须重传确认,后面的TCP包必须等待
- 多路复用没有限制同时请求数,可能导致服务器压力上升
- 多路复用容易 Timeout: 大批量并行多个流,导致每个流的资源会被稀释,虽然它们开始时间相差更短,但却都可能超时
GET 和 POST 的区别
- GET 通常用于获取或查询资源,而 POST 通常用于创建或修改资源。
- GET 请求是幂等的,即多次重复执行不会改变资源的状态(该请求可以缓存,无副作用),而 POST 请求是不幂等的,即每次执行可能会产生不同的结果或影响资源的状态。
HTTP 状态码
2. HTTPS(使用 SSL/TLS 协议用作加密和安全认证)
- SSL原理
- 非对称加密:发送方有公匙用于加密,接收方有私匙用于解密。安全性高,但代价高。用于传输对称加密密匙
- 对称加密:通信双方共享唯一密钥 k,加解密算法已知,双方利用密钥 k 加密/解密。代价低,但保密性差。用于传输数据
- CA证书:有CA数字签名的服务器合法,其公匙可信,不会被伪造,CA使用CA私匙对服务器的公匙加密附在证书中,把证书颁发给服务器
- https传输原理
- 客户端先获取服务器证书,使用CA公匙验签后获取服务器公匙(私匙加密,公匙解密用于验签)
- 客户端生成对称加密密匙,用服务器公匙加密后发送给服务器(公匙加密,私匙解密,用于传输密匙)
- 服务器用服务器私匙解密,获取对称加密密匙,以后双方使用该密匙通讯
3. URL(Uniform Resource Locators,即统一资源定位器)
URL的组成结构
- 协议:URL的前缀采用了何种应用层协议:HTTP/HTTPS/FTP等
- 域名(DNS解析域名和ip地址的映射),端口, 资源路径
- 请求参数:采用键值对的形式key=value,每一个键值对使用&隔开
- 锚点:显示该网页页面的位置,锚点以#开头,且不会作为请求的一部分发送给服务端
从输入 URL 到页面展示的过程
- 在浏览器中输入指定网页的 URL
- 浏览器通过 DNS 协议,获取域名对应的 IP 地址
- 浏览器根据 IP 地址和端口号,向目标服务器发起一个 TCP 连接请求
- 浏览器在 TCP 连接上,向服务器发送一个 HTTP 请求报文,请求获取网页的内容
- 服务器收到 HTTP 请求报文后,处理请求,并返回 HTTP 响应报文给浏览器
- 浏览器收到 HTTP 响应报文后,解析响应体中的 HTML 代码,渲染网页的结构和样式,同时根据 HTML 中的其他资源的 URL(如图片、CSS、JS 等),再次发起 HTTP 请求,获取这些资源的内容,直到网页完全加载显示
- 浏览器在不需要和服务器通信时,可以主动关闭 TCP 连接,或者等待服务器的关闭请求。
操作系统
一,进程和线程
进程是资源分配的最小单位,线程是CPU调度的最小单位
进程间的通信方式
- 管道/匿名管道(Pipes) :半双工,用于具有亲缘关系的父子进程间或者兄弟进程之间的通信(消息在内核缓冲区)
- 有名管道(Named Pipes) : 严格遵循先进先出。有名管道以磁盘文件的方式存在,可以实现本机任意两个进程通信。
- 共享内存:需要依靠某种同步操作,如互斥锁和信号量等。可以说这是最有用的进程间通信方式。
进程的调度算法
- 先到先服务调度算法(FCFS,First Come, First Served)
- 短作业优先的调度算法(SJF,Shortest Job First)
- 时间片轮转调度算法(RR,Round-Robin)
- 优先级调度算法(Priority)
- 多级反馈队列调度算法(MFQ,Multi-level Feedback Queue)
僵尸进程和孤儿进程
- 子进程exit结束时,内核会释放该进程的所有资源,但其PCB依然存在于系统中。直到其父进程调用wait()才会被释放,以便让父进程得到子进程的状态信息。
- 僵尸进程:子进程终止,但父进程没有调用 wait()导致子进程的 PCB 依然存在于系统中,但无法被进一步使用。该子进程被称为“僵尸进程”。
- 孤儿进程:父进程终止,但子进程仍在运行,未被wait()回收。该子进程为“孤儿进程”。OS会将孤儿进程的父进程设置为 init 进程(进程号为 1),由 init 进程来回收孤儿进程的资源。
二,死锁
死锁的四个必要条件
- 互斥:资源必须处于非共享模式,即一次只有一个进程可以使用。
- 占有并等待:一个进程至少应该占有一个资源,并等待另一资源,而该资源被其他进程所占有。
- 非抢占:资源不能被抢占。只能在持有资源的进程完成任务后,该资源才会被释放。
- 循环等待:进程对资源的等待形成一个环
死锁的预防
- 静态分配策略(破坏占有并等待):进程只有执行前能申请所有资源才执行
- 层次分配策略(破坏循环等待):资源分成多个层次,必须申请到低级资源才能申请高级资源,必须释放高级资源才能释放低级资源(单向性使得不存在循环等待,不会有高级资源申请低级资源的情况)
死锁的避免
- 将系统的状态分为 安全状态 和 不安全状态 ,在为申请者分配资源前先测试系统状态,若把系统资源分配给申请者会产生死锁,则拒绝分配,否则接受申请,并为它分配资源。(银行家算法)
死锁的检测:进程-资源分配图
死锁的解除
- 抢占资源:从涉及死锁的一个或几个进程中抢占资源,把夺得的资源再分配给涉及死锁的进程直至死锁解除。
- 逐个撤销涉及死锁的进程,回收其资源直至死锁解除。
三,内存管理
- 分段机制:每个申请内存的程序分配一个适合它大小的连续物理段,程序的虚拟地址通过段表映射到其分配的段上
- 缺点:容易产生外部内存碎片(明明内存够分配给进程,但是不存在足够大小的连续内存段)
- 分页机制:把物理内存分为连续等长的物理页(一般是4KB),虚拟内存也被划分成页。内存页是管理的基本单位
- 多级页表的映射
- 局部性原理:大多数进程不会使用到所有页,只使用少部分,一开始就给1024张页表太亏,采用2级页表:永存第一级页表,需要才增加第二级页表
- 虚拟内存的地址的含义->[一级页表偏移量(10位),二级页表偏移量(10位),页内地址偏移量(12位)]
- 快表(TLB,Translation Lookaside Buffer):即缓存,避免使用多级页表查询
- 缺页中断(需要切换内核态,因为每个进程都可以保存一定数量的内存页而不是所有)
- 硬性页缺失(Hard Page Fault):如果访问页面不在内存,需要产生缺页中断,将该虚拟内存页映射的物理内存页(被置换到磁盘上了)拿到内存
- 软性页缺失(Soft Page Fault):物理内存中有对应的物理页,但虚拟页还未和物理页建立映射。
- 页面置换算法(减少缺页中断的产生)
最佳页面置换算法(OPT,Optimal)
先进先出页面置换算法(FIFO,First In First Out):存在BeLady现象:分配的页面数增多但缺页率反而提高
最近最久未使用页面置换算法(LRU ,Least Recently Used):记录页面上次访问时间
最少使用页面置换算法(LFU,Least Frequently Used) : 记录页面使用次数
- 多级页表的映射
- 段页机制:把物理内存先分成若干段,每个段又继续分成若干大小相等的页。
四,文件系统
硬链接和软链接:每个文件和目录都有一个唯一的索引节点(inode)号,用来标识该文件或目录。
- 硬链接(Hard Link,ln命令):不能跨文件系统,硬链接通过 inode 节点号建立连接,硬链接和源文件的 inode 节点号相同,两者对文件系统来说是完全平等的
- 软链接(Symbolic Link,ln -s命令):能跨文件系统,类似快捷方式,可指向空文件/目录
磁盘调度算法
- 先来先服务算法(First-Come First-Served,FCFS)
- 最短寻道时间优先算法(Shortest Seek Time First,SSTF):优先选择距离当前磁头位置最近的请求进行服务
- 扫描算法(SCAN):扫描到边界才转向
- 边扫描边观察算法(LOOK):改进SCAN,移动方向上无请求,立即改变磁头方向
- 循环扫描算法(Circular Scan,C-SCAN):只按照一个方向扫描
- 均衡循环扫描算法(C-LOOK):改进C-SCAN,移动方向上无请求,立即让磁头返回