mmap(内存映射)、sendfile() 与零拷贝技术 对于一个IO操作而言,都是通过CPU发出对应的指令来完成的,但是相比于CPU来说,IO的速度太慢了,CPU有大量时间处于等待IO的状态,因此就产生了DMA直接内存访问技术,本质上来说DMA就是一块主板上独立的芯片,通过它来进行内存和IO设备的数据传输,从而减少了CPU的等待时间,但是不论是谁来拷贝,频繁的拷贝耗时也是对性能的影响。一次简单的传统IO过程,发生了4次用户态和内核态的上下文切换,这在高并发场景下无疑会对性能产生极大的影响。
共享内存原理与使用 不同进程之间共享的内存通常为同一段物理内存。就好比,我要和人solo(通信),我创建了一个房间(共享内存),这个房间就有了房间号(共享内存的ID),是个人都能进这个房间,根本没法通信,所以我们要设置房间密码。第一,和创建进程类似,进程被创建的时候,会被分配一个pid来标识这个进程的唯一性,同时也方便OS管理这些进程,因此共享内存在被创建的时候,会被分配一个“ID”来标识唯一性。第二,共享内存可以允许存在多个,为了区分这些共享内存,我们上面引入了“ID”的概念,但是要如何让两个进程连上同一个共享内存呢?
进程间的8种通信方式 无名管道( pipe )、高级管道(popen)、有名管道(named pipe)、消息队列( message queue )、信号量( semophore ) 、信号 ( sinal ) 、共享内存( shared memory ) 、套接字( socket )。进程的亲缘关系通常是指父子进程关系。将另一个程序当做一个新的进程在当前程序进程中启动,则它算是当前程序的子进程,这种方式我们成为高级管道方式。套解字也是一种进程间通信机制,与其他通信机制不同的是,它可用于不同机器间的进程通信。
虚拟地址空间相关知识网络(段页存储 -- MMU -- 虚拟地址 -- 内核区 -- 用户区) 段页式存储 ----> 逻辑地址到物理地址映射(MMU) ----> 进程地址空间(用户地址空间和PCB)-----> 缺页中断和缺页请求
select、poll、epoll的简要对比 select的几大缺点:(1)每次调用select,都需要把fd集合从用户态拷贝到内核态,这个开销在fd很多时会很大(2)同时每次调用select都需要在内核遍历传递进来的所有fd,这个开销在fd很多时也很大(3)select支持的文件描述符数量太小了,默认是1024select 为什么是1024?—— 两个10241,select中存放文件描述符的数组大小FD_SETSIZE为10242,进程的文件描述符上限默认是1024,正是因为这个原因,select设计时才把数组大小设计为1024。
C++内联函数(inline)和宏函数(define)对比 1.C中使用define这种形式宏定义的原因是因为C语言是一个效率很高的语言,这种宏定义在形式及使用上像一个函数,但它使用预处理器实现,没有了参数压栈,代码生成等一系列的操作。因此,效率很高,这是它在C中被使用的一个主要原因。2.这种宏定义在形式上类似于一个函数,但在使用它时,仅仅只是做预处理器符号表中的简单替换,因此它不能进行参数有效性的检测,也就不能享受C++编译器严格类型检查的好处,另外它的返回值也不能被强制转换为可转换的合适的类型。这样,它的使用就存在着一系列的隐患和局限性。3.在C++中引
static关键字分别在C和C++中的作用 一般在函数中定义的变量,在栈区分配空间,函数退出时胡自动释放,无法保存,而如果定义全局变量来实现,变量就不属于函数本身,不在仅受函数控制,给程序维护带来不便;仅对当前文件可见,其他文件不可访问,其他文件可以定义与其同名的变量,两者互不影响。在定义不需要与其他文件共享的全局变量时,加上static关键字能够有效地降低程序模块之间的耦合,避免不同文件同名变量的冲突,且不会误使用。只能在声明它的文件可见,其他文件不能引用该函数。定义在函数体外部,在静态区分配存储空间,编译器自动对其初始化。
FTP协议原理简析 当客户在需要数据的情况下,会告知服务器用什么方式联机,如果是主动式(Active),客户端随机启用一个端口(port BB),通过命令通道告知FTP服务器,等待FTP服务器联机;如图所示,客户端会随机取一个大于1024以上的端口(port AA)来与FTP服务器端的port21达成联机,这个过程为三次握手,达成联机后用户便可以对FTP下达指令,包括查询文件名、下载、上传等指令;FTP服务器由命令通道了解客户端的需求后,主动由20端口向客户端的port BB进行三次握手联机。与主动联机图第一步相同;
GET和POST方法的区别 一般认为POST在传输数据时更加的安全,因为,所以更安全。浏览器由于规范问题不会在GET的请求体中添加数据,但是可以通过例如Fiddler的Composer来添加数据到GET的请求体种。常见的GET和POST区别还有GET传输的数据比较少,POST传输数据多;因此不管GET还是POST,数据传输大小都会有限制,只是POST的传输大小相对于GET来说比较大;数据量大小也并不是面试官期望听到的回答。GET请求多是用来获取数据的,通常可以缓存。
从对称加密和非对称加密讲解HTTP到HTTPS的发展思路 解决中间人攻击的方法是通过受信任的第三方交换公钥,具体做法就是服务器不直接向客户端发送公钥,而是要求受信任的第三方,也就是证书认证机构 (Certificate Authority, 简称 CA)将公钥合并到数字证书中,然后服务器会把公钥连同证书一起发送给客户端,私钥则由服务器自己保存以确保安全。因为每一家CA机构都会给成千上万的网站制作证书,假如攻击者知道abc.com使用的是某家CA机构的证书,那么他也可以同样去这家CA机构申请一个合法的证书,然后在浏览器请求abc.com时对返回的。
详解HTTP1.0、1.1、2.0版本区别/优化 HTTP/1.1并不支持 HTTP 首部压缩,为此 SPDY 和 HTTP/2 应运而生, SPDY 使用的是通用的DEFLATE 算法,而 HTTP/2 则使用了专门为首部压缩而设计的 HPACK 算法。本质上是为了减少请求,通过多个js或css合并成一个文件,多张小图片拼合成Sprite图,可以让多个HTTP请求减少为一个,减少额外的协议开销,而提升性能。连接和并行发送请求,这样每次一个请求都需要三次握手,而且其实建立连接和释放连接的这个过程是最耗时的,传输数据相反却不那么耗时。的缓存机制失效的问题。
DNS协议 一个主机通过DNS获取指定主机名对应的IP地址并发起HTTP的TCP连接的过程:**(1)浏览器**截取URL中的主机名字段**,**发送给DNS应用的客户端**;(2)**DNS客户端向DNS服务器发送**一个包含主机名的**请求**;(3)**DNS客户端收到**来自DNS服务器发出的**回答报文**,该报文中包**含对应请求主机名对应的IP地址**;(4)**浏览器接收到**来自DNS的该**IP地址**(5)**浏览器向**位于**该IP地址80端口的HTTP服务器进程发起一个TCP连接
A、B机器正常TCP连接后,B突然断网,A处于什么状态? 几个思考点:是否开启keepalive?是否存在数据交互?进程崩溃;客户端主机宕机(客户端网络不可用 是同种情况);①②使用 kill -9 来模拟进程崩溃的情况,发现在 kill 掉进程后,服务端会发送 FIN 报文,与客户端进行四次挥手。所以,即使没有开启 TCP keepalive,且双方也没有数据交互的情况下,如果其中一方的进程发生了崩溃,这个过程操作系统是可以感知的到的,于是就会发送 FIN 报文给对方,然后与对方进行 TCP 四次挥手。
NAT地址转换 同时,又可隐藏网络内部的所有主机,有效避免来自internet的攻击。是指将内部网络的私有IP地址转换为公用IP地址时,IP地址是不确定的,是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。2.安全防护:NAT 之内的 PC 联机到 Internet 上面时,他所显示的 IP 是 NAT 主机的公共 IP,所以 Client 端的 PC 当然就具有一定程度的安全了,外界在进行 portscan(端口扫描) 的时候,就侦测不到源Client 端的 PC。
MTU & TTL & RTT 往返时延(Round-Trip Time,RTT)也是一个重要的性能指标,它表示从发送方发送数据开始,到发送方收到来自接收方的确认,总共经历的时延。排队时延是分组在所经过的网络结点的缓存队列中排队所经历的时延,排队时延的长短主要取决于网络中当时的通信量,当网络的通信流量大时,排队时间就长,极端情况下,当网络发生拥塞导致分组丢失时,该结点的排队时延视为无穷大。处理时延是分组在中间结点的存储转发过程中而进行的一些必要的处理所花费的时间,这些处理包括提取分组的首部,进行差错校验,为分组寻址和选路等。
TCP沾包问题 先来解释一下什么是粘包?所谓粘包就是连续给对端发送两个或者两个以上的数据包,对端在一次收取中收到的数据包数量可能大于 1 个,当大于 1 个时,可能是几个(包括一个)包加上某个包的部分,或者干脆就是几个完整的包在一起。当然,也可能收到的数据只是一个包的部分,这种情况一般也叫半包。粘包示意图如下:
TCP和UDP的优缺点比较 TCP的优点:可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口(流量控制)、(超时)重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。TCP的缺点:慢,效率低,占用系统资源高,易被攻击:TCP在传递数据之前,要先建连接,这会消耗时间,TCP首部大小本身就比UDP首部大,而且在数据传递时基于TCP首部中信息进行的确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,另外还要维护需要保持的传输连接;事实上,每个连接都会占用系统的CPU、内存
TCP四次挥手 & 2MSL & TIME_WAIT详解 4次握手的最后一个ACK是是由主动关闭方发送出去的,若这个ACK丢失,被动关闭方会再次发一个FIN过来。若主动关闭方能够保持一个2MSL的TIME_WAIT状态,则有更大的机会让丢失的ACK被再次发送出去。(2)防止lost duplicate对后续新建正常链接的传输造成破坏。lost duplicate在实际的网络中非常常见,经常是由于路由器产生故障,路径无法收敛,导致一个packet在路由器A,B,C之间做类似死循环的跳转(也有可能是网络时延导致)。IP头部有个TTL,限制了一个包在网络中的