一.计算机网络
1.get请求和post请求的区别
本质上都是TCP连接
GET产生一个TCP数据包;POST产生两个TCP数据包
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据)
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
GET在浏览器回退时是无害的,而POST会再次提交请求。
GET请求只能进行url编码,而POST支持多种编码方式。
GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
GET请求在URL中传送的参数是有长度限制的,而POST么有。
GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
GET参数通过URL传递,POST放在Request body中。
常见状态码:(写项目多了肯定会遇到过)
2.在浏览器网址输入一个url后直到浏览器显示页面的过程(这边面试官可能会详细的考察DNS服务器的知识)
3.tcp三次握手和四次挥手的过程(为什么不可以两次握手,为什么握手要三次,挥手需要四次)
4.七层OSI模型或TCP/IP协议模型(各层分别实现了什么协议)
5.各种io模型的知识(BIO,NIO,AIO)
6.http协议和tcp协议的区别
7.https和http的区别
8.https的请求过程
我们知道,HTTP请求都是明文传输的,所谓的明文指的是没有经过加密的信息,如果HTTP请求被黑客拦截,并且里面含有银行卡密码等敏感数据的话,会非常危险。为了解决这个问题,Netscape 公司制定了HTTPS协议,HTTPS可以将数据加密传输,也就是传输的是密文,即便黑客在传输过程中拦截到数据也无法破译,这就保证了网络通信的安全。
密码学基础
在正式讲解HTTPS协议之前,我们首先要知道一些密码学的知识。
明文: 明文指的是未被加密过的原始数据。
密文:明文被某种加密算法加密之后,会变成密文,从而确保原始数据的安全。密文也可以被解密,得到原始的明文。
密钥:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数。密钥分为对称密钥与非对称密钥,分别应用在对称加密和非对称加密上。
对称加密:对称加密又叫做私钥加密,即信息的发送方和接收方使用同一个密钥去加密和解密数据。对称加密的特点是算法公开、加密和解密速度快,适合于对大数据量进行加密,常见的对称加密算法有DES、3DES、TDEA、Blowfish、RC5和IDEA。
其加密过程如下:明文 + 加密算法 + 私钥 => 密文
解密过程如下: 密文 + 解密算法 + 私钥 => 明文
对称加密中用到的密钥叫做私钥,私钥表示个人私有的密钥,即该密钥不能被泄露。
其加密过程中的私钥与解密过程中用到的私钥是同一个密钥,这也是称加密之所以称之为“对称”的原因。由于对称加密的算法是公开的,所以一旦私钥被泄露,那么密文就很容易被破解,所以对称加密的缺点是密钥安全管理困难。
非对称加密:非对称加密也叫做公钥加密。非对称加密与对称加密相比,其安全性更好。对称加密的通信双方使用相同的密钥,如果一方的密钥遭泄露,那么整个通信就会被破解。而非对称加密使用一对密钥,即公钥和私钥,且二者成对出现。私钥被自己保存,不能对外泄露。公钥指的是公共的密钥,任何人都可以获得该密钥。用公钥或私钥中的任何一个进行加密,用另一个进行解密。
被公钥加密过的密文只能被私钥解密,过程如下:
明文 + 加密算法 + 公钥 => 密文, 密文 + 解密算法 + 私钥 => 明文
被私钥加密过的密文只能被公钥解密,过程如下:
明文 + 加密算法 + 私钥 => 密文, 密文 + 解密算法 + 公钥 => 明文
由于加密和解密使用了两个不同的密钥,这就是非对称加密“非对称”的原因。
非对称加密的缺点是加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
在非对称加密中使用的主要算法有:RSA、Elgamal、Rabin、D-H、ECC(椭圆曲线加密算法)等。
HTTPS通信过程
HTTPS协议 = HTTP协议 + SSL/TLS协议,在HTTPS数据传输的过程中,需要用SSL/TLS对数据进行加密和解密,需要用HTTP对加密后的数据进行传输,由此可以看出HTTPS是由HTTP和SSL/TLS一起合作完成的。
SSL的全称是Secure Sockets Layer,即安全套接层协议,是为网络通信提供安全及数据完整性的一种安全协议。SSL协议在1994年被Netscape发明,后来各个浏览器均支持SSL,其最新的版本是3.0
TLS的全称是Transport Layer Security,即安全传输层协议,最新版本的TLS(Transport Layer Security,传输层安全协议)是IETF(Internet Engineering Task Force,Internet工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。在TLS与SSL3.0之间存在着显著的差别,主要是它们所支持的加密算法不同,所以TLS与SSL3.0不能互操作。虽然TLS与SSL3.0在加密算法上不同,但是在我们理解HTTPS的过程中,我们可以把SSL和TLS看做是同一个协议。
HTTPS为了兼顾安全与效率,同时使用了对称加密和非对称加密。数据是被对称加密传输的,对称加密过程需要客户端的一个密钥,为了确保能把该密钥安全传输到服务器端,采用非对称加密对该密钥进行加密传输,总的来说,对数据进行对称加密,对称加密所要使用的密钥通过非对称加密传输。
HTTPS在传输的过程中会涉及到三个密钥:
服务器端的公钥和私钥,用来进行非对称加密
客户端生成的随机密钥,用来进行对称加密
一个HTTPS请求实际上包含了两次HTTP传输,可以细分为8步。
1.客户端向服务器发起HTTPS请求,连接到服务器的443端口
2.服务器端有一个密钥对,即公钥和私钥,是用来进行非对称加密使用的,服务器端保存着私钥,不能将其泄露,公钥可以发送给任何人。
3.服务器将自己的公钥发送给客户端。
4.客户端收到服务器端的证书之后,会对证书进行检查,验证其合法性,如果发现发现证书有问题,那么HTTPS传输就无法继续。严格的说,这里应该是验证服务器发送的数字证书的合法性,关于客户端如何验证数字证书的合法性,下文会进行说明。如果公钥合格,那么客户端会生成一个随机值,这个随机值就是用于进行对称加密的密钥,我们将该密钥称之为client key,即客户端密钥,这样在概念上和服务器端的密钥容易进行区分。然后用服务器的公钥对客户端密钥进行非对称加密,这样客户端密钥就变成密文了,至此,HTTPS中的第一次HTTP请求结束。
5.客户端会发起HTTPS中的第二个HTTP请求,将加密之后的客户端密钥发送给服务器。
6.服务器接收到客户端发来的密文之后,会用自己的私钥对其进行非对称解密,解密之后的明文就是客户端密钥,然后用客户端密钥对数据进行对称加密,这样数据就变成了密文。
7.然后服务器将加密后的密文发送给客户端。
8.客户端收到服务器发送来的密文,用客户端密钥对其进行对称解密,得到服务器发送的数据。这样HTTPS中的第二个HTTP请求结束,整个HTTPS传输完成。
9.http协议的发展历程
HTTP/0.9版本
首先它只有一个命令GET
HTTP/1.0版本
增加了很多命令。比如:POST、PUT、HEADER这些命令。
增加了status code和header相关的内容。status code是用来描述服务器端处理某一个请求之后的状态的;header主要包含:请求和发送数据的描述以及对这部分数据进行操作的方法。
3.HTTP/1.1版本
这个版本是在HTTP/1.0的基础上增加了一些功能来优化网络连接的过程。
在这个版本支持了持久连接。在HTTP/1.0版本里面,一个http请求要发送就要先在客户端和服务器端之间创建一个TCP连接,创建完这个TCP连接之后,等服务器端返回完数据之后,这个TCP连接就关闭了。
这个成本是相对比较高的,因为在建立一个TCP连接的过程中要进行http的三次握手,这一部分是通过TCP来完成的,在创建这个连接的过程中消耗是比较高的,延迟也会比较高。
所以如果在建立完一个连接之后,它可以不关闭,之后新的http请求就可以一直在这个连接里面进行数据发送的话,它的性能和效率肯定会提升很多,HTTP/1.1已经实现了这个功能。
增加了pipeline。可以在同一个TCP连接里面发送多个http请求,就是上面说的那样。但是在HTTP/1.1里面,虽然是可以在同一个TCP连接里面发送多个http请求,但是服务器端对于进来的请求,是要按照顺序进行数据返回的。
因此,如果前一个请求等待时间非常长,而后一个请求处理得比较快。这个时候后一个请求不能先发送,而是要等第一个请求数据全部发送完成之后,才能进行发送,即是串行的。等待的这部分时间就体现出了与并行传输性能之间的差距。
而这个在HTTP/2里面得到了优化。
4.HTTP/2版本
所有数据都是以二进制进行传输的。在HTTP/1.1里面大部分的数据传输是通过字符串,所以数据的分片方式是不太一样的。在HTTP/2里面所有的数据都是以帧进行传输的。
正是因为有了这个好处,同一个连接里面发送多个请求时,服务器端不再需要按照顺序来返回处理后的数据了。而是可以在返回第一个请求里面数据的时候,同时返回第二个请求里面的数据。这样的并行传输能够更大限度地提高web应用的传输效率。
新增头信息压缩以及推送等功能,提高了传输效率。HTTP/2其实主要就是改善了HTTP/1.1里面造成性能低下的一些问题。
第一个头信息的压缩。在HTTP/1.1里面每一次发送请求和返回请求,很多http头都是必须要进行完整的发送和返回的,但是这一部分头信息里面有很多的内容比如说:Headers字段、Content-Type、accept等字段是以字符串的形式保存的。
所以占用较大的带宽量。所以HTTP/2里面对头信息进行了压缩,可以有效地减少带宽使用;
第二个是推送的功能。指的是HTTP/2之前,只能由客户端发送数据,服务器端返回数据。客户端是主动方,服务器端永远是被动方。在HTTP/2里面有了”推送”的概念,也就是说服务器端可以主动向客户端发起一些数据传输。
举个例子:我们知道一个web页面加载时会要求一些html、css、js等文件,css和js文件是以链接的形式在html文本里面显示的,只有通过浏览器解析了html里面的内容之后,才能根据链接里面包含的URL地址去请求对应的css和js文件。
在HTTP/2之前,这个传输过程会包含顺序问题,需要先请求到html的文件,通过浏览器运行解析这个html文件之后,才能去发送css的请求和js的请求。
HTTP/2中有了推送功能之后,在请求html的同时,服务器端可以主动把html里面所引用到的css和js文件推送到客户端,这样html、css和js的发送就是并行的而不是串行的,整体的传输效率和性能就提高了不少。
10.lvs,nginx,HA在七层网络协议中分别作用于哪层,各自的区别
11.tcp如何实现可靠传输(如何实现udp的可靠传输)
12.tcp和udp的区别
二.操作系统
1.线程和进程的区别(可能会问到协程)
2.进程的调度算法
3.linux中几种io模型(select,poll,epoll)
4.分页,分段,段页的区别
5.操作系统的作用和功能
6.死锁的定义以及如何避免死锁(银行家算法)
7.进程的通信方式
8.线程的七态模型
9.进程间同步与互斥的区别,线程同步的方式
10.动态链接库与静态链接库的区别
动态链接库:在运行时加载
静态链接库:在编译时直接联到可执行文件中
三.数据结构
1.如何检验链表是否有环
2.常用的排序算法(算法复杂度,是否稳定,空间复杂度)
3.二叉树和B树的区别
4.B树和B+树的区别
5.hashMap解决hash冲突的几种方式
6.红黑树和平衡二叉树的区别
7.霍夫曼编码的应用
压缩与解压缩
8.数组和链表的区别
9.10w条数据如何找出前一百条频繁数据
10.100个有序数列如何合成一个大数组