
计算机基础学习笔记
计网
一、网络分层模型
OSI七层模型与TCP/IP4层模型
报文、数据报、数据包、帧的区别
数据的封装
二,IP:对数据包进行路由和寻址
IP报文
- 源ip/目的ip地址:如果有nat,会修改ip协议的源ip/目的ip地址,否则传输时一直不变
- IP分片/重组:通过标识字段与片偏移字段来实现
- tcp数据报一般不会被ip分片,tcp建立连接时会确认传输路径所有结点的ip包最大长度(MTU),保证不会被分片(如果存在有结点的MTU变小,则会返回icmp确认最小的MTU,避免分片)
- upd数据报过大就会被分片,只有第一个片段有udp头部
基本的IP协议
- ICMP:ip传输出错时(网络层错误,无需端口号),用于告知网络包传送过程中产生的错误以及各种控制信息(目标不可达、超时、路由重定向)
- NAT(Network Address Translation,网络地址转换)的作用:在不同网络之间转换 IP 地址
- ARP(Address Resolution Protocol,地址解析协议):将IP解析为MAC地址
数据包如何在网络中传输与定位:IP与MAC地址
- 基本网络设备
- 交换机:一般与子网内的所有计算机/路由器连接。维护MAC地址表,记录交换机的每个端口连接的计算机设备的MAC地址
- 路由器:路由器每个端口都有一个独立的MAC地址和IP地址,每个端口指向一个子网。维护路由表,映射ip地址对应哪个端口
- 计算机:每个计算机设备都有唯一的MAC地址,加入网络时,会分配一个ip地址与相应的子网掩码,并指定其默认网关(子网的路由器对应端口的ip)
- 数据包传输流程(MAC头部每到一个结点就需要重新封装,设定当前设备MAC为源MAC,下一个设备为目标MAC)
- 电脑封装完ip数据包后,通过子网掩码判断目标ip是否同一个子网
- 是则使用ARP协议获取MAC地址,并通过交换机传输到目标计算机
- 否则使用ARP协议获取默认网关的MAC地址,通过交换机传输给默认网关去转发
- 路由器的A端口收到数据包后,查询路由表确认从B端口转发出去,B端口需要更新数据包的目的MAC地址:与目标主机同一子网则获取其MAC,否则是默认网关的MAC
- 电脑封装完ip数据包后,通过子网掩码判断目标ip是否同一个子网
三,TCP/UDP
1. TCP 与 UDP 的区别
- TCP是否面向连接的,是可靠传输,是有状态的,UDP不是
- TCP传输的时候多了连接、确认、重传等机制,效率低
- TCP 是面向字节流的(将应用层报文以字节流划分为多个tcp段,每个段都有自己的tcp头部)
- UDP 是面向报文的(应用层报文只用一个upd头部修饰,分片交给ip)
2. TCP详解
TCP报文
- 源端口号/目标端口号:确保端到端传输,确定传输给目标主机哪个应用
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确认)
TCP 传输可靠性保障(校验和、重传机制、流量控制、拥塞控制)
- 流量控制(滑动窗口实现,控制发送方发送速率,保证接收方来得及接收)
- 拥塞控制:慢启动(指数递增)、拥塞避免(线性增长),流程如下:
- 发送方的窗口大小取决于:接收方允许的窗口和拥塞窗口
- 当拥塞窗口(CWND)达到或超过拥塞避免阈值(ssthresh) 时,cwnd改为ssthresh,TCP会从慢启动阶段转入拥塞避免阶段。
- 数据包超时说明发生网络拥塞(或者根据计算的RTT往返时延来判断),拥塞避免阈值会重新调整为当前拥塞窗口的一半(即减小),拥塞窗口重新设置为1,进入慢启动
- 发生三次重复 ACK,将 ssthresh和CWND调整为当前 CWND 的一半,进入拥塞避免阶段
- 重传机制
- 超时重传:发送的数据包同时会启动一个定时器,规定时间为收到相应ack,触发重传,每次重传间隔增大(指数退避),多次重传仍未收到ack则关闭连接
- 快速重传:收到多个重复ack(3个以上),则重传所需数据包
四、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 状态码
- 301,302:永久/临时重定向,会指明新url,由浏览器自动跳转
- 502:请求路径上存在服务器无法得到其上游服务器的有效响应,存在网络错误
- 503:服务器繁忙,当前无法响应
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 进程来回收孤儿进程的资源。
- 用户线程和守护线程
- 用户线程:只有所有用户线程结束,JVM才能终止(主线程main结束)
- 守护线程:不会阻止JVM结束
- JVM结束时守护线程会被强制终止,不推荐执行I/O任务,会导致无法正确关闭资源
- 守护线程一般用于后台支持任务,比如垃圾回收、释放未使用对象的内存等
二,死锁
死锁的四个必要条件
- 互斥:资源必须处于非共享模式,即一次只有一个进程可以使用。
- 占有并等待:一个进程至少应该占有一个资源,并等待另一资源,而该资源被其他进程所占有。
- 非抢占:资源不能被抢占。只能在持有资源的进程完成任务后,该资源才会被释放。
- 循环等待:进程对资源的等待形成一个环
死锁的预防
- 静态分配策略(破坏占有并等待):进程只有执行前能申请所有资源才执行
- 层次分配策略(破坏循环等待):资源分成多个层次,必须申请到低级资源才能申请高级资源,必须释放高级资源才能释放低级资源(单向性使得不存在循环等待,不会有高级资源申请低级资源的情况)
死锁的避免
- 将系统的状态分为 安全状态 和 不安全状态 ,在为申请者分配资源前先测试系统状态,若把系统资源分配给申请者会产生死锁,则拒绝分配,否则接受申请,并为它分配资源。(银行家算法)
死锁的检测:进程-资源分配图
死锁的解除
- 抢占资源:从涉及死锁的一个或几个进程中抢占资源,把夺得的资源再分配给涉及死锁的进程直至死锁解除。
- 逐个撤销涉及死锁的进程,回收其资源直至死锁解除。
三,内存管理
- 分段机制:每个申请内存的程序分配一个适合它大小的连续物理段,程序的虚拟地址通过段表映射到其分配的段上
- 缺点:容易产生外部内存碎片(明明内存够分配给进程,但是不存在足够大小的连续内存段)
- 分页机制:把物理内存分为连续等长的物理页(一般是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,移动方向上无请求,立即让磁头返回
五,Linux
常见命令
- chmod:指定文件权限(可以用ls -l [文件名] 命令来看到文件的权限)
- 使用10个字符标识权限
- 第一个字符声明文件类型:-普通文件,d目录,l链接,p命名管道文件等
- 第2-4,5-7,8-10个字符分别声明文件所有者权限(user),所属组权限(group),其他用户权限(others)
- rwx,分别表示可读,可写,可执行(不具备相应权限用-表示,如rw-表示具有读写权限)
- 也可以使用数字简写(r=4,w=2,x=1),比如chmod 777 file 使得所有用户对文件均具有读、写、执行权限
- 使用10个字符标识权限