《C++面试宝典》V1.0 冲刺大厂~持续更新(12)
分享面试总结,涉及C++、算法、数据结构、操作系统、计算机网络、Linux、数据库、设计模式等,后面持续更新~
# 网络篇--- √3
参考书籍:谢希仁《计算机网络》http和https了解吗?
1) http和https的概念:
http:超文本传输协议(HyperText Transfer Protocol, HTTP)是互联网应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(tcp),用于从服务器传输超文本到本地浏览器(明文传输)的传输协议,它可以使浏览器更加高效,使网络传输减少。
http特点:
a) 无状态:协议对客户端没有状态存储,对事物处理没有“记忆”能力,如访问一个网站需要反复进行登录操作
b) 无连接:HTTP/1.1之前,由于无状态特点,每次请求需要通过TCP三次握手四次挥手,和服务器重新建立连接。每次需要重新响应请求,耗费不必要的时间和流量。
c) 基于请求和响应:基本的特性,由客户端发起请求,服务端响应。
d) 简单快速、灵活。通信使用明文、请求和响应不会对通信方进行确认、无法保护数据的完整性。
https:是http的安全版,通过SSL或TLS提供加密处理数据、验证对方身份以及数据完整性保护。https协议作用:保证数据传输的安全,确认网站的真实性。
https特点:
a) 内容加密:采用混合加密技术,中间者无法直接查看明文内容。
b) 验证身份:通过证书认证客户端访问的是自己的服务器。
c) 保护数据完整性:防止传输的内容被中间人冒充或者篡改。
2) http和https的区别:
a) https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
b) http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
c) http和https使用的是完全不同的连接方式,端口也不一样,前者是80,后者是443。
d) http的连接很简单,是无状态的。https协议是由ssl+http协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
e) 在OSI模型中,http工作于应用层,而https工作于传输层。
3)对称加密与非对称加密:
对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方。
非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。
SSL建立连接过程:
1. client向server发送请求(如https://baidu.com),然后连接到server的443端口,发送的信息主要是随机值1和客户端支持的加密算法。
2. server接收到信息之后给予client响应握手信息,包括随机值2和匹配好的协商加密算法,该加密算法是client发送给server加密算法的子集(都有)。
a) server给client发送第二个响应报文是数字证书。服务端必须要有一套数字证书,可以自己制作,也可以向组织申请。区别:自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出提示页面,这套证书其实就是一对公钥和私钥。传送证书,这个证书其实就是公钥,只是包含了很多信息,如证书的颁发机构,过期时间、服务端的公钥,第三方证书认证机构(CA)的签名,服务端的域名信息等内容。
b) 客户端解析证书,这部分工作是由客户端的TLS来完成的,首先会验证公钥是否有效,比如颁发机构,过期时间等。如果发现异常,则会弹出一个警告框,提示证书存在问题。如果证书没有问题,那么就生成一个随即值(预主秘钥)。
3. 客户端认证证书通过后,接下来是通过随机值1、随机值2和预主秘钥组装会话秘钥。然后通过证书的公钥加密会话秘钥。
4. 服务端解密得到随机值1、随机值2和预主秘钥,然后组装会话秘钥,跟客户端会话秘钥相同。
5. 客户端通过会话秘钥加密一条消息发送给服务端,主要验证服务端是否接受客户端加密的消息。同样,服务端也会通过会话秘钥加密一条消息回传给客户端,如果客户端接受,表明SSL层连接建立完成了。
如何防止中间人篡改:
1. 中间人伪装成服务器端:无权威机构私钥无法加密,强行加密则客户端无法解密。若修改证书内容,会导致证书内容和证书签名不匹配。
2. 中间人伪装成客户端:它向CA寻求认证,CA要求提供域名的whois信息、域名管理邮箱等证明。中间人则无法证明自己是服务器端的拥有者。
如何选择http和https?
2. SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗(SSL有扩展可以部分解决这个问题,但比较麻烦,而且要求浏览器、操作系统支持,Windows XP就不支持这个扩展,考虑到XP的装机量,这个特性几乎没用)。
3. 根据ACM CoNEXT数据显示,使用https协议会使页面的加载时间延长近50%,增加10%到20%的耗电。
4. https连接缓存不如http高效,流量成本高。
5. https连接服务器端资源多,支持访客多的网站需要投入更大的成本。
6. https协议握手阶段比较费时,对网站的响应速度有影响,影响用户体验。比较好的方式是采用分而治之,类似12306网站的主页使用https协议,有关于用户信息等方面使用https。
http1.0与http1.1的区别?
1. HTTP1.0需要使用keep-alive参数来告知服务器要建立一个长连接,而HTTP1.1默认支持长连接;
2. HTTP1.1支持只发送header信息(不带任何body信息),如果服务器认为客户端有权限请求服务器,则返回100,否则返回401;
3. HTTP1.0是没有host域的,HTTP1.1才支持这个参数;
4. HTTP2.0使用了多路复用的技术,做到同一个连接并发处理多个请求,而且并发请求的数量比HTTP1.1大了好几个数量级;
5. HTTP1.1不支持header数据的压缩,HTTP2.0使用HPACK算法对header的数据进行压缩,这样数据体积小了,在网络上传输就会更快;
6. 对支持HTTP2.0的web server请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。
https了解吗?
一种无状态,以请求、应答方式运行的协议,他使用可扩展的语义和自述描述消息格式、与基于网路的超文本信息系统灵活的互动。
客户端发送一个HTTP请求,HTTP的请求格式如下:
• 请求字段:请求头中的头字段,但基本可以分为两大类:HOST、Referer
host:标识当前的链接是和哪一个服务建立的: referer来源的判断
• 响应字段:响应头中的字段,如Server,Data
server:哪一种类型的服务器data时间
• 通用字段:在请求头和响应头都可以出现:Content-type,Connection
content-type:请求头了解什么类型的数据connection:
get方法:
1. 根据HTTP规范,GET用于信息获取,而且应该是安全和幂等的。
2. get是被浏览器自动缓存的,如果下一次传输的数据相同,那么就会返回缓存中的内容,以求更快的传输数据。
3. get中的URL一般有长度限制,但是需要注意的是HTTP没有规定GET的长度,这个长度限制主要是浏览器和web服务器决定的,并且各个浏览器对长度的限制也各不相同。
4. get一次产生一个TCP数据包,浏览器会把请求头和请求数据一起出去,服务器响应200 ok。
http请求方法
get:特定的资源发出请求,本质就是一个发送一个请求来取得服务器的某一资源。
head:发送一个和get请求相一致的响应,不过响应体不会被返回,这一方法不传输整个响应内容,只是为了回去报头。
post:提交数据(例如上传文件),该请求可能会修改数据的内容,会增加数据的种类等等,就像insert一样,创建新的内容。
http1.1新增
put:向服务器发送数据,修改数据的内容但是不会增加数据的种类,就想updata一样。
delete:删除url标识的资源,delete请求后指定资源会被删除,delete也是幂等的。
options:允许客户端查看服务器的性能。
trace:回显服务器收到的请求,主要用于测试或诊断。
patch:对put方法的补充,用来对已知资源的更新。patch出现的比较晚,和put请求类似,同样用于资源的更新,但是有两点不同:
1. patch用于资源的部分更新,put用于资源的整体更新。
2. 资源不存在的时候,patch会创建一个新的资源,put只会对已存在资源进行更新。
connect: HTTP1.1中预留的能够将链接改为管道方法的代理服务器。
http状态码
1) 1XX 信息码,服务器收到请求,需要请求者继续执行操作
2) 2XX 成功码,操作被成功接收并处理
3) 3XX 重定向,需要进一步的操作以完成请求
4) 4XX 客户端错误,请求包含语法错误或无法完成请求