字节客户端面经

https://zhuanlan.zhihu.com/p/60450391

1.HTTPS加密过程

HTTPS是基于对称加密和非对称加密的;

对称加密和非对称加密:

字节客户端面经_第1张图片

  • 1.网站拥有非对称加密的公钥A1和私钥A2
  • 2.公钥明文传输给浏览器
  • 3.浏览器收到这个A1之后,随机生成一个对称加密的密钥X,用公钥A1加密后传给服务器
  • 4.服务器收到后用A2解密得到密钥X
  • 5.这样双方就有X了,双方就可以都用X传输

这样的机制会出现中间人攻击的问题,为了解决这个问题,加入了数字证书和数字签名

数字证书是由权威CA机构颁发的:一般有证书持有者、证书持有者的公钥等信息

字节客户端面经_第2张图片

如何防止证书在颁发过程中不被篡改:我们把证书内容生成一份“签名”

数字签名的制作过程撕:

  • CA拥有对称加密的公钥和私钥
  • CA对明文信息机进行hash
  • 对hash后的值用私钥加密,得到数字签名

浏览器验证过程:

  • 拿到证书T1,数字签名S1
  • CA的公钥解密得到S2
  • hash算法对T1 hash得到T2
  • 比较S2==T2 等于则证明证书可信

字节客户端面经_第3张图片

 

然后HTTPS的工作过程:

字节客户端面经_第4张图片

  • 服务端向CA申请数字证书
  • 传送证书
  • 客户端验证证书,没有问题就生成一个随机值(密钥),用证书加密
  • 传送加密信息,即证书加密过后的密钥
  • 服务端得到证书,私钥解密,得到密钥
  • 之后的过程就按对称加密走

 

2.HTTP

一种无状态,以请求、应答方式运行的协议,他使用可扩展的语义和自述描述消息格式、与基于网路的超文本信息系统灵活的互动

客户端发送一个HTTP请求,HTTP的请求格式如下:

请求行:描述请求或响应的基本信息

请求头:使用key-value形式更加详细的说明报文

空行:

请求数据:实际传输的数据、不一定是文本、可以是图片、视频等二进制数据

字节客户端面经_第5张图片

  • 版本号:表示报文使用的HTTP协议版本
  • 状态码:
  • 作为数字状态码补充、是更详细的解释文字、帮助人理解原因

 

常用头字段:

  • 请求字段:请求头中的头字段,但基本可以分为两大类:HOST、Referer

host:标识当前的链接是和哪一个服务建立的:    referer来源的判断

  • 响应字段:响应头中的字段,如Server,Data

server:哪一种类型的服务器  data 时间

  • 通用字段:在请求头和响应头都可以出现:Content-type,Connection

content-type:请求头 了解什么类型的数据    connection:

字节客户端面经_第6张图片

 

3.http请求方法

http1.0

(1)get:特定的资源发出请求,本质就是一个发送一个请求来取得服务器的某一资源

(2)head:发送一个和get请求相一致的响应,不过响应体不会被返回,这一方法不传输整个响应内容,只是为了回去报头

(3)post:提交数据(例如上传文件),该请求可能会修改数据的内容,会增加数据的种类等等,就像insert一样,创建新的内容

http 1.1新增

(4)put:向服务器发送数据,修改数据的内容但是不会增加数据的种类,就想updata一样

(5)delete:删除url标识的资源,delete请求后指定资源会被删除,delete也是幂等的

(6)options:允许客户端查看服务器的性能

(7)trace:回显服务器收到的请求,主要用于测试或诊断

(8)patch:对put方法的补充,用来对已知资源的更新

patch出现的比较晚,和put请求类似,同样用于资源的更新,但是有两点不同:

  • patch用于资源的部分更新,put用于资源的整体更新
  • 资源不存在的时候,patch会创建一个新的资源,put只会对已存在资源进行更新

(9)connect:HTTP1.1中预留的能够将链接改为管道方法的代理服务器

 

4.dns解析过程

 

1.主要作用

将人们熟悉的网址翻译成电脑理解的IP地址,这个过程叫做DNS域名解析

而且一个域名往往对应最后多个IP地址

字节客户端面经_第7张图片

 

2.HTTP流程

  1. 拿到域名,进行DNS域名解析
  2. 拿到解析的IP地址,建立TCP链接
  3. 向IP地址,发送HTTP请求
  4. 服务器处理请求
  5. 返回响应结果
  6. 关闭TCP链接

3.DNS流程

解释一下域名 www.tmall.com

顶级域名: .com  .net

次级域名:.tmall  这一级域名是可以注册的

主机名(host):三级域名  用户在自己的域里边为服务器分配的名称  用户可以任意分配

 

Hosts是一个没有扩展名的系统bai文件,可以用记事本等工具打开,其作用就是zhi将一些常用的网址域dao名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。

 

  • 1、hosts文件能加快域名解析,对于要经常访问的网站,可以通过在Hosts中配置域名和IP的映射关系,提高域名解析速度。
  • 2、hosts文件可以方便局域网用户在很多单位的局域网中,可以分别给这些服务器取个容易记住的名字,然后在Hosts中建立IP映射,这样以后访问的时候,只要输入这个服务器的名字就行了。
  • 3、hosts文件可以屏蔽一些网站,对于自己想屏蔽的一些网站可以利用Hosts把该网站的域名映射到一个错误的IP或本地计算机的IP,这样就不用访问了。

 

CNAME和CDN加速

解析流程就是分级查询:

递归查询:

  1. 先在本机的浏览器的自身缓存中查询,如果没命中
  2. 就去操作系统缓存中有没有解析过的结果, windows下边有一个 hosts文件去查询,但是这种很容易被劫持,通过修改hosts文件解析到别人制定的IP上,就是所谓的域名劫持,(解决方法:将hosts文件设置成readonly,防止被恶意篡改)如果此时没有命中的话
  3. 如果至此还没有命中域名,才会真正的请求本地域名服务器(LDNS)来解析这个域名,这台服务器一般在你的城市的某个角落,距离你不会很远,并且这台服务器的性能都很好,一般都会缓存域名解析结果,大约80%的域名解析到这里就完成了
  4. 如果还没有命中,就去根域名服务器即系,根域名服务器反应
  5. 根名称服务器收到DNS请求后,把所查询得到的所请求的DNS域名中顶级域名所对应的顶级名称服务器地址返回给本地名称服务器
  6. 本地名称服务器根据根名称服务器所返回的顶级名称服务器地址,向对应的顶级名称服务器发送与前面一样的DNS域名查询请求
  7. ...
  8. 然后本地名称服务器继续按照前面介绍的方法一次次地向三级、四级名称服务器查询,直到最终的对应域名所在区域的权威名称服务器返回到最终的记录给本地名称服务器。然后再由本地名称服务器返回给DNS客户,同时本地名称服务器会缓存本次查询得到的记录项。

     

5.post和patch的区别

post向指定资源提交数据,post可能会导致新的资源建立和已有资源的修改

patch是对put方法的补充,put会像指定资源上传最新内容,相当于更新

patch出现的比较晚 和put请求类似,同样用于资源的更新,

但是    1   patch用于资源的部分更新,put用于资源的整体更新

           2   当资源不存在的时候,patch会创建一个新的资源,而put只会对已在资源进行更新

6.http1.0  1.1和2.0的区别

 

http1.1的新特性:

  1. 默认持久链接节省通信量,只要客户端服务端任意一端没有明确提出断开TCP链接,就一直保持链接,可以发送多个http请求
  2. 管线化,客户端可以同时发送多个http请求,而不是一个个响应
  3. 断电续传:实际上就是利用HTTP消息头使用分块传输编码,将实体主题分块传输

http2.0的特性:

  • 多路复用:即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面

http1.0的长链接和http2.0的多路复用有什么区别:

  • HTTP/1.* 一次请求-响应,建立一个连接,用完关闭;每一个请求都要建立一个连接;

  • HTTP/1.1 Pipeling解决方式为,若干个请求排队串行化单线程处理,后面的请求等待前面请求的返回才能获得执行机会,一旦有某请求超时等,后续请求只能被阻塞,毫无办法,也就是人们常说的线头阻塞;

  • HTTP/2多个请求可同时在一个连接上并行执行。某个请求任务耗时严重,不会影响到其它连接的正常执行

 

什么是服务端推送?

服务端推送能把客户端所需要的资源伴随着index.html一起发送到客户端,省去了客户端重复请求的步骤。正因为没有发起请求,建立连接等操作,所以静态资源通过服务端推送的方式可以极大地提升速度。

为什么需要头部压缩?

假定一个页面有100个资源需要加载(这个数量对于今天的Web而言还是挺保守的), 而每一次请求都有1kb的消息头(这同样也并不少见,因为Cookie和引用等东西的存在), 则至少需要多消耗100kb来获取这些消息头。HTTP2.0可以维护一个字典,差量更新HTTP头部,大大降低因头部传输产生的流量。具体参考:HTTP/2 头部压缩技术介绍

HTTP2.0多路复用有多好?
HTTP 性能优化的关键并不在于高带宽,而是低延迟。TCP 连接会随着时间进行自我「调谐」,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐则被称为 TCP 慢启动。由于这种原因,让原本就具有突发性和短时性的 HTTP 连接变的十分低效。
HTTP/2 通过让所有数据流共用同一个连接,可以更有效地使用 TCP 连接,让高带宽也能真正的服务于 HTTP 的性能提升

 

7.ip地址是虚拟ip,为什么客户端和服务端能通信(mac地址和物理地址,虚拟机的ip和真实ip?)

虚拟IP的实现原理:

虚拟IP就是一个未分配给真实主机的IP,也就是说对外提供数据库服务器的主机除了有一个真实IP外还有一个虚拟IP。

使用这两个IP中的任意一个都可以连接到这台主机,所有项目中数据库链接一项配置的都是这个虚IP,当服务器发生故障无法对外提供服务时,动态将这个虚IP切换到备用主机。

其实现原理主要是靠TCP/IP的ARP协议。因为ip地址只是一个逻辑地址,在以太网中MAC地址才是真正用来进行数据传输的物理地址,每台主机中都有一个ARP高速缓存,存储同一个网络内的IP地址与MAC地址的对应关系。

以太网中的主机发送数据时会先从这个缓存中查询目标IP对应的MAC地址,会向这个MAC地址发送数据。操作系统会自动维护这个缓存。这就是整个实现的关键。

 

8.RAII

传统c++使用new和detele去释放,而c++11引入了智能指针的概念,使用了引用计数的方法,让程序员不再去手动释放内存

解决思路:利用c++中一个对象出了作用域会自动析构,因此我们在构造函数申请空间,在析构函数(离开作用域)释放空间,这样,减轻了程序员在编码过程中,考虑资源释放的问题 ,这就是RAII。

RAII依托栈和析构函数,来对所有的资源-堆在内,进行管理,对RAII的使用,使得c++不需要类似于java那样的垃圾收集方法,有效的对内存进行管理

具体而言,c++提供了三种智能指针,正确合理的使用可以帮助大家管理资源

//利用编译器会自动帮我们调用构造和析构函数
//
class A {
public:
	A() {
		cout << "构造函数"<

 

9.vector插入过程

  • 新增元素:Vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块更大的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素;
  • 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了 ;
  • 初始时刻vector的capacity为0,塞入第一个元素后capacity增加为1;
  • 不同的编译器实现的扩容方式不一样,VS2015中以1.5倍扩容,GCC以2倍扩容。

10.new malloc底层

 

 

11.算法题是,www.baidu.com转成com.baidu.www

int main() {

	//方法1
	string ip = "www.baudu.com";
	istringstream s(ip);
	string word;
	string ans = "";
	while (getline(s, word, '.')) {
		ans = '.' + word + ans;
	}
	cout << ans.substr(1) << endl;


	//方法2

	string temp = "";
	string res = "";
	for (int i = 0; i < ip.size();i++) {
		while (ip[i] != '.'&& i!=ip.size()) {
			temp += ip[i++];
		}
		res = '.' + temp + res;
		temp = "";
	}

	cout << res.substr(1) << endl;


	system("pause");
	return 1;
}

12.口算题:9点15分,时针和分针的夹角

时针在钟面上没分钟转0.5°   分针没分钟转6°

 

表盘一格是  90/15 = 6°

分针转60分钟   时针转6*5 = 30度   分针转15分钟    时针转7.5度

九点15分的度数等于 180 减去因为时针因为分针转了15的而动的度数: 180-7.5 = 172.5° 

13.进程和线程的区别

  • 在没引入线程之前,进程是资源和调度的基本单位,在引入线程之后,线程是独立调度的基本单位,进程是资源拥有的基本单位;进程和进程之间可以并发的执行,线程和线程之间可以并发的执行,从而使得操作系统有哼好的并发性
  • 进程之间切换系统开销大,涉及当前执行cpu环境的保存以及新调度到进程环境的设置,线程只需要设置和保存少量的寄存器内容开销很小
  • 同一个进程的切换不会引起线程的切换,但是不同进程的切换会引起,如从一个进程的线程切换到另一个进程的线程的时候,会引起线程的切换
  • 进程通信:进程间的通信需要进程同步以及互斥手段的辅助,但是线程间的通信,可以直接读/写进程数据段(如全局变量)来进行通信

14.windows和虚拟机怎么通信的

 

 

ip地址:(<网络号><主机号>)

15.TCP的所有细节

概念:

TCP包是没有ip地址的,那是ip层的事,但是有源端口和目的端口

tcp需要四个元组来表示同一个链接(src_ip, src_port, dst_ip, dst_port)

字节客户端面经_第8张图片

注意上图中的四个非常重要的东西:

  • 序号:用来解决网络包乱序的问题
  • ACK,确认应答,解决不丢包的问题
  • 窗口:也就滑动窗口,解决流控的
  • TCP flag:六位状态位置来操控TCP的状态机

TCP可靠传输的机制

保证接收方进程从缓存区读出的字节流与发送方发出的字节流是完全一样的

  • 校验
  • 序号
  • 确认
  • 重传

 

校验:

计算方式:在数据传输的过程中,将发送的数据段都当做一个16位的整数。将这些整数加起来。并且前面的进位不能丢弃,补在后面,最后取反,得到校验和。
发送方:在发送数据之前计算检验和,并进行校验和的填充。
接收方:收到数据后,对数据以同样的方式进行计算,求出校验和,与发送方的进行比对。

这里写图片描述

注意:如果接收方比对校验和与发送方不一致,那么数据一定传输有误。但是如果接收方比对校验和与发送方一致,数据不一定传输成功。

伪首部概念

 

序号:

TCP会把每一个字节编一个序列号,发送的时候是以报文段为单位,把一些字节流放在一起组成一个报文段,然后发送出去,报文段大小也是不定的,报文段的大小取决于链路层的最大传输单元MTU决定

确认:

字节客户端面经_第9张图片

发送方在收到确认号字段为4的确认报文之后才会把123字节删除,然后发送456    78

但是456丢失了  只收到了78

字节客户端面经_第10张图片

虽然收到了78字段,78字段还是会正常接收,返回确认号还是4开头的确认报文段,重新发送456,如果收到456,下一个确认报文段填的是9

 

重传:

字节客户端面经_第11张图片

超时重传:

原理是发送某一个数据之后就开启一个定期器,在一定时间内没有得到发送的数据报的ACK报文,那么就重新发送数据,知道发送成功为止;

影响超时重传机制协议效率的一个关键参数是重传超时时间(RTO,Retransmission TimeOut)。RTO的值被设置过大过小都会对协议造成不利影响。
  (1)RTO设长了,重发就慢,没有效率,性能差。
  (2)RTO设短了,重发的就快,会增加网络拥塞,导致更多的超时,更多的超时导致更多的重发。
  连接往返时间(RTT,Round Trip Time),指发送端从发送TCP包开始到接收它的立即响应所消耗的时间。

 

快重传:

TCP采用自使用算法,动态改变重传时间RTTs(加劝平均时间)

字节客户端面经_第12张图片

GBN SR协议

三次握手和四次挥手

字节客户端面经_第13张图片

为什么要两次握手?

1.为了保证正常通信,两次握手之后,客户端知道自己的接收和发送功能是正常的,服务端不知道自己的发送能力是否正常,第三次握手之后,服务端收到了回应,三次握手之后就可以正常通信了

2.第三次握手防止已经失效的连接请求传送到B,因此产生错误,A发出连接请求,但是因为请求报文丢失而收到确认,于是A再重传一次请求连接,后来收到了确认建立了连接,但是报文并没有丢失,而是延迟到达了,本来是失效的报文段,但是B以为是A新的连接,只要B发出确认连接就建立了,由于A没有发出建立连接的请求,一次不会理财b的确认,不会向B发出确认,并一直等待A发来的数据。

 

 

字节客户端面经_第14张图片

为什么四次挥手?

1.可靠的终止连接 ,如果最后一次ACK丢失了,服务端就会重传这个FIN请求,客户端收到之后,重新开始2MSL定时器,服务端收到之后,两方正常的关闭,如果没有2MSL的话,就会服务端无法正常关闭

2.让网络中延迟的重复报文消失,避免干扰新链接

 

为什么是2MSL?

分析:
1. ACK从A到B最多经过1MSL,超过这个时间B会重发FIN
2. B重发的FIN最多经过1MSL到达A

结论:如果B重发了FIN,且网络没有故障(重发的FIN被丢弃或错误转发),那么A一定能在2MSL之内收到该FIN,因此A只需要等待2MSL。

 

流量控制

概念:接收方根据自己的接收缓存的大小,动态的调整发送窗口大小

1)最基本的传输可靠性来源于“确认重传”机制。

2)TCP的滑动窗口的可靠性也是建立在“确认重传”基础上的。

3)发送窗口只有收到对端对于本段发送窗口内字节的ACK确认,才会移动发送窗口的左边界。

4)接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传

字节客户端面经_第15张图片


字节客户端面经_第16张图片

为了防止死锁(最后一次服务器发给客户端的报文,窗口设置为400但是丢失了),TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动持续定时器。

如果定时器到期了,就发送一个零窗口探测报文段,接受放收到探测报文段,就给出自己的当前窗口值。

拥塞控制

出现拥塞的条件:需求的总和>可用资源

拥塞控制的四种算法:

慢开始、拥塞避免、快重传、快恢复

假定:数据单方向传送,发生窗口取决于拥塞程度

swnd 接收窗口:接收方根据接收缓存设置的值,并告知发送方,并反映接收方容量

cwnd 拥塞窗口:发送方根据自己的估算的网络拥塞程度而设置的窗口值,反映网络当前容量

慢开始:cwnd的值从1开始指数规律增长,1-2-4-8,到达慢开始门限的时候,该用拥塞避免

拥塞避免:拥塞窗口的值线性加1  当发生超时重传的时候判断网络发生了拥塞

此时将满开始门限设置为当前拥塞窗口的一半,另一方面讲拥塞窗口的值设置为1 

 

所谓快重传:就是如果收到三个重复确认,立马进行重传,而不是等超时重传计时器超时再重传

快恢复:发送方收到三个重复确认,执行快恢复

拥塞窗口和慢开始门限都设置为但钱窗口的一半,再执行拥塞避免算法

 

16.map unordered_map

map内部实现了一个红黑树(红黑树是非严格平衡二叉搜索树,而AVL是严格平衡二叉搜索树),红黑树具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素。因此,对于map进行的查找,删除,添加等一系列的操作都相当于是对红黑树进行的操作。map中的元素是按照二叉搜索树(又名二叉查找树、二叉排序树,特点就是左子树上所有节点的键值都小于根节点的键值,右子树所有节点的键值都大于根节点的键值)存储的,使用中序遍历可将键值按照从小到大遍历出来。

unordered_map内部实现了一个哈希表(也叫散列表,通过把关键码值映射到Hash表中一个位置来访问记录,查找的时间复杂度可达到O(1),其在海量数据处理中有着广泛应用)。因此,其元素的排列顺序是无序的

红黑树的旋转:

 

17.进程通信

  • 1.共享内存

两个进程对共享空间的访问必须是互斥的,操作系统只提供共享空间与同步互斥工具

基于数据结构的共享:比如在共享空间中可以放一个长度为10的数组,这种共享方式速度慢、限制多,是一种低级通信方式

基于存储区的共享:在内存中画出一块共享存储区、数组的形式、存放位置都有进程控制而不是操作系统,相比之下,更快是一种高级通信方式

https://www.cnblogs.com/wuyepeng/p/9748889.html

两个或者多个进程共享一定的存储区,就如同malloc向不同进程返回了指向同一个物理’内存区域的指针。当一个进程改变这块区域中的内容的时候,其他进程都会察觉到这个更改,因为数据不需要拷贝,所以比较快。

2.管道通信

管道是指连接读写进程的一个共享文件,叫pipe文件,其实就是在内存中开辟一个大小固定的缓冲区,

管道是一种最基本的IPC机制,有pipe函数创建,

#include 
int pipe(int filedes[2]);

管道作用于有血缘关系的进程之间,通过fork来传递,它有一个读端一个写端,然后通过filedes参数传出给用户程序两个文件描述符,filedes[0]指向管道的读端,filedes[1]指向管道的写端(很好记,就像0是标准输入1是标准输出一样)。所以管道在用户程序看起来就像一个打开的文件,通过read(filedes[0]);或者write(filedes[1]),向这个文件读写数据其实是在读写内核缓冲区。pipe函数调用成功返回0,调用失败返回-1。

1.父进程调用pipe开辟管道,得到两个文件描述符指向管道的两端。
2.父进程调用fork创建子进程,那么子进程也有两个文件描述符指向同一管道。
3.父进程关闭管道读端,子进程关闭管道写端。父进程可以往管道里写,子进程可以从管道里读,管道是用环形队列实现的,数据从写端流入从读端流出,这样就实现了进程间通信

 

3.消息队列

进程间的数据交换只能以格式化的消息为单位,进程通过操作系统提供的“发送消息、接收消息” 

消息头包括进程ID、消息类型、消息长度等格式化的消息(计算机网络的报文其实就是一种格式化的消息)两种原语进行交换

直接通信:直接将消息挂到缓冲队列上

间接通信:消息先发送到中间实体上,接收进程从信箱中取

 

18.内核空间和用户空间

对 32 位操作系统而言,它的寻址空间(虚拟地址空间,或叫线性地址空间)为 4G(2的32次方)。针对 Linux 操作系统而言,最高的 1G 字节(从虚拟地址 0xC0000000 到 0xFFFFFFFF)由内核使用,称为内核空间。而较低的 3G 字节(从虚拟地址 0x00000000 0xBFFFFFFF)由各个进程使用,称为用户空间。

为什么需要区分内核空间与用户空间?

在 CPU 的所有指令中,有些指令是非常危险的,如果错用,将导致系统崩溃,比如清内存、设置时钟等。如果允许所有的程序都可以使用这些指令,那么系统崩溃的概率将大大增加。
所以,CPU 将指令分为特权指令和非特权指令,对于那些危险的指令,只允许操作系统及其相关模块使用,普通应用程序只能使用那些不会造成灾难的指令。比如 Intel 的 CPU 将特权等级分为 4 个级别:Ring0~Ring3

其实 Linux 系统只使用了 Ring0Ring3 两个运行级别(Windows 系统也是一样的)。当进程运行在 Ring3 级别时被称为运行在用户态,而运行在 Ring0 级别时被称为运行在内核态

 

19.fork函数

https://www.cnblogs.com/helloworldcode/p/11105924.html

用于创建一个进程、所创建复制进程的代码段、数据段、bss段、堆、栈等所有用户信息,在内核中操作系统重新为其申请了一个PCB,并使用父进程的PCB进行初始化;

20.僵尸进程

父进程创建完子进程后,子进程运行到终止时刻(例如,调用exit()函数,或者运行到main中的return语句时,都会将返回的值传递给 操作系统)此时如果父进程还在运行,子进程并不会立即被销毁,直到这些值传到了产生该子进程的父进程,也就是说,如果父进程没有主动要求获得子进程的结束状态值,操作系统就会一直保存该进程的相关信息,并让子进程长时间处于僵尸状态

21.PCB

https://www.cnblogs.com/caidi/p/6698168.html

 

22.select poll epoll

都是I/O多路复用的机制,IO多路复用就通过一种机制,可以监视多个描述符,一旦某个描述符就位,能够通知程序进程相应的读写操作,本质上都是同步IO,这个读写过程是阻塞的;

关于epoll的区别:

是基于事件驱动的I/O方式,相对于select和poll来说,epoll没有描述符个数限制,使用一个文件描述符管理多个描述符,将用户关心的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间的copy只需一次

 

  1. 没有最大并发连接的限制,能打开的fd上限远大于1024(1G的内存能监听约10万个端口)
  2. 采用回调的方式,效率提升。只有活跃可用的fd才会调用callback函数,也就是说 epoll 只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,epoll的效率就会远远高于select和poll。
  3. 内存拷贝。使用mmap()文件映射内存来加速与内核空间的消息传递,减少复制开销。

水平触发:默认工作模式,即当epoll_wait检测到某描述符事件就绪并通知应用程序时,应用程序可以不立即处理该事件;下次调用epoll_wait时,会再次通知此事件

边缘触发:当epoll_wait检测到某描述符事件就绪并通知应用程序时,应用程序必须立即处理该事件。如果不处理,下次调用epoll_wait时,不会再次通知此事件。(直到你做了某些操作导致该描述符变成未就绪状态了,也就是说边缘触发只在状态由未就绪变为就绪时通知一次)

 

23.HTTP和HTTPS区别

       1. https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

  2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

  3、http和https用的端口也不一样,前者是80,后者是443。

  4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

 

  • 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。


 

  • 内容加密:采用混合加密技术,中间者无法直接查看明文内容
  • 验证身份:通过证书认证客户端访问的是自己的服务器
  • 保护数据完整性:防止传输的内容被中间人冒充或者篡

 

24.DNS劫持

 DNS劫持:

    一般而言,用户上网的DNS服务器都是运营商分配的,所以,在这个节点上,运营商可以为所欲为。

    例如,访问http://jiankang.qq.com/index.html,正常DNS应该返回腾讯的ip,而DNS劫持后,会返回一个运营商的中间服务器ip。访问该服务器会一致性的返回302,让用户浏览器跳转到预处理好的带广告的网页,在该网页中再通过iframe打开用户原来访问的地址。

    HTTP劫持:

    在运营商的路由器节点上,设置协议检测,一旦发现是HTTP请求,而且是html类型请求,则拦截处理。后续做法往往分为2种,1种是类似DNS劫持返回302让用户浏览器跳转到另外的地址,还有1种是在服务器返回的HTML数据中插入js或dom节点(广告)。

 

25.get和post的区别

get是用来获取数据的,post是提交数据的

对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。

 

常见的HTTP相应状态码

常见的HTTP相应状态码
  • 200:请求被正常处理
  • 204:请求被受理但没有资源可以返回
  • 206:客户端只是请求资源的一部分,服务器只对请求的部分资源执行GET方法,相应报文中通过Content-Range指定范围的资源。
  • 301:永久性重定向
  • 302:临时重定向
  • 303:与302状态码有相似功能,只是它希望客户端在请求一个URI的时候,能通过GET方法重定向到另一个URI上
  • 304:发送附带条件的请求时,条件不满足时返回,与重定向无关
  • 307:临时重定向,与302类似,只是强制要求使用POST方法
  • 400:请求报文语法有误,服务器无法识别
  • 401:请求需要认证
  • 403:请求的对应资源禁止被访问
  • 404:服务器无法找到对应资源
  • 500:服务器内部错误
  • 503:服务器正忙

char *xstrncpy(void *dest, void *src, int n) {
	int i;

	char *p1 = (char *)dest;
	char *p2 = (char *)src;

	while (n--) {
		*p1++ = *p2++;
	}

	
	/*
	for (int i = 0; i < n; i++) {
		dest[i] = src[i];
	}
	
	*/
	return (char *)dest;
}


int main() {
	char dest[] = "asdasdasda";
	char src[] = "123456";

	xstrncpy(&dest[4], src, 5);

	int str;
	int s;

	cin >> str;
	cin >> s;
	cout << str << s << endl;

	
	cout << dest << endl;


	system("pause");
	return 1;
}

 

26.HTTP1.0 HTTP1.1 HTTP2.0

HTTP1.0和HTTP1.1:

  • HTTP1.0需要一个keep-alive来告知服务端需要建立一个长连接,而HTTP1.1默认支持长连接
  • HTTP支持只发送head信息,如果认为有权限请服务器,则返回100,否则返回401,当返回401的时候,客户端就不用发送body了节约了带宽

HTTP1.1和HTTP2.0:

  • http2.0支持多路复用技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大的多
  • http1.1不支持数据的压缩,http2.0使用hpack算法对header的数据进行压缩,这样数据体积小了,在网络传输更快
  • 服务器推送,当我们对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源

 

27.安卓客户端开发需要什么技术

Android的开发技术很多,在开bai始学du习的时候不可能一次性全部学会zhi,也没有必要dao一开始都全部学会,但是有些技术是非常常用的,需要在开始时打好基础,这些技术时:
  1、Activity生命周期
  虽然Android中有四大组件,但是不可否认Activity是最常用的。所以熟练掌握Android的生命周期是必须的。其实生命周期就是记住 Activity的那些方法在什么时候被系统调用,这样才可以把对应的逻辑代码写到合适的方法内部去。
  至于服务和广播组件可以稍微缓一下,到实际使用的时候再学习都可以。
  2、界面开发技术
  界面开发是一种基本的技术,几乎所有的程序里面都需要用到。在Android开发中界面开发分为3种:
  1)使用xml文件布局
  使用xml首先对于界面进行布局,然后在Activity里面进行引用是最常见的应用软件开发技术,这种方式使用的最大,需要学习的内容也最多。学习时需要熟悉:
  a)五种Layout布局
  深刻理解五种布局组织控件的方式是一个基本的基础,这样你才可以在实际的界面中灵活的使用每种布局结构,构造出需要的界面。
  b)常用控件
  控件有很多,至少要知道每种控件是做什么的,至于里面的特定参数和方法可以学要的时候再去查
  c)界面美华
  系统的控件很多时候无法满足要求,需要通过添加背景更换图片等进行美化,要熟悉每种控件如何去美华。
  掌握了上面的内容,通过布局的嵌套就可以制作出各种界面,如果在熟悉include的使用就可以减少xml的重复,方便后期的修改和维护了。
  2)使用代码动态创建
  有些时候需要动态的创建一些布局和控件,这个就需要使用LayoutInflater去创建一些动态的界面了。
  3)自己绘制界面
  游戏中常用,继承SurfaceView自己绘制。
  3、数据存储技术
  Android中的数据存储方式有3种:
  1)SharedPrefereneces存储
  对于简单的数据可以使用该方式存储,以键值对的方式存储一些基本的数据。
  2)文件存储
  将数据以文件的形式存储,可以是手机自身的存储也可以是SD卡,文件的数据格式自己定义。
  3)SQLite数据库存储
  使用标准SQL语句进行操作,复杂数据的首选。
  4、网络编程
  现在的Android程序不需要联网的已经不多了。所以网络编程也是必须的,一般的公司都会封装有自己的联网结构,但是基本的联网还是要熟悉。
  1)HTTP联网
  使用Http联网+Json数据格式是现在很多客户端的首选。
  2)Socket联网
  至于蓝牙等连接方式则可以在项目需要的时候学习。
  对于手机的系统功能,如拨打电话、发送短信、读取系统参数等则可以根据需要在学习,不麻烦的。
  其次,手机软件相关


  Android开发不同于普通的电脑软件开发,需要了解手机的操作习惯,知道手机的屏幕不大、内存有限,电池有限等,在实际开发和设计时尽量考虑。

28.为什么有了ip地址还需要mac地址

29.线程池

 

 

 

30.get和post

示例:

方法是get请求,URL是/search/users?q=zhangsan,协议为HTTP1.1

请求行下面部分全都是请求头部,我们可以看到 host为 api.github.com,连接方式为长连接等信息。值得注意的是我们这个例子中是不存在请求数据的

字节客户端面经_第17张图片

 

POST中URL为空,协议版本也是HTTP1.1

和get不一样的地方在于它的请求参数是位于请求数据中的,可以看到 name=Professional%20Ajax&publisher=Wiley 就是它的请求数据。并且我们要注意到在请求数据和请求头之间是空出一行的,这是必不可少的。

 

还在问get和http

get方法的特点:

1.在上述的例子中:api.github.com/search/users?q=JakeWharton就是一个非常典型的 **GET **请求的表现形式,即请求的数据会附在 URL 之后(放在请求行中),以 ? 分割 URL 和传输数据,多个参数用 & 连接

2.除此之外,根据 HTTP 规范,GET 用于信息获取,而且应该是安全和幂等的

3.get是被浏览器自动缓存的,如果下一次传输的数据相同,那么就会返回缓存中的内容,以求更快的传输数据

4.get中的URL一般有长度限制,但是需要注意的是HTTP没有规定GET的长度,这个长度限制主要是浏览器和web服务器决定的,并且各个浏览器对长度的限制也各不相同。

5.GET一次产生一个TCP数据包,浏览器会把请求头和请求数据一起出去,服务器响应200 ok

 

POST的特点:

1.post表示可能会改变服务器资源上的请求,例如我们在刷知乎的时候对某篇文章进行点赞就是提交的post请求,因为他改变了服务器中的数据,所以他是不安全的幂等的

2.post将请求信息放在请求数据中的,所以它的请求数据没有长度限制

3.POST会产生两个TCP数据包,浏览器会先将请求头,发送给服务器,待响应100 continue,浏览器再发送请求数据,之后再响应200 ok(返回数据),这么看GET传输是比post快一些,但是实际传输速度基本相同

 

 

你可能感兴趣的:(面试,面经答案,https)