前言

2024-04-22: v1.0 整理计算机网络和操作系统高频常问内容, 但是不知道是否适合于银行,需要完善

计算机网络

包含网络基础篇、应用层协议、传输层协议、网络层协议四个部分内容,需要注意的是网络基础篇包含的是除后面3节的所有内容,可以算是“其它”部分,其中应用层和传输层,尤其是传输层TCP考的较多。

网络基础

网络分层

应用层:应用与应用之间进行交换信息

运输层:通过运输层协议在应用程序端点之间传输应用层报文

网络层:将数据报(网络层分组)从一台主机移动到另外一台主机

链路层:将分组从一个节点移动到路径上的下一个节点

URL访问经典问题

Q:点击一个URL后发生的一系列动作?

A:

  1. 浏览器解析URL

  2. 有缓存:依次查浏览器缓存、系统缓存、hosts

    无缓存:通过DNS应用层协议对URL进行查询,依次是递归、迭代,依次是本地DNS服务器、根DNS服务器、顶级域DNS服务器、权威DDNS服务器

    通过上述解析可以得到URL对应的服务器IP地址

  3. HTTP协议

    构造HTTP请求报文发送到服务器,服务器接收报文检索请求对象,封装对象到HTTP响应报文

    ​ 构造TCP数据报与服务器进行连接

    ​ 发起TCP连接、三次握手、传输数据、四次分手

*web缓存器:代理服务器存在是特殊情况

cookie:

Cookie是存储在用户浏览器中的小块数据,用于跟踪用户的浏览器活动或保存用户的登录状态等信息。服务器通过设置响应头命令浏览器存储Cookie,之后每次浏览器向同一服务器发送请求时都会携带这些Cookie数据。这样,服务器可以识别来自同一浏览器的请求。Cookie通常有有效期限,过期后将自动删除。

session:

Session是服务器用来保存与用户会话相关的信息的方式。与Cookie存储在客户端不同,Session数据存储在服务器上。用户每次访问服务器时,服务器都会创建一个唯一的Session ID来标识这个会话,并可以选择通过Cookie将此ID发送给用户浏览器,以便跟踪连续的请求。Session适用于存储需要保密处理的信息,比如用户的购物车数据或身份验证状态,因为这些信息实际上并未发送到用户的浏览器。

应用层协议

HTTP

  • 基本概念

HTTP是超文本传输协议,定义了在互联网中两个网络实体之间传输的报文格式和进行报文交换的方式,传输的内容是超文本。

  • 状态码

补充:502、503

  • 常见字段

常见字段可以有是请求行中的GET\POST、Host、Connection、User-agent、Last-Modified等

Connection:可以设置为close或者keep-alive开启了 HTTP Keep-Alive 机制后, 连接就不会中断,而是保持连接。当客户端发送另一个请求时,它会使用同一个连接,一直持续到客户端或服务器端提出断开连接

  • cookie原理

cookie由4个组件构成:HTTP请求报文的cookie首部行、HTTP响应报文的cookie首部行、用户端系统保留一个浏览器管理的cookie文件、服务器端对应该cookie文件的后端数据库表项

  • 缓存技术

web缓存器,代表初始web服务器满足HTTP请求,其自身有自己的存储空间存储最近被请求过的对象副本。通过配置用户的浏览器,使得所有HTTP访问先指向这个web缓存器,当请求的对象存在缓存副本则返回该副本,若无,则代理这个请求,向目标发起请求再返回请求内容。

强制缓存:浏览器判断缓存没有过期,则直接使用浏览器的本地缓存

协商缓存:使用条件GET对请求的对象进行检查服务器上所请求的对象是否被修改了,修改则返回新的对象,若没有则返回空

  • GET & Post

GET 的语义是从服务器获取指定的资源

POST 的语义是根据请求负荷(报文body)对指定的资源做出处理

  • HTTP的各大版本情况 1.0、1.1、2.0

1.0(非持续连接):每个HTTP请求/响应经过单独的一个TCP连接进行传输

1.1(持续连接):所有请求和响应经过相同的TCP连接进行传输

2.0:头部压缩、并发传输、服务器主动推送资源(1系列都是只能从客户端开始)

  • HTTPs

引入了SSL/TLS协议,在后续讲述

DNS

传输层协议

TCP

  • 报文格式与字段详解

    序列号:报文段首字节的字节流编号

    确认号:期望收到的下一个字节的序号

    接收窗口(窗口大小):用于流量控制,告诉发送方自己接收窗口空余量

TCP 头格式

以上图来自于小林coding

  • 定义与解释

    1. 什么是TCP

      TCP 是面向连接的、可靠的、基于字节流的传输层通信协议

    2. 为何要TCP

      IP 层是「不可靠」的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性,而上层应用层同时有可能需要一种确保可靠性的服务

  • 三次握手

    • 过程

      SYN=1, seq =x c2s

      SYN=1,ACK=1,seq=y ,ack=x+1, s2c

      seq = x+1, ack = y+1 c2s

      tips:第三次握手是可以携带数据的,前两次握手是不可以携带数据

    • 为什么是三次而非四次或者两次

      • 三次握手才可以阻止重复历史连接的初始化(主要原因)
      • 三次握手才可以同步双方的初始序列号
      • 三次握手才可以避免资源浪费(历史连接导致冗余)
    • MTU与MSS

    • 三次握手报文某次丢失后果

      1、3次丢失后分别是c、s端重传

      2次丢失c与s 端均会重传

  • 四次挥手

    • 过程

      FIN=1,seq = u c2s

      seq = v ,ack=u+1 s2c

      FIN=1, seq = w , ack = u+1 s2c

      seq = u+1, ack = w+1 c2s

    • 为什么是四次

      客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据,服务端收到客户端的 FIN 报文时,先回一个 ACK 应答报文,而服务端可能还有数据需要处理和发送,等服务端不再发送数据时,才发送 FIN 报文给客户端来表示同意现在关闭连接。最后等待2MSL进入到关闭状态

    • 为什么TIME_WAIT状态等待时间是2MSL

      络中可能存在来自发送方的数据包,当这些发送方的数据包被接收方处理后又会向对方发送响应,所以一来一回需要等待 2 倍的时间;确保最后一个ACK报文被对方接收从而使其能够关闭,若对方有问题,本方也能收到重传报文,进而做出相应对策;同时等待2MSL时间也能保证本次连接传输过程中所有报文都自然消失,足够让这些数据包被丢弃,避免本次连接传输的数据包对后续的连接产生影响

  • 流量控制

    用于消除发送方使得接收方缓存溢出的可能性,是一个速度匹配服务,通过TCP报文中的窗口字段进行控制,使得发送发的发送速率与接收方接收读取速率相匹配

  • 拥塞控制

    避免向网路中注入太多流量导致网络拥塞所提出的策略,通过cwnd拥塞窗口控制,涉及到的有慢启动、拥塞避免、快恢复

  • 区别于UDP

    TCP UDP
    TCP 面向连接 UDP 无连接
    单对单 单对单、单对多
    保证可靠、有序、不丢失 不可靠、无序、可能丢失
    有拥塞控制和流量控制机制

网络层协议

操作系统

内存管理

  • 概念

虚拟内存技术:操作系统引入了虚拟内存,进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,将不同进程的虚拟地址和不同内存的物理地址映射起来.,然后再通过物理地址访问内存。

主要有两种虚拟技术:时(时间)分复用技术空(空间)分复用技术

虚拟内存:使用了空分复用技术,它将物理内存抽象为地址空间,每个进程都有各自的地址空间。地址空间的页被映射到物理内存,地址空间的页并不需要全部在物理内存中,当使用到一个没有在物理内存的页时,执行页面置换算法,将该页置换到内存中

多进程与多线程:多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占用处理器,每次只执行一小个时间片并快速切换。

  • 方法

    • 分段式

      在分段技术中,程序的地址空间被划分成不同长度的段,每个段对应于不同的功能或数据,操作系统根据程序的需要将段加载到主存或硬盘中。即通过(段号,段内偏移)这种虚拟对去查段表中段号对应的起始地址得到(起始地址,段内偏移)进行访存。

      分段式特点是要产生外部碎片,不产生内部碎片。

    • 分页式

      在分页技术中,主存和硬盘被划分成固定大小的页,操作系统将程序的地址空间也划分成同样大小的页,并根据需要将页从硬盘加载到主存中。即通过(页号,业内内偏移)这种虚拟对去查页表中的(虚拟页号,物理页号)得到物理页号进而再得到(物理页号,页内偏移)进行访存。

      产生内部碎片,不产生外部碎片。

    • 多级页式

    • 段页式

进程管理

  • 进程与线程

    • 状态切换

      1
      2
      3
      创建--->就绪<---------->运行--->终止
      | |
      +---<--阻塞---<--+
    • 通信方式
      管道、共享内存、消息队列、套接字、信号、信号量

    • 2者对比

      进程 线程 协程
      定义 资源分配和拥有的基本单位 程序执行的基本单位 用户态的轻量级线程,线程内部调度的基本单位
      切换情况 进程CPU环境(栈、寄存器、页表和文件句柄等)的保存以及新调度的进程CPU环境的设置 保存和设置程序计数器、少量寄存器和栈的内容 先将寄存器上下文和栈保存,等切换回来的时候再进行恢复
      切换者 操作系统 操作系统 用户
      切换过程 用户态->内核态->用户态 用户态->内核态->用户态 用户态(没有陷入内核)
      调用栈 内核栈 内核栈 用户栈
      拥有资源 CPU资源、内存资源、文件资源和句柄等 程序计数器、寄存器、栈和状态字 拥有自己的寄存器上下文和栈
      并发性 不同进程之间切换实现并发,各自占有CPU实现并行 一个进程内部的多个线程并发执行 同一时间只能执行一个协程,而其他协程处于休眠状态,适合对任务进行分时处理
      系统开销 切换虚拟地址空间,切换内核栈和硬件上下文,CPU高速缓存失效、页表切换,开销很大 切换时只需保存和设置少量寄存器内容,因此开销很小 直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快
      通信方面 进程间通信需要借助操作系统 线程间可以直接读写进程数据段(如全局变量)来进行通信 共享内存、消息队列
    • 调度:线程是调度的基本单位(PC,状态码,通用寄存器,线程栈及栈指针);进程是拥有资源的基本单位(打开文件,堆,静态区,代码段等)。

    • 并发性:一个进程内多个线程可以并发(最好和CPU核数相等);多个进程可以并发。

    • 拥有资源:线程不拥有系统资源,但一个进程的多个线程可以共享隶属进程的资源;进程是拥有资源的独立单位。

    • 系统开销:线程创建销毁只需要处理PC值,状态码,通用寄存器值,线程栈及栈指针即可

  • 解释
    互斥锁 线程会释放 CPU ,给其他线程
    自旋锁 线程会忙等待,直到它拿到锁
    读写锁
    乐观锁 先修改完共享资源,再验证这段时间内有没有发生冲突,如果没有其他线程在修改资源,那么操作完成,如果发现有其他线程已经修改过这个资源,就放弃本次操作
    悲观锁 认为多线程同时修改共享资源的概率比较高,于是很容易出现冲突,所以访问共享资源前,先要上锁

    被锁住的代码执行时间很短,就不应该用互斥锁,而应该选用自旋锁

调度算法

  • 内存页面置换算法

    算法 规则 优缺
    OPT 优先淘汰最长时间内不会被访问的页面 缺页率最小,性能最好;但无法实现
    FIFO 优先淘汰最先进入内存的页面 实现简单;但性能很差,可能出现Belady异常
    LRU 优先淘汰最近最久没访问的页面 性能很好;但需要硬件支持,算法开销大
    CLOCK (NRU) 循环扫描各页面 第一轮淘汰访问位=0的,并将扫描过的页面访问位改为1。若第-轮没选中,则进行第二轮扫描。 实现简单,算法开销小;但未考虑页面是否被修改过。
    改进型CLOCK (改进型NRU) 若用(访问位,修改位)的形式表述,则 第一轮:淘汰(0,0) 第二轮:淘汰(0,1),并将扫描过的页面访问位都置为0 第三轮:淘汰(1, 0) 第四轮:淘汰(1, 1) 算法开销较小,性能也不错
  • 进程调度算法

    算法 规则 优缺
    先来先服务 非抢占式的先来先服务 对长作业有利,适用于 CPU 繁忙型作业的系统,而不适用于 I/O 繁忙型作业的系统
    最短作业优先 优先选择运行时间最短作业进行 对长作业不利
    高响应比优先 按要求时间和等待时间计算优先权,不抢占
    时间片轮转 时间片设置长短的问题
    最高优先级 有事先设置的优先级,抢占式 导致低优先级的进程永远不会运行
    多级反馈队
  • 磁盘寻道算法

    算法 规则 优缺
    先来先服务 先来先服务 大量进程竞争使用磁盘,请求访问的磁道可能会很分散
    最短寻道时间优先 优先选择从当前磁头位置所需寻道时间最短的请求 存在某些请求的饥饿
    扫描算法 按一个方向移动,直到在那个方向上没有请求为止,然后改变方向 中间部分的磁道会比较占便宜,中间部分相比其他部分响应的频率会比较多
    循环扫描算法 只有磁头朝某个特定方向移动时,才处理磁道访问请求,而返回时直接快速移动至最靠边缘的磁道
    LOOK 磁头在移动到「最远的请求」位置,然后立即反向移动
    C-LOOK 磁头在每个方向上仅仅移动到最远的请求位置,然后立即反向移动,而不需要移动到磁盘的最始端或最末端,反向移动的途中不会响应请求

数据库

范式

1NF:每一列不可再分割,即某个属性(列)不能有多值或者属性(列)不可重复。【字段不可分】

2NF:非主属性非部分依赖于主关键字,即实体的属性完全依赖于主关键字。【有主键,非主键字段依赖于主键】

3NF:属性不依赖于其它非主属性,即非关键字字段不能相互依赖。【非主键字段不能相互依赖】

BCNF:每个属性都不传递依赖于主键

事务四大特性ACID

原子性:一个事务所有操作要么完成,要么不完成,不会结束在中间环节

一致性:数据库完整性约束没有被破坏

隔离性:允许多个并发事务同时对数据进行读写和修改,隔离保证多个事务之间操作不会导致数据不一致

持久性:事务执行完成对数据的修改是永久的

触发器&存储过程&函数

触发器:一种特殊的存储过程,主要是通过事件来触发而被执行的

存储过程:预编译的SQL语句,允许模块化设计,一次创建多次使用,效率高移植性差,能独立作为SQL语句执行

函数:不能独立作为SQL语句执行

视图

一种虚拟表或逻辑表,它是由一个SQL查询定义的。视图并不是实际存储数据的物理表,而是根据一个或多个实际表中的数据动态生成的结果集。

Q:对视图的数据修改会导致对表的修改吗?

A:可以,但是受到一些条件的限制,例如如果视图只显示了表中的某些字段,尤其是在插入数据时,如果没有提供表中所有不可为空的字段的值,则无法通过视图插入数据。

SQL语句辨析

  • drop、truncate、 delete区别

    drop直接删掉表(DML)。truncate(DLL)删除表中数据,再插入时自增长id又从1开始。delete(DLL)删除表中数据,可以加where字句。

    • 数据查询语言DQL
    • 数据操纵语言DML
    • 数据定义语言DDL
    • 数据控制语言DCL
  • 内连接、左外连接、右外连接、笛卡尔积(全连接)

    内:只连接匹配的行

    左:包含左边表的全部行(不管右边的表中是否存在与它们匹配的行),以及右边表中全部匹配的行

    右:包含右边表的全部行(不管左边的表中是否存在与它们匹配的行),以及左边表中全部匹配的行

    全:包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行

  • SQL 语句执行顺序

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT \\ 9
    DISTINCT column, \\ 10
    AGG_FUNC(column or exp),... \\ 6
    FROM L_T \\ 1
    JOIN R_T \\ 3
    ON L_T.col_name = R_T.col_name \\ 2
    WHERE constraint_exp \\ 4
    GROUP BY column \\ 5
    WITH CUBE|ROLLUP \\ 7
    HAVING constraint_exp \\ 8
    ORDER BY column ASC|DESC \\ 11

    FROM - ON - JOIN - WHERE - GROUP BY - AGG_FUNC(AVG, COUNT, … ) - WITH - HAVING - SELECT - DISTINCT - ORDER BY

  • like %和 _ 区别

    **%百分号通配符:**表示任何字符出现任意次数(可以是0次).

    **_下划线通配符:**表示只能匹配单个字符,不能多也不能少,就是一个字符

索引

数据库索引是一种数据结构,它可以提高数据检索速度,从而加快数据库操作。就像书的目录一样,索引帮助数据库管理系统(DBMS)避免扫描整个表来寻找数据

质量保证-测试

软件测试过程模型

单元测试-集成测试-系统测试-验收测试

详细设计-概要设计-需求分析-用户需求

单元测试

概念:

针对软件设计的最小单位 ─ 程序模块,进行正确性检验的测试工作。其目的在于发现各模块内部可能存在的各种差错

集成测试

概念:

集成测试就是将软件集成起来后进行测试。又称为子系统测试、组装测试、部件测 试等。

集成测试主要可以检查诸如两个模块单独运行正常,但集成起来运行可能出现问题 的情况。

集成测试是一种范围很广的测试,当向下细化时,就成为单元测试

主要方法:

自顶向下的集成方法 | 自底向上的集成方法

系统测试

概念:

从用户使用的角度来进行的测试,主要工作是将完成了集成测试的系统 放在真实的运行环境下进行测试,用于功能确认和验证。

主要内容:

功能性测试、性能测试、压力测试、恢复测试、安全测试等

功能性测试:验证所有功能

性能测试:验证是否达到要求的性能 LoadRunner、PerformanceRunner

压力测试:系统运行环境不正常乃至发生故障情况夏,系统可运行到何种程度 JMeter

2)黑盒测试:指忽略系统或组件的内部机制,仅关注于那些响应所选择的输入及相应执行条件的输出的测试形式,也称功能性测试。

白盒测试:

逻辑覆盖、控制流图覆盖

黑盒测试:

等价类划分方法

测试工具