文章目录
- 描述HTTP和HTTPS的区别
- Cookie和Session有什么区别
- BIO、NIO、AIO
- TCP三次握手和四次挥手
- 跨域请求是什么?有什么问题?怎么解决?
- 网页输入url,到渲染整个界面的整个过程,以及中间件用了什么协议
- Rest、Restful
- TCP的滑动窗口协议有什么⽤?讲讲原理。
- HTTP协议都有哪些⽅法?
- 交换机与路由器的区别?
- HTTP为啥无连接
- HTTP缓存
- Get和Post的区别
- Select、poll、epoll
描述HTTP和HTTPS的区别
HTTP:是互联网应用最为广泛的一种网络通信协议,基于TCP,可以使浏览器工作更为高效,减少网络传输
HTTPS:是HTTP的加强版,可以认为是HTTP+SSL(Secure Socket Layer)。在HTTP的基础上增加了一系列的安全机制。一方面保证数据传输安全,另一方面对访问者增加了验证机制。是目前现行架构下,最为安全的解决方案。
主要区别:
1.HTTP的连接是简单无状态的,HTTPS的数据传输是经过证书加密的,安全性更高
2.HTTP是免费的,而HTTPS需要申请证书,而证书通常是需要收费的,而且费用一般不低
3.他们的传输协议是不同的,所以他们使用的端口也是不一样的,HTTP默认是80端口,而HTTPS默认是443端口
HTTPS的缺点:
1.HTTPS的握手协议比较费时,所以会影响服务的响应速度以及吞吐量。
2.HTTPS也并不是完全安全的。他的证书体系其实并不是完全安全。并且HTTPS在面对DDOS这样的攻击时,几乎
起不到任何作用。
3.证书收费
HTTPS的通信过程:
1.客户端请求SSL连接,并将自己支持的加密规则发给网站
2.服务器端将自己的身份信息以证书形式发回给客户端。证书里面包含了网站地址,加密公钥,以及证书的颁发机构
3.获得证书后,客户端会做以下工作:验证证书合法性如果证书受信任,客户端会⽣成⼀串随机数的密码,并⽤证书提供的公钥进⾏加密。将加密好的随机数发给服务器。
4.获得到客户端发的加密了的随机数之后,服务器⽤⾃⼰的私钥进⾏解密,得到这个随机数,把这个随机数作为对称
加密的密钥。
5.之后服务器与客户之间就可以⽤随机数对各⾃的信息进⾏加密,解密。注意的是:证书是⼀个公钥,这个公钥是进
⾏加密⽤的。⽽私钥是进⾏解密⽤的。公钥任何都知道,私钥只有⾃⼰知道。这是⾮对称加密。⽽对称加密就是钥匙
只有⼀把,我们都知道。之所以⽤到对称加密,是因为对称加密的速度更快。⽽⾮对称加密的可靠性更⾼。
Cookie和Session有什么区别
当服务器tomcat第一次接收到客户端的请求时,会开辟一块独立的session空间,建立一个session对象,同时会生成一个session id,通过响应头的方式保存到客户端浏览器的cookie当中。以后客户端的每次请求,都会在请求头部带上这个session id,这样就可以对应上服务端的一些会话的相关信息,比如用户的登陆状态。
如果没有客户端的Cookie,Session是无法进行身份验证的。
当服务端从单体应用升级为分布式之后,cookie+session这种机制要怎么扩展?
1.session黏贴: 在负载均衡中,通过一个机制保证同一个客户端的所有请求都会转发到同一个tomcat实例当中。问题:当这个tomcat实例出现问题之后,请求就会被转发到其他实例,这时候用户的session信息就丢了。
2.session复制:当一个tomcat实例上保存session信息后,主动将session复制到集群的其他实例中。
问题:复制是需要时间的,在复制过程中,会出现session丢失的。
3.session共享,把session放到所有实例可以访问的第三方,比如redis。
BIO、NIO、AIO
BIO:同步阻塞IO,通过BIO读取数据时,线程会阻塞住,并且需要线程主动去查询是否有数据可读,并且需要处理完一个Socket之后才能处理下一个Socket
NIO:同步非阻塞IO,使用NIO读取数据时,线程不会阻塞,但需要线程主动的去查询是否有IO事件
AIO:异步非阻塞IO,使用AIO读取数据时,线程不会阻塞,并且当有数据可读时会通知给线程,不需要线程主动去查询
TCP三次握手和四次挥手
TCP协议是7层网络协议中的传输层协议,负责数据的可靠传输。
在建立TCP连接时,需要通过三次握手来建立,过程是:
1.客户端向服务端发送一个SYN
2,服务端接收到SYN后,给客户端发送一个SYN ACK
3,客户端接收到SYN ACK后,再给服务端发送一个ACK
在断开TCP连接时,需要通过四次挥手来断开,过程是:
1,客户端向服务端发送FIN
2,服务端接收FIN后,向客户端发送ACK,表示我接收到了断开连接的请求,客户端你可以不发数据了,不过服务端这边可能还有数据正在处理
3.服务端处理完所有数据后,向客户端发送FIN,表示服务端现在可以断开连接
4.客户端收到服务端的FIN,向服务端发送ACK,表示客户端也会断开连接了
跨域请求是什么?有什么问题?怎么解决?
跨域是指浏览器在发起网络请求时,会检查该请求所对应的协议、域名、端口和当前网页是否一致,如果不一致则浏览器会进行限制,比如在www.baidu.om的某个网页中,如果使用ajax去访www.jd.com是不行的,但是如果是img、iframesript等标签的src属性去访问则是可以的,之所以浏览器要做这层限制,是为了用户信息安全。但是如果开发者想要绕过这层限制也是可以的:
1.response添加header,比如resp.setHeader(“Access-Contro-Allow-0rigin”,“*”);表示可以访问所有网站,不受是否同源的限制
2.jsonp的方式,该技术底层就是基于script标签来实现的,因为script标签是可以跨域的
3.后台自己控制,先访问同域名下的接口,然后在接口中再去使用HTTPClient等工具去调用目标接口4.网关,和第三种方式类似,都是交给后台服务来进行跨域访问
网页输入url,到渲染整个界面的整个过程,以及中间件用了什么协议
过程(主要分为三步):
1.DNS解析:用户输入url后,需要通过DNS解析找到域名对应的ip地址,有了ip地址才能找到服务器端。首先会查找
浏览器缓存,是否有对应的dns记录。再继续按照操作系统缓存——路由缓存——isp的dns服务器——根服务器的顺
序进行DNS解析,直到找到对应的ip地址
2.客户端(浏览器)和服务器交互。浏览器根据解析到的ip地址和端口号发起HTTP请求,请求到达传输层,这里也
就是TCP层,开始三次握手建立连接。服务器收到请求后,发送相应报文给客户端(浏览器),客户端收到相应报文
并进行解析,得到html页面数据,包括html、js、css等。
3.客户端(浏览器)解析html数据,构建DOM树,再构造呈现树(render树),最终绘制到浏览器页面上。
具体步骤为:
1.DNS域名解析
2.建立TCP连接
3.发送HTTP请求
4.服务器处理请求
5.返回响应结果
6.关闭TCP连接
7.浏览器解析HTML
8.浏览器布局渲染
涉及到TCP/IP协议簇,包括DNS、TCP、IP、HTTP协议等等。
Rest、Restful
Rest(Representational State Transfer)表现层状态转移
REST是一种风格。用是将api提供的查看(view),创建(create),编辑(edit)和删除(delete)接口直接映射到HTTP 中已实现的GET,POST,PUT和DELETE方法。
Rest的另一重要部分就是为既定好请求的类型来响应正确的状态码。
2xx = Success(成功)
3xx = Redirect(重定向)
4xx = User error(客户端错误)
5xx = Server error(服务器端错误)
Server提供的Restful API中,URL只使用名词来指定资源,原则上不使用动词。
GET 用来获取资源,
POST 用来新建资源(也可以用于更新资源),
PUT 用来更新资源,
DELETE 用来删除资源
主要概括为:就是用URL定位资源,用HTTP描述操作。
看Url就知道要什么看http method就知道干什么看http status code就知道结果如何
TCP的滑动窗口协议有什么⽤?讲讲原理。
滑动窗⼝协议是传输层进⾏流控的⼀种措施,接收⽅通过通告发送⽅⾃⼰的窗⼝⼤⼩,从⽽控制发送⽅的发送速度,从⽽达到防⽌发送⽅发送速度过快⽽导致来不及接受。
1.有一组数据通过TCP传输,TCP先 将其分成若干段,假设有四个段seg1,seg2,seg3,seg4,依次发送出去,此时假设接收端接收到了 seg1 seg2 seg4;
2.此时接收端的行为是回复一个 ACK 包说明已经接收到,并将 seg4 进行缓存(保证顺序,产生一个保存 seg3 的 hole);
3.发送端收到 ACK 之后,就会将对应的数据包变为已确认状态,这个时候窗口向右移动;
4.假设接收端通告的 Window Size 仍然不变,此时窗口右移,产生一些新的空位,这些是接收端允许发送的范畴;
5.对于丢失的 seg3,如果超过一定时间,TCP 就会重新传送(重传机制),重传成功会 seg3 seg4 一块被确认,不成功,seg4 也将被丢弃。
HTTP协议都有哪些⽅法?
- GET 请求获取由Request-URI所标识的资源。
- POST 在Request-URI所标识的资源后附加新的数据。
- HEAD 请求获取由Request-URI所标识的资源的响应消息报头。
- OPTIONS 请求查询服务器的性能,或查询与资源相关的选项和需求。
- PUT 请求服务器存储⼀个资源,并⽤Request-URI作为其标识。
- DELETE 请求服务器删除由Request-URI所标识的资源。
- TRACE 请求服务器回送收到的请求信息,主要⽤语测试或诊断。
交换机与路由器的区别?
1、⼯作层次不同
最初的交换机⼯作在OSI模型中的数据链路层,⼯作原理简单
路由器⼯作在OSI模型中的⽹络层,得更多协议信息,做更智能的转发决策
2、数据转发所依据的对象不同
交换机是利⽤物理地址(MAC地址),确定转发的⽬的地址。(MAC固化硬件,⼀般不可更改)
路由器是利⽤IP地址,确定转发的⽬的地址。(IP通常为⽹关或系统⾃动分配的)
3、是否可以分割⼴播域
传统的交换机可以分割冲突域,不能分割⼴播域,⽽路由器可以分割⼴播域
由交换机连接的⽹段仍然属于同⼀⼴播域,⼴播数据报会在交换机连接的所有⽹段上传播,某些情况导致通信拥和安全漏洞。连接到路由器上的⽹段被分配成不同的⼴播域,所以,⼴播数据不穿过路由器
HTTP为啥无连接
HTTP协议又称超文本传输协议;是OSI模型中的第七层应用程中协议;具有以下特点:
1、支持客户/服务器模式;
2、简单快速;
3、灵活;
4、无连接;
5、无状态;
4、5点:因为HTTP请求是连接后就马上断开,每次请求都重新建立连接,然后再断开,所以是没有状态的,服务端是没办法知道客户端的状态的。服务端能做的只是等待客户端连接,无法主动发数据给客户端,这是HTTP连接的主要特点。
无连接:指的是每次连接只处理一个请求,服务端处理完客户端一次请求,等到客户端作出回应之后便断开连接;这种方式有利于节省传输时间;然后随着互联网的发展,一台服务器同一时间处理的请求越来越多,如果依然采用原来的方式,将会在建立和断开连接上花费大部分时间;为了避免这一劣势。
HTTP/1.0:持久连接被提出来;即当一个TCP连接服务器多次请求:客户端会在请求Header中携带Connection:Keep-Alive;向服务器请求持久连接,如果服务端允许就会在响应报文中加上相同的字段; HTTP/1.1时代:持久连接称为了默认的连接方式;同时持久连接的弊病也展现出来,即所有的连接都是串行的,HOLB;当某一个请求阻塞时就会导致同一条连接的后续请求被阻塞; 为了解决这一问题:提出了pipellining的概念;客户端发起一次请求时不必等待响应便直接发起第二个请求;服务端按照请求的顺序一次返回结果; SPDY和HTTP/2:multiplexing:多路复用技术出现;能够让多个请求和响应的传输完全混杂在一起进行;通过streamID来互相区别;
PS:HTTP借助于底层的TCP虚拟连接,HTTP协议本身无需连接;就好比A和B打电话,A和B是借助于底层的简化先连接交换信息;但是A和B本身无需连接; 无状态:是指服务端对于客户端每次发送的请求都认为它是一个新的请求,上一次会话和下一次会话没有联系; HTTP 协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求“点到为止”不会造成不必要连接占用,缺点在于每次请求会传输大量重复的内容信息。
HTTP缓存
http缓存指的是: 当客户端向服务器请求资源时,会先抵达浏览器缓存,如果浏览器有“要请求资源”的副本,就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源。
常见的http缓存只能缓存get请求响应的资源,对于其他类型的响应则无能为力,所以后续说的请求缓存都是指GET请求。
http缓存都是从第二次请求开始的。第一次请求资源时,服务器返回资源,并在respone header头中回传资源的缓存参数;第二次请求时,浏览器判断这些请求参数,命中强缓存就直接200,否则就把请求参数加到request header头中传给服务器,看是否命中协商缓存,命中则返回304,否则服务器会返回新的资源。
根据是否需要重新向服务器发起请求来分类,可分为(强制缓存,协商缓存) 根据是否可以被单个或者多个用户使用来分类,可分为(私有缓存,共享缓存) 强制缓存如果生效,不需要再和服务器发生交互,而协商缓存不管是否生效,都需要与服务端发生交互。下面是强制缓存和协商缓存的一些对比:
Get和Post的区别
1.请求方式:GET通过URL传输数据,POST是通过请求体传输数据
2.请求长度:GET的请求长度受URL长度限制,POST的请求长度主要受HTTP协议和服务器配置的限制
3.幂等性:GET请求是幂等的,POST请求不是
4.缓存:GET请求的响应结果可以被浏览器缓存,POST请求的响应结果一般不被缓存
5.安全性:GET请求的数据在URL中可见,POST请求的数据在请求体中,相对更安全
Select、poll、epoll
Select:
1.