Skip to content

Latest commit

 

History

History
249 lines (124 loc) · 13.7 KB

File metadata and controls

249 lines (124 loc) · 13.7 KB

计算机基础

计算机网络

传输层

四次挥手

  • 不携带数据的ACK不会超时重传

  • 为什么要进行三次握手?

    原因一:tcp是全双工可靠的传输协议,全双工意味着双方能够同时向对方发送数据,可靠意味着我发送的数据必须确认对方完整收到了。tcp是通过序列号来保证这两种性质的,三次握手就是互换序列号的一次过程

    1. A 发送同步信号SYN + A's Initial sequence number
    2. B 确认收到A的同步信号,并记录 A's ISN 到本地,命名 B's ACK sequence number
    3. B发送同步信号SYN + B's Initial sequence number
    4. A确认收到B的同步信号,并记录 B's ISN 到本地,命名 A's ACK sequence number
    • 很显然2和3 这两个步骤可以合并,**只需要三次握手,**可以提高连接的速度与效率。

    原因二:第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接

  • 三次握手的第三次握手发送ACK能携带数据吗?

    答:可以。第三次握手,在客户端发送完ACK报文后,就进入ESTABLISHED状态,当服务器收到这个,服务器变为ESTABLISHED状态,可以直接处理携带的数据。

  • 为什么TCP4次挥手时等待为2MSL?

    原因一:A发送完释放连接的应答并不知道B是否接到自己的ACK,所以有两种情况 1)如果B没有收到自己的ACK,会超时重传FIN,那么A再次接到重传的FIN,会再次发送ACK 2)如果B收到自己的ACK,也不会再发任何消息,包括ACK 无论是1还是2,A都需要等待,要取这两种情况等待时间的最大值,以应对最坏的情况发生,这个最坏情况是:去向ACK消息最大存活时间(MSL) + 来向FIN消息的最大存活时间(MSL), 这就是2MSL( Maximum Segment Life)。等待2MSL时间,A就可以放心地释放TCP占用的资源、端口号,此时可以使用该端口号连接任何服务器。

    **原因二:**等待一段时间是为了让本次连接持续时间内所产生的报文都从网络中消失,否则存活在网络里的老的TCP报文可能与新TCP连接报文产生冲突(比如连接同一个端口),为避免此种情况,需要耐心等待网络老的TCP连接的活跃报文全部消失,2MSL时间可以满足这个需求(尽管非常保守)

  • 为什么连接的时候是三次握手,关闭的时候却是四次握手?

    答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。


HTTP

  • 对称加密和非对称加密

    对称加密:加密和解密使用同一个秘钥,把密钥转发给需要发送数据的客户机,中途会被拦截(类似于把带锁的箱子和钥匙给别人,对方打开箱子放入数据,上锁后发送)

    • 优点:运算速度快
    • 缺点:无法安全的将密钥传输给通信方

    非对称加密:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥,公钥公开给任何人(类似于把锁和箱子给别人,对方打开箱子放入数据,上锁后发送)

    • 优点:可以更安全地将公开密钥传输给通信发送方
    • 缺点:运算速度慢
  • 使用对称加密和非对称加密的方式传送数据

    • 使用非对称密钥加密方式,传输对称密钥加密方式所需要的 Secret Key,从而保证安全性;
    • 获取到 Secret Key 后,再使用对称密钥加密方式进行通信,从而保证效率

    思想:锁上加锁

  • HTTP1.1新特性

    默认是长连接、支持流水线、支持同时打开多个 TCP 连接、支持虚拟主机、支持分块传输编码 新增状态码 100、新增缓存处理指令 max-age

  • Get和POST比较

    作用:GET 用于获取资源,而 POST 用于传输实体主体

    参数:GET 和 POST 的请求都能使用额外的参数,但是 GET 的参数是以查询字符串出现在 URL 中,而 POST 的参数存储在实体主体中。不能因为 POST 参数存储在实体主体中就认为它的安全性更高,因为照样可以通过一些抓包工具(Fiddler)查看

    安全:安全的 HTTP 方法不会改变服务器状态,也就是说它只是可读的。GET方法是安全的,而POST不是,因为 POST 的目的是传送实体主体内容

    • 安全的方法除了 GET 之外还有:HEAD、OPTIONS
    • 不安全的方法除了 POST 之外还有 PUT、DELETE

    幂等性:同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。所有的安全方法也都是幂等的。在正确实现条件下,GET,HEAD,PUT 和 DELETE 等方法都是幂等的,POST 方法不是

    可缓存:如果要对响应进行缓存,需要满足以下条件

    • 请求报文的 HTTP 方法本身是可缓存的,包括 GET 和 HEAD,但是 PUT 和 DELETE 不可缓存,POST 在多数情况下不可缓存的
    • 响应报文的状态码是可缓存的,包括:200, 203, 204, 206, 300, 301, 404, 405, 410, 414, and 501
    • 响应报文的 Cache-Control 首部字段没有指定不进行缓存

操作系统

进程线程

  • 操作系统?

    控制和管理计算机硬件与软件资源的,并合理的组织和调度计算机工作的程序

  • 什么是系统调度?

    在用户程序中调用操作系统提供的核心态级别的子功能,结合用户态和核心态区别回答,一般使用陷入(trap),按调用功能分为:设备管理、文件管理、进程控制、进程通信、内存管理,

  • 进程线程?

    进程:程序是静止的,进程是程序的一次执行过程,是系统资源分配的基本单位

    线程:轻量级进程,是CPU的执行单元,是独立调度的最小单位,只拥有一点必不可少的资源

    关系:一个进程中包含多个线程,线程之间共享进程的资源,进程之间是相互独立

    区别:资源、并发、切换、通信、

  • 进程通信的方式?

    同一台计算机的进程通信称为 IPC(Inter-process communication)

    • 信号量:信号量是一个计数器,用于多进程对共享数据的访问,解决同步相关的问题并避免竞争条件
    • 共享存储:多个进程可以访问同一块内存空间,需要使用信号量用来同步对共享存储的访问
    • 管道通信:管道是用于连接一个读进程和一个写进程以实现它们之间通信的一个共享文件,pipe文件
      • 匿名管道(Pipes) :用于具有亲缘关系的父子进程间或者兄弟进程之间的通信,只支持半双工通信
      • 命名管道(Names Pipes):以磁盘文件的方式存在,可以实现本机任意两个进程通信,遵循FIFO
    • 消息队列:消息的链表,具有特定的格式,存放在内存中并由消息队列标识符标识,对比管道:
      • 匿名管道存在于内存中的文件;命名管道存在于实际的磁盘介质或者文件系统;消息队列存放在内核中,只有在内核重启(操作系统重启)或者显示地删除一个消息队列时,该消息队列才被真正删除
      • 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收

    不同计算机之间的进程通信,需要通过网络,并遵守共同的协议,例如 HTTP

    • 套接字:与其它通信机制不同的是,它可用于不同机器间的进程通信
  • 临界资源?

    临界资源:一次允许一个进程使用的资源

    临界区:访问临界资源的代码,必须互斥的进行

    • 同步:多个进程先后执行关系
    • 互斥:多个进程在同一时刻只有一个进程能进入临界区
  • 线程间的同步的方式有哪些呢?

    信号量(Semphares) :是一个整型变量,可以对其执行 down 和 up 操作,也就是常见的 P 和 V 操作,

    • down 和 up 操作需要被设计成原语,不可分割,通常的做法是在执行这些操作的时候屏蔽中断
    • 如果信号量的取值只能为 0 或者 1,那么就成为了 互斥量(Mutex)

    管程:Java中的synchronized

内存管理

  • 操作系统的内存管理主要是做什么?

    操作系统的内存管理主要负责内存的分配与回收,地址转换也就是将逻辑地址转换成相应的物理地址

  • 内存管理有哪几种方式?

    连续分配管理方式:块式管理,将内存分为几个固定大小的块,每个块中只包含一个进程

    非连续分配管理方式:分页存储,分段存储,段页式管理

  • 分页机制和分段机制有哪些共同点和区别呢?

    共同点 :

    • 分页机制和分段机制都是为了提高内存利用率,较少内存碎片

      分页、段页式:内部碎片

    • 以两者都是离散分配内存的方式。但是,每个页和段中的内存是连续的

    不同点:

    • 分页对程序员是透明的,但是分段需要程序员显式划分每个段
    • 分页是一维地址空间,分段是二维地址空间
    • 页的大小是固定的,由操作系统决定;而段的大小不固定,取决于我们当前运行的程序
    • 分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护
  • 快表和多级页表

    快表:虚拟地址到物理地址的转换要快

    • CPU给出逻辑地址,地址转换后先去快表(高速缓存寄存器)中查询,如果有就直接读取物理地址
    • 如果没有就去访问主存中的页表,读出以后同时存入快表
    • 当快表填满,就按照淘汰策略淘汰旧的页表项

    多级页表:为了避免把全部页表一直放在内存中占用过多空间,特别是那些根本就不需要的页表就不需要保留在内存中

  • 什么是CPU寻址?

    现代处理器使用的是一种称为虚拟寻址(Virtual Addressing) 的寻址方式。使用虚拟寻址,CPU 将虚拟(逻辑)地址翻译成物理地址,这样才能访问到真实的物理内存。 实际上完成虚拟地址转换为物理地址转换的硬件是 CPU 中含有一个被称为内存管理单元(Memory Management Unit, MMU)的硬件

    虚拟地址空间好处:防止用户程序可以访问任意内存,寻址内存的每个字节,这样很容易破坏操作系统,造成操作系统崩溃

  • 局部性原理

    时间局部性 :如果程序中的某条指令一旦执行,不久以后该指令可能再次执行;如果某数据被访问过,不久以后该数据可能再次被访问。产生时间局部性的典型原因,是由于在程序中存在着大量的循环操作

    空间局部性 :一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也将被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围之内,这是因为指令通常是顺序存放、顺序执行的,数据也一般是以向量、数组、表等形式簇聚存储的

  • 虚拟存储器?

    虚拟存储器又叫做虚拟内存,都是 Virtual Memory 的翻译,属于同一个概念

    基于局部性原理,在程序装入时,可以将程序的一部分装入内存,而将其他部分留在外存,就可以启动程序执行;由于外存往往比内存大很多,所以我们运行的软件的内存大小实际上是可以比计算机系统实际的内存大小大的。在程序执行过程中,当所访问的信息不在内存时,由操作系统将所需要的部分调入内存,然后继续执行程序;另一方面,操作系统将内存中暂时不使用的内容换到外存上,从而腾出空间存放将要调入内存的信息。这样,计算机好像为用户提供了一个比实际内存大的多的存储器就是虚拟存储器

    因为这中存储器实际上不存在,只是系统提供了部分载入、请求调入和置换功能后,是对用户透明的

  • 虚拟内存技术的实现呢?

    请求分页存储管理、请求分段存储管理、请求段页式存储管理

    请求分页与分页存储管理的不同点:根本区别是是否将程序全部所需的全部地址空间都装入主存

    • 在载入程序的时候,只需要将程序的一部分装入内存,而将其他部分留在外存,然后程序就可以执行了

    • 缺页中断:如果需执行的指令或访问的数据尚未在内存(称为缺页或缺段),则由处理器通知操作系统将相应的页面或段调入到内存,然后继续执行程序;

    • 虚拟地址空间:逻辑地址到物理地址的变换