文章目录

  • 操作系统
    • 进程管理
    • 内存管理
    • 用户编程接口
  • 网络
    • TCP/IP
    • RESTful架构风格
  • HTTP
  • HTTPS

操作系统

进程管理

  • 线程同步有哪些机制?
    现在流行的进程线程同步互斥的控制机制,其实是由最原始、最基本的四种方法(临界区、互斥量、信号量和事件)实现的
    (1)临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程访问共享资源,如果有多个线程试图访问共享资源,那么当有一个线程进入后,其他试图访问共享资源的线程将会被挂起,并一直等到进入临界区的线程离开,临界在被释放后,其他线程才可以抢占。
    (2)互斥量:为 协调对一个共享资源的单独访问而设计,只有拥有互斥量的线程才有权限去访问系统的公共资源,因为互斥量只有一个,所以能够保证资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。
    (3)信号量:为控制一个具有有限数量的用户资源而设计。它允许多个线程在同一个时刻去访问同一个资源,但一般需要限制同一个时刻访问此资源的最大线程数目。
    (4)事件:用来通知线程有一些事件已发生,从而启动后继任务开始。
  • 内核线程和用户线程的区别
      根据操作系统内核是否对线程可感知,可以把线程分成内核线程和用户线程。
      内核线程的建立和销毁都是由操作系统负责、通过系统调用完成的,操作系统在调度时,参考各进程内的线程运行情况作出调度决定。如果一个进程中没有就绪态的线程,那么这个进程也不会被调度占用CPU。和内核线程相对应的是用户线程,用户线程是指不需要内核支持而在用户程序中实现的线程,其不依赖于操作系统核心,用户进程利用线程库提供创建、同步、调度和管理线程的函数来控制用户线程。用户线程多见于一些历史悠久的操作系统,如UNIX操作系统,不需要用户态/核心态切换,速度快,操作系统内核不知道多线程的存在,因此一个线程阻塞将使得整个进程(包括它的所有线程)阻塞。由于这里的处理器时间片分配是以进程为基本单位的,所以每个线程执行的时间相对减少。为了操作系统中加入线程支持,采用了在用户空间增加运行库来实现线程,这些运行库被称为“线程包”,用户线程是不能被操作系统所感知的。
    引入用户线程有以下四个方面的优势:
    (1)可以在不支持线程的操作系统中实现
    (2)创建和销毁线程、线程切换等线程管理的代价比内核线程少得多
    (3)允许每个进程定制自己的调度算法,线程管理比较灵活
    (4)线程能够利用的表空间和堆栈空间比内核级线程多
    用户线程的缺点主要有以下两点:
    (1)同一进程中只能同时有一个线程在运行,如果有一个线程使用了系统调用而阻塞,那么整个进程都会被挂起
    (2)页面失效也会导致整个进程都会被挂起
    内核线程的优缺点与用户线程相反,因此操作系统可以使用混合的方式来实现线程

内存管理

  • 内存管理有哪几种方式?
    常见的内存管理方式有块式管理、页式管理、段式管理和段页式管理,最常用的是段页式管理
    (1)块式管理:把主存分为一大块一大块的,当所需的程序片段不在主存时就分配一块主存空间,把程序片段载入主存,就算所需的程序只有几个字节也只能把这一块分配给它,这样会造成很大的浪费,平均浪费了50%的内存空间,但是易于管理。
    (2)页式管理:用户程序的地址空间被划分成若干个固定大小的区域——页,相应地,内存空间也被划分为若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,从而实现了离散分配。这种方式的优点是页的大小是固定的,因此便于管理;缺点是页长与程序的逻辑大小没有任何关系。这就导致在某个时刻一个程序可能只有一部分在主存中,而另一部分则再辅存中。这不利于编程时的独立性,并给换入换出处理,存储保护和存储共享等操作造成麻烦。
    (3)段式管理:段是按照程序的自然分界划分的并且长度可以动态改变的区域。使用这种方式,程序员可以把子程序、操作数和不同类型的数据和函数划分到不同的段中。这种方式将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中可以不相邻接,也实现了离散分配。
      分页对程序员而言是不可见的,而分段通常对程序员而言是可见的,因而分段为组织程序和数据提供了方便,但是对程序员的要求也比较高。
      分段存储主要有如下优点:
      1)段的逻辑独立性不仅使其易于编译、管理、修改和保护,也便于多道程序共享
      2)段长可以根据需要动态改成,允许自由调度,以便有效利用主存空间
      3)方便分段分享,分段保护,动态链接,动态增长
      分段存储的缺点如下:
      1)段的大小不固定,存储管理比较麻烦
      2)会生成段内碎片,这会造成存储空间利用率降低。而且段式存储管理比页式存储管理需要更多的硬件支持
      3)方便分段分享,分段保护,动态链接,动态增长
    (4)段页式管理:结合页式管理和段式管理的优点,段页式存储组织是分段式和分页式结合的存储组织方式,优点如下:
      1)用分段方法来分配和管理虚拟存储器。程序的地址空间按逻辑单位分成基本独立的段,而每一段有自己的段名,再把每段分成固定大小的若干页
      2)用分页方法来分配和管理内存,即把整个主存分成与上述页大小相等的存储块,可装入工作的任一页。程序对内存的调入或调出是按页进行的,但它又可按段实现共享或保护。
  • 什么是虚拟内存?
      虚拟内存简称虚存,是计算机系统内存管理的一种技术。它是相对于物理内存而言的,可以理解为“假的”内存。它使得应用程序认为它拥有连续可用的内存(一个连续完整的地址空间),允许程序员编写并运行比实际系统拥有的内存大得多的程序,这使得许多大型软件项目能够在具有有限内存资源的系统上实现。而实际上,它通常被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。相比实存,虚存有以下好处:
      (1)扩大了地址空间。无论是段式虚存还是页式虚存,或者是段页式虚存,寻址空间都比实存大
      (2)内存保护。每个进程运行在各自的虚拟内存地址空间,互相不能干扰对方。另外,虚存还对特定的内存地址提供写保护,可以防止代码或数据被恶意篡改
      (3)公平分配内存。采用了虚存之后,每个进程都相当于有同样大小的虚存空间
      (4)当进程需要通信时,可采用虚存共享的方式实现
    不过,使用虚存也是有代价的,主要表现在以下几个方面的内容:
      (1)虚存的管理需要建立很多数据结构,这些数据结构要占用额外的内存
      (2)虚拟地址到物理地址的转换,增加了指令的执行时间
      (3)页面的换入换出需要磁盘I/O,很耗时间
      (4)如果一页中只有一部分数据,会浪费内存
  • 什么是内存碎片?什么是内碎片?什么是外碎片?
      内存碎片是由于多次进行内存分配造成的,当进行内存分配时,内存格式一般为:(用户使用段)(空白段)(用户使用段),当空白段很小的时候可能不能提供给用户足够多的空间,比如夹在中间的空白段大小为5,而用户需要的内存大小为6,这样会产生很多的间隙造成使用效率的下降,这些很小的空隙称为碎片。
      内碎片:分配给程序的存储空间没有用完,有一部分是程序不使用,但其他程序也没法用的空间。内碎片是处于区域内部或页面内部的存储块,占用这些区域或页面的进程并不使用这个存储块,而在进程占有这块存储块时,系统无法利用它,直到进程释放它,或进程结束,系统才有可能利用这个存储块。
      外碎片:由于空间太小,小到无法给任何程序分配(不属于任何进程)的存储空间。外部碎片是处于任何已分配区域或页面外部的空闲存储块,这些存储块的总和可以满足当前申请的长度要求,但是由于他们的地址不连续或者其他原因,使得系统无法满足当前申请。
      内外碎片是一对矛盾体,一种特定的内存分配算法,很难同时解决好内碎片和外碎片的问题,只能根据应用特点进行取舍。
  • 虚拟地址、逻辑地址、线性地址、物理地址有什么区别?
      虚拟地址是指由程序产生的由段选择符和段内偏移地址组成的地址。这两部分组成的地址并没有直接访问物理内存,而是要通过分段地址的变换处理后才会对应到相应的物理内存地址。
      逻辑地址是指由程序产生的段内偏移地址,有时直接把逻辑地址当成虚拟地址,两者并没有明确的界限。
      线性地址是指虚拟地址到物理地址变换之间的中间层,是处理器可寻址的内存空间(称为线性地址空间)中的地址。程序代码会产生逻辑地址/段内偏移地址,加上相应段基址就生成了一个线性地址。如果启用了分页机制,那么线性地址可以再经过变换产生物理地址。若是没有采用分页机制,那么线性地址就是物理地址。物理地址是指现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。
      虚拟地址到物理地址的转换方法是与体系结构相关的,一般有分段与分页两种方式。内存管理单元负责从虚拟地址到物理地址的转换。逻辑地址是段标识+段内偏移量的形式,MMU通过查询段表,可以把逻辑地址转化为线性地址。如果CPU没有开启分页功能,那么线性地址就是物理地址;如果CPU开启了分页功能,MMU还需要查询页表来将线性地址转化为物理地址:逻辑地址(段表)–>线性地址(页表)–>物理地址。
      映射是一种多对一的关系,即不同的逻辑地址可以映射到同一个线性地址上;不同的线性地址也可以映射到同一个物理地址上。而且,同一个线性地址在发生换页以后,也可能被重新装载到另一个物理地址上,所以这种多对一的映射关系也会随时间发生变化。
  • Cache替换算法有哪些?
      数据可以存放在CPU或者内存中,CPU处理快,但是容量少;内存容量大,但是转交给CPU处理的速度慢。为此,需要Cache(缓存)来做一个这种。最有可能的数据先从内存调入Cache,CPU再从Cache读取数据,这样会快很多。然而Cache中所存放的数据不是50%有用的。CPU从Cache中读取到有用的数据称为“命中”。
      由于主存中的块比Cache中的块多,所以当要从主存中调一个块到Cache中时,会出现该块所映射到的一组(或一个)Cache块已经全部被占用的情况。此时,需要被迫腾出其中的某一块,以接纳新调入的块,这就是替换。
      Cache替换算法有RAND算法、FIFO算法、LRU算法、OPT算法和LFU算法。
      (1)随机(RAND)算法:随机算法就是用随机数发生器产生一个要替换的块号,将该块替换出去,此算法简单、易于实现,而且不考虑Cache块过去、现在及将来的使用情况。但是由于没有利用上层存储器使用的“历史信息”、没有根据访存的局部性原理,故不能提高Cache的命中率,命中率较低。
      (2)先进先出(FIFO)算法:将最先进入Cache的信息块替换出去。FIFO算法按调入Cache的先后决定淘汰的顺序,选择最早调入Cache的字块进行替换,它不需要记录各字块的使用情况,比较容易实现,系统开销小,利用了主存的“历史信息”,其缺点是可能把一些需要经常使用的程序块(如循环程序)也作为最早进入Cache的块替换掉,不能正确反映程序局部性的原理,故不能提高Cache的命中率。例如Solar-16/65机Cache采用组相连方式,每组4块,每块都设定一个两位的计数器,当某块被装入会被替换的计数器清为0,而同组的其他各块的计数器均加1,当需要替换时就选择计数值最大的块被替换掉。
      (3)近期最少使用(LRU)算法:依据各块使用的情况,将近期最少使用的Cache中的信息块替换出去。能比较好地反映了程序局部性规律,但这种替换方法需要随时记录Cache中各块的使用情况,以便确定哪个块是近期最少使用的块。LRU算法相对合理,但实现起来比较复杂,系统开销较大。通常需要对每一块设置一个计数器的硬件或软件模块,以便记录其被使用情况。
      实现LRU策略的方法有多种,如计数器法、寄存器栈法及硬件逻辑比较法等,下面简单介绍计数器的设计思路。
      计数器方法:缓存的每一块都设置一个计数器。计数器的操作规则如下:
      1)被调入或者被替换的块,其计数器清“0”,其他计数器加“1”
      2)当访问命中时,所有块的计数值与命中块的计数值进行比较,如果计数值小于命中块的计数值,则该块的计数值加“1”;如果块的计数值大于命中块的计数值,则数值不变,最后将命中块的计数器清“0”
      3)需要替换时,选择计数值最大的块被替换
      (4)最优替换(OPT)算法:必须先执行一次程序,统计Cache的替换情况,在第二次执行该程序时便可以用最有效的方式来替换,以达到最优的目的。最好的算法应该是选择将来最久不被访问的页面作为替换的页面,这种替换算法的命中率一定是最高的,它就是最优替换算法。
      要实现OPT算法,唯一的办法是让程序先执行一遍,记录下实际的页地址的使用情况。根据这个页地址的使用情况才能找出当前要被替换的页面。显然,这样做是不现实的。因此,OPT算法只是一种理想化的算法,然而它也是一种很有用的算法。实际上,经常把这种算法用来作为评价其他页面替换算法好坏的标准。在其他条件相同的情况下,哪一种页面替换算法的命中率与OPT算法最接近,那么它就是一种比较好的页面替换算法。
      (5)最不经常使用淘汰(LFU)算法:将淘汰一段时间内,使用次数最少的页面。到目前为止最少使用的页面,很可能也是将来最少访问的页面。该算法既充分利用了主存中页面调度情况的历史信息,又正确反映了程序的局部性。但是,这种算法实现起来非常困难,它要为每个页面设置一个很长的计数器,并且要选择一个固定的时钟为每个计数器定时计数。在选择被替换页面时,要从所有计数器中找出一个计数值最大的计数器。

用户编程接口

  • 库函数调用和系统调用有什么不同?
      库函数是语言或应用程序的一部分,它是高层的、完全运行在用户空间、为程序员提供调用真正的在幕后完成实际事务的系统调用接口。而系统函数是内核提供给应用程序的接口,属于系统的一部分。
      库函数调用与系统调用的区别见下表:
库函数调用 系统调用
在所有的ANSI C编译器版本中,C语言库函数是相同的 各个操作系统的系统调用是不同的
它调用函数库中的一段程序/函数 调用系统内核的服务
与用户程序相联系 是操作系统的一个入口点
在用户地址空间执行 在内核地址空间执行
运行时间属于“用户时间” 运行时间属于“系统时间”
属于过程调用,调用开销较小 需要在用户空间和内核上下文环境间切换,开销较大
在C函数库libc中大约有300个函数 在UNIX中大约有90个系统调用
典型的C函数库调用:system、fprintf和malloc等 典型的系统调用:chdir、fork、write和brk等

库函数调用通常比行内展开的代码慢,因为它需要付出函数调用的开销。但系统调用比库函数调用还要慢很多,因为它需要把上下文环境切换到内核环境。

  • 静态链接与动态链接有什么区别?
      静态链接是指把要调用的函数或者过程直接链接到可执行文件中,成为可执行文件的一部分,即函数和过程的代码就在程序的.exe文件中,该文件包含了运行时所需的全部代码。静态链接的缺点是当多个程序都调用相同函数时,内存就会存在这个函数的多个拷贝,浪费了内存资源。
      动态链接是相对于静态链接而言的,动态链接所调用的函数代码并没有被复制到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序与相应的动态链接库(Dynamic Link Library ,DLL)之间建立链接关系。当要执行所调用的.dll文件中的函数时,根据链接产生的重定位信息,操作系统才转去执行.dll文件中的相应函数代码。
      静态链接的执行程序能够在其他同类操作系统的机器上直接运行。而动态链接的执行程序则不可以,除非把该.exe文件所需的dll文件都一并复制过去,或者对方机器上也有所需的相同版本的.dll文件,否则是不能保证正常运行的。
  • 静态链接库与动态链接库有什么区别?
      静态链接库就是使用的.lib文件,库中的代码最后需要链接到可执行文件中去,所以静态链接的可执行文件一般比较大一些。
      动态链接库是一个包含可由多个程序同时使用的代码和数据的库,它包含函数和数据的模块的集合。程序文件(如.exe文件或.dll文件)在运行时加载这些模块,也是所需的模块映射到调用进程的地址空间。
      静态链接库和动态链接库的相同点是它们都实现了代码的共享,不同点是静态链接库.lib文件中的代码被包含在调用的.exe文件中,该.lib文件中不能再包含其他动态链接库或者静态链接库了。而动态链接库.dll文件可以被调用的.exe动态地“引用”和“卸载”,该.dll文件中可以包含其他动态链接库或者静态链接库。
  • 用户态和核心态有什么区别?
      核心态与用户态是操作系统的两种运行级别,用于区分不同程序的不同权利。核心态就是拥有资源多或访问资源多的状态,也称为特权态。相对而言,用户态就是非特权态,在此种状态下访问的资源将受到限制。如果一个程序运行在特权态,则该程序就可以访问计算机的任何资源,资源访问权限不受限制。如果一个程序运行在用户态,其资源需求将受到各种限制。例如,如果要访问操作系统的内核数据结构,如进程表,则需要在特权态下才能办到。如果要访问用户程序里的数据,则在用户态下就可以了。
      Intel CPU提供Ring0~Ring3四种级别的运行模式,Ring0级别最高,Ring3最低。
      用户态:Ring3运行于用户态的代码则要受到处理器的诸多检查,只能访问映射其地址空间的页表项中规定的在用户态下可访问页面的虚拟地址,且只能对任务状态段(TTS)中I/O许可位图(I/O Permission Bitmap)中规定的可访问端口进行直接访问。
      核心态:Ring0在处理器的存储保护中,核心态或者特权态是操作系统内核所运行的模式。运行在该模式的代码,可以无限制地对系统存储、外部设备进行访问。
      当一个任务/进程执行系统调用而陷入内核代码中执行时,就称进程处于内核运行态(简称内核态)。此时处理器处于特权级最高的(0级)内核代码中运行。当进程处于内核态时,执行的内核代码会使用当前进程的内核态。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(简称用户态),此时处理器在特权级最低的(3级)用户代码中运行。
      在核心态下CPU可执行任何指令,在用户态下CPU只能执行非特权指令。当CPU处于核心态时,可以随意进入用户态;而当CPU处于用户态时,用户从用户态切换到核心态只有在系统调用和中断两种情况下发生。一般程序一开始都是运行于用户态,当程序需要使用系统资源时,就必须通过调用软中断进入核心态。
      核心态和用户态各有优势:运行在核心态的程序可以访问的资源多,但可靠性、安全性要求高,维护管理都比较复杂;用户态程序访问的资源受限,但可靠性、安全性要求低,自然编写维护起来都较简单。一个程序到底应该运行在用户态还是核心态取决于其对资源和效率的需求。
      什么样的功能应该在核心态下实现?
      (1)CPU和内存的管理:保障计算机安全的角度
      (2)诊断与测试程序:需要访问计算机的所有资源
      (3)输入输出管理:要访问各种设备和底层数据结构
      (4)文件系统:可以一部分放在用户态,一部分放在核心态。文件系统本身的管理,即文件系统的宏数据部分的管理,必须放在核心态,不然任何人都可能破坏文件系统的结构;而用户数据的管理,可以放在用户态。编辑器、网络管理的部分功能、编辑器用户程序,都可以放在用户态下执行。
  • 用户栈和核心栈有什么区别?
      内核在创建进程的时候,在创建task_struct的同时,会为进程创建相应的堆栈。每个进程会有两个栈:用户栈(存在于用户空间),内核栈(存在于内核空间)。当进程在用户空间运行时,CPU堆栈指针寄存器里面的内容就是用户堆栈地址,使用用户栈;当进程在内核空间时,CPU堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。
      当进程因为中断或者系统调用而从用户态转为内核态时,进程所使用的堆栈也要从用户栈转到内核栈。进程陷入内核态后,先把用户态堆栈的地址保存在内核栈之中,然后设置堆栈指针寄存器的内容为内核栈的地址,这样就完成了用户栈向内核栈的转换;当进程从内核态恢复到用户态时,把内核栈中保存的用户态的堆栈的地址恢复到堆栈指针寄存器即可。这样就实现了内核栈和用户栈的互转。
      当从内核态转到用户态时,由于用户栈的地址是在陷入内核的时候保存在内核栈里面,可以很容易地找到这个地址;但是在陷入内核的时候,即进程从用户态转到内核态时,进程的内核总是空的。这是因为当进程在用户态运行时,使用的是用户栈,当进程陷入内核态时,内核栈保存进程在内核态运行的相关信息,但是一旦进程返回到用户态后,内核栈中保存的信息无效,会全部恢复,因为每次进程从用户态陷入内核的时候得到的内核栈都是空的。

网络

TCP/IP

  • 什么是IP地址?
      互联网协议地址,为网络中每台主机分配一个数字标签,应用在OSI参考模型中的网络层,保证通信的正常,有IPv4和IPv6。在IP地址后面常会带一组以255开头的数字,称为子网掩码,用来标识IP地址所在的子网。如送快递,IP地址就相当于门牌号,子网掩码相当于省市区街道。

RESTful架构风格

REST是表述性状态转移,“表述性”指的是“资源”的“表述性”,最后在体会状态转移。
  (1)资源:REST是面向资源的,资源是网络上的一个实体,只要是具体信息,就可以是资源,每个资源必须有URL,通过URL来找到资源。
  (2)表述:资源在某个特定时刻的状态说明,由数据和描述数据的元数据(例如HTTP报文)组成。资源的表述有多种格式,即MIME类型。一个资源也可以有多种表述,例如服务器响应一个请求,返回的资源可以使JSON格式/XML格式的数据等。
  (3)表述性状态转移:通过转移和控制资源的表述来实现操作资源的目的。例如,客户端可以向服务器发送GET请求,服务器将资源的表述转移到客户端;客户端也可以向服务器发送POST请求,传递表述改变服务器中的资源状态。

  • 什么是RESTful API?
      Restful API是指符合REST设计风格的Web API。为了使得接口安全、易用、可维护以及可扩展,一般设计Restful API需要考虑以下几个方面:
      (1)通信用HTTPS协议
      (2)在URL中加入版本号,如“v1/animals”
      (3)URL中的路径不能有动词,都用名词
      (4)用HTTP方法对资源进行增删改查的操作
      (5)用HTTP状态码传达执行结果和失败的原因
      (6)为集合提供过滤,排序,分页等功能
      (7)用查询字符串或HTTP首部Accept进行内容写上,指定返回结果的数据格式
      (8)及时更新文档,每个接口都有对应的说明

HTTP

  • URI和URL
      URI :统一资源标识符,用于标识某个互联网资源,由熟悉的URL和陌生的URN构成
      URL:统一资源定位符,俗称网址,是网络资源的标准化名称,应用程序通过URL定位资源所在位置
      URN:统一资源名称,是URI过去的名字,用于在特定的命名空间中标识资源
  • HTTP的特征
      (1)持久链接:在HTTP早期版本中,一次HTTP通信完成后就会断开链接,下一次再重新链接,当请求资源多时,会造成巨大的通信开销。因此提出了持久链接,只要通信两端的任意一端没有明确提出断开,就保持连接状态,以便下一次通信复用该链接,避免了重复建立和断开连接所造成的开销,加速了页面呈现。
      (2)管道化:在建立持久连接上的进一步性能优化。过去请求必须按照先进先出的队列顺序,即发送请求后,要等待并接收到响应,才能再继续下一个请求。启用管道化后,就会将队列顺序迁移到服务器,这样就能同时发送多个请求,然后服务器再按顺序一个一个地响应。
      (3)状态管理:HTTP是一种无状态协议,请求和响应一一对应,不会出现两个请求复用一个响应的情况,每个请求都是独立的,即使在同一条连接中,请求之间也没有联系。为了能管理状态,引入了Cookie技术,Cookie技术能让请求和响应的报文都附加Cookie信息,客户端将Cookie值发送出去,服务器接收并处理这个值,最终能得到客户端的状态信息。

HTTPS

  • HTTP不安全的原因
    (1)数据以明文传递,有被窃听的风险
    (2)接收到的报文无法证明是发送时的报文,不能保障完整性,因此报文有被篡改的风险
    (3)不验证通信两端的身份,请求或响应有被伪造的风险
  • 数字签名
      数字签名是一段由发送者生成的特殊加密校验码,用于确定报文的完整性。数字签名的生成设计两种技术:非对称加密和数字摘要。数字摘要可以将变长的报文提取为定长的摘要,报文内容不同,提取出的摘要也不同,常用的摘要算法有MD5和SHA。签名和校验的过程总共分为以下五步。
      (1)发送方用摘要算法对报文进行提取,生成了一段摘要
      (2)用私钥对摘要进行加密,加密后的摘要作为数字签名附加在报文上,一起发送给接送方
      (3)接送方收到报文后,用同样的摘要算法提取出摘要
      (4)用接收到的公钥对报文中的数字签名进行解密
      (5)如果两个摘要相同,则证明报文没有被篡改
  • 数字证书
      数字证书相当于网络上的身份证,用于身份识别。证书的内容包含有效期、颁发机构、颁发机构的签名、证书所有者的名称、证书所有者的公开密钥、版本号和唯一序列号等信息。
      一般数字证书都会被安装在服务器处,当客户端发起安全请求时,服务器就会返回数字证书。客户端从受信机构列表中找到相应的公开密钥,解开数字证书。然后验证数字证书中的信息,如果验证通过,就说明请求来自意料之中的服务器;如果不通过,就说明证书被冒用,来源可疑,客户端立刻发出警告。
  • 安全通信机制
      客户端和服务器通过以下几个步骤建立起安全连接。
      (1)客户端发送Client Hello报文开始SSL通信,报文中还包括协议版本号、加密算法等信息
      (2)服务器发送Server Hello报文作为应答,在报文中也会包括协议版本号、加密算法等信息
      (3)服务器发送数字证书,数字证书中包括服务器的公钥密钥
      (4)客户端解开并验证数字证书,验证通过后,生成一个随机密码串,再勇受到的服务器公钥加密,发送给服务器
      (5)客户端再发送Change Cipher Spec报文,提示服务器在此条报文之后,采用刚刚生成的随机密码串进行数据加密
      (6)服务器也发送Change Cipher Spec报文
      (7)SSL连接建立完毕  
  • HTTPS的缺点
    (1)通信两端都需要进行加密和解密,会消耗大量的CPU、内存等资源,增加了服务器的负载
    (2)加密运算和多次握手降低了访问速度
    (3)在开发阶段,加大了页面调试难度,由于信息都被加密了,所以用代理工具的话,需要先解密后才能看到真实信息
    (4)用HTTPS访问的页面,页面内的外部资源都得用HTTPS请求,包括脚本中的ajax请求
  • 什么是运营商劫持?有什么办法预防?
      运营商是指提供网络服务的ISP(Internet Service Provider),例如三大基础运营商,电信、移动和联通。运营商为了牟取经济利益,有时候会劫持用户的HTTP访问,最明显的特征就是在页面上植入广告,有些是购物广告,有些却是淫秽广告,非常影响界面体验和公司形象。为了避免被劫持,可以让服务器支持HTTPS协议,HTTPS传输的数据都被加密过了,运营商无法再注入广告代码,页面就不会再被劫持。

PHP程序员面试宝典摘抄相关推荐

  1. java只会用不知道原理6_程序员面试宝典之14道初级Java面试题分享

    程序员面试宝典之14道初级Java面试题分享 程序员面试宝典之14道初级Java面试题分享! 关于赢在面试的Java题系列基本收集整理完成了,所有题目都是经过精心挑选的,很基础又考验求职者的基本功,应 ...

  2. 《程序员面试宝典》精华 底层部分

    <程序员面试宝典>精华 底层部分 正所谓取其精华,去其糟粕.本文谨记录下<程序员面试宝典>一些关键的知识点.易错点,对于一些虽然重要但书中没有解释清楚的地方不做记录.书里是没有 ...

  3. 《程序员面试宝典》精华 面向对象部分

    <程序员面试宝典>精华 面向对象部分 正所谓取其精华,去其糟粕.本文谨记录下<程序员面试宝典>一些关键的知识点.易错点,对于一些虽然重要但书中没有解释清楚的地方不做记录.书里是 ...

  4. 《程序员面试宝典》精华 编程语言部分

    <程序员面试宝典>精华 编程语言部分 正所谓取其精华,去其糟粕.本文谨记录下<程序员面试宝典>一些关键的知识点.易错点,对于一些虽然重要但书中没有解释清楚的地方不做记录.当然这 ...

  5. ASP.NET的几个试题(《C#与.NET程序员面试宝典》)

    更多参考:博客园笔记 面试题1:ASP.NET是什么 ASP.NET不是一种语言,而是创建动态Web页的一种强大的服务器端技术,它是Microsoft.NET Framework中一套用于生成Web应 ...

  6. 金九银十北漂记第2篇:《Java程序员面试宝典》读书笔记

    尽信书,则不如无书.-–孟子 谈一谈这本书  <Java程序员面试宝典>是我接触的第一本讲解面试相关的书籍在看到这本书之前我就经常逛csdn的bbs,已经接触面试之类的知识.不过这本书还是 ...

  7. // 程序员面试宝典第三版34页,面试题2 ,结果很诡异,指针类型的转换本来意味着指向数据类型的转换,但是似乎不尽然是。

    // 程序员面试宝典第三版34页,面试题2 ,结果很诡异,指针类型的转换本来意味着指向数据类型的转换,但是似乎不尽然是. /* #include<stdio.h> int main()   ...

  8. 程序员面试宝典笔记1-基本概念预处理,const与sizeof

    程序员面试宝典笔记1-基本概念&预处理,const与sizeof 基本概念 赋值语句: i++: 类型转换 运算符问题 a,b交换与比较 其他 预处理 const sizeof 基本概念 赋值 ...

  9. 程序员面试宝典(第4版)

    <程序员面试宝典(第4版)> 基本信息 作者: 欧立奇 刘洋 段韬 出版社:电子工业出版社 ISBN:9787121207242 上架时间:2013-7-8 出版日期:2013 年7月 开 ...

最新文章

  1. 麻省、北大、清华等顶尖高校与企业 20 位强化学习专家齐聚,RLChina 2021 强化学习暑期课免费报名啦!
  2. 前端处理带t的时间_大厂实践:如何优雅的监控前端页面性能
  3. 【转】使用Apache CXF开发WebServices服务端
  4. 弹性计算双周刊 第 9 期
  5. python财务报表分析-浅谈利用Python分析财报找到值得投资的好公司的想法
  6. 【Groovy】自定义 Xml 生成器 BuilderSupport ( 创建 XmlNode 节点 | 管理 XmlNode 节点并将根节点转为 Xml 信息 | 完整代码示例 )
  7. Sonya and Informatics
  8. OpenShift安装
  9. Apache Drill 1.4性能增强的简要概述
  10. python prettytable_让python的print变得更好看——prettytable和colorama
  11. PHP获取本月起始和终止时间戳
  12. JavaSE——面向对象基础(思想、类与对象、构造方法、重载、匿名对象)
  13. java 创建bean_java – 使用spring按需创建bean
  14. What is Dark Net
  15. 理解分布式和集群的区别
  16. 萤火虫算法_萤火虫算法(一)
  17. 【电信学】【2011.06】​基于空时空频编码的MIMO-OFDM通信信道估计与性能分析
  18. 读取JPG图片的Exif属性(三) - Exif属性读取GPS信息代码(C/C++实现)
  19. pod install 时遇到 Automatically assigning platform `iOS` with version `11.0` on target XXX......
  20. 1对多 只取一条 mysql_SQL中遇到多条相同内容只取一条的最简单实现方法

热门文章

  1. office 2010无法启动Office Software Protection Platform服务
  2. cesium-地面裁剪(多个剪切面)
  3. 三星S22比iPhone13便宜,或代表安卓手机已向苹果低头
  4. Alertmanager邮箱和企业微信的告警模板分享
  5. 锤子科技创始人秘密拜会了苏宁董事长张近东
  6. 表视图的基本概念和用法
  7. python处理HTML转义字符
  8. 有五个字母A(a), E(e), I(i), O(o),U(u)称为元音,其他所有字母称为辅音,请编写程序判断输入的字母是元音(Vowel)还是辅音(Consonant)。
  9. 股票的最大利润(java算法题,动态规划法的应用)
  10. 清华大学html理论考试题,1+X Web前端开发(初级)理论考试样题(附答案)