计算机网络八股整理(二)
应用层
1:dns的全称了解过吗?
dns全称domain-name-system,翻译过来就是域名系统,是在计算机网络中将域名转换成ip地址的分布式数据库系统;
域名服务器的层级类似一个树状结构:从上到下分别是根dns服务器,顶级域dns服务器和权威dns服务器;因为是一个树状结构,所以任意一个服务器可以找到根dns服务器从而找到任意目标dns服务器;
2:dns域名解析的工作流程?
首先客户端获取域名后去访问本地dns服务器,查看本地dns服务器缓存的表格中有没有对应的域名,没有的话
本地dns服务器就会去问根dns服务器,根dns服务器不会进行域名解析,而是指路,根dns服务器告诉本地dns服务器域名的顶级域dns服务器的地址,然后本地dns服务器去访问顶级域dns服务器,顶级域dns服务器就会指路给权威dns服务器,再去访问权威dns服务器,权威dns服务器会告诉本地dns服务器对应的ip地址,然后本地dns服务器就会将IP地址返回给客户端,客户端就能与服务器建立连接;
3:dns默认的端口是多少
dns默认的端口是53;
4:dns底层使用了udp还是tcp;
dns底层使用了udp传输协议,因为udp低延迟,简单快速,轻量级更适合dns这种需要快速响应的域名解析服务;
1:低延迟:因为udp是一种无连接的传输协议,不需要在传输前建立连接,延迟更低;
2:简单快速:因为udp不需要做连接管理和流量控制所以传输速度快;
3:轻量级:是因为udp头部较小;
虽然使用udp可能会造成丢包或者数据不完整,但是对于dns来说这些风险可以容忍,dns通过一些机制来保证数据的可靠性,比如超时重发,请求重试,缓存等;
5:http是不是无状态的?
http是无状态的,每次请求都是独立,且多次请求之间不会共享数据;
可以使用会话跟踪技术,如cookie,和session来跟踪用户状态,从而实现一定程度上的状态保持;
6:携带cookie的http请求是有状态的还是无状态的?cookie是http协议族的一部分,那为啥还说http是无状态的?
携带cookie的http请求可以实现在一定程度上的状态保持,因为cookie是在客户端保存会话信息和状态信息的一种机制。在发送http请求的时候携带上cookie,服务端读取cookie中的信息可以用来保持用户特定状态。所以虽然http是无状态的,但是可以通过cookie来实现一定程度上的状态保持;
cookie是http协议族的一部分,但是http协议设计的初衷就是无状态的请求,每个请求都是相互独立的,而cookie是一种补充机制,可以使用cookie来实现一定程度上的状态保持;
7:cookie和session有什么区别?
cookie和session在存储位置,数据容量,安全性,生命周期等方面有一定的区别:
1:存储位置:cookie存储在客户端,每次请求时都会携带cookie到服务端。session存储在服务端,由服务端分发session ID,通过cookie或者是url重写将session ID发送给客户端,客户端在访问时就携带上session ID,服务器根据sessionID找到对应的session;
2:数据容量:cookie存储在客户端,容量一般是4kb,而且浏览器不允许同一个域名有过多的cookie;而session存储在服务端,理论上没有容量限制,主要取决于服务器的内存;
3:安全性:cookie存储在客户端,可能会收到xss攻击;session存储在客户端,比cookie安全性强一些,但也可能受到session劫持和会话固定攻击;
4:生命周期:cookie可以设置过期时间,超过过期时间cookie会失效,也可以设置会话cookie,即浏览器关闭时,cookie失效;
session在客户端关闭浏览器时失效,也可以设置过期时间;
拓展1:cookie和session的优缺点?
cookie的优点:是http中支持的;
cookie的缺点:1:只有在浏览器中可用,移动设备等不可用;2:不安全,用户可以禁用cookie;3:不支持跨域;
session的优点:存储在服务器中,安全;
session的缺点:1:只存储在单台服务器中,在集群环境下,进行负载均衡后可能会不可用。2:cookie的缺点;
8:cookie,session,token的区别:
1:session存储在服务端,可以理解为一个状态列表,拥有唯一的标识符sessionID,通常存储在cookie。客户端发送请求时在cookie中携带sessionID, 服务端根据列表查询对应的session数据,依赖于cookie;
2:cookie类似于令牌,携带sessionID,存储于客户端,由浏览器自动添加;
3:token也是一种令牌,将用户的信息进行加密后,发送给用户,用户下次请求需要在cookie或者其他位置携带token,服务端进行解密后就能获取用户信息,通常由开发者手动添加;
9:如果客户端禁用了cookie,session还能使用吗?
默认情况下,禁用了cookie之后session是无法正常使用的,因为sessionID的传递依赖于cookie;
但是可用使用别的方法传递sessionID:
1:url重写:将sessionID拼接在url中,服务端通过解析url获取sessionID,但是这样使url不是那么整洁;而且如果用户分享连接可能会泄露sessionID;
2:隐藏表单字段:将sessionID存储在html表单的隐藏字段中,服务端通过解析表单字段获取sessionID,但是这种情况只能用于表单提交的情况,不能用于链接点击和ajax请求;
10:如果我把数据存储到localstorage中或者是cookie中有什么区别?
数据容量:cookie存储在客户端,一般容量大小在4kb,而localstorage的容量更大可以达到几MB;
数据发送:发送请求时,会携带cookie从而实现多次请求之间的数据共享。而localstrorage只会存储在客户端浏览器中,不会自动发送出去,一般可以用来同一域名多个页面的数据共享;
安全性:cookie会发送到服务端,有被窃听的风险,安全性不高,而localstotage存储在服务器端一般较安全;
生命周期:cookie可以设置过期时间,超过过期时间就会失效,而localstorage持久化存储在服务端,一般需要手动删除或者使用代码删除;
11:什么数据应该存储在cookie中,什么数据应该存储在localstorage?
cookie适用于服务端和客户端传递数据,跨域访问,设置过期时间,localstorage适合存储大量数据,相同域名下的不同页面共享数据,永久存储数据;
12:jwt令牌和传统令牌有什么区别?
1:无状态性:jwt令牌是无状态的,它不会存储在服务端中。jwt包含了一些必要信息,如用户身份,权限信息;
2:安全性:jwt通过密钥对令牌进行签名,保证了密钥的完整和真实性,只有持有密钥才能对令牌进行解析;
3:跨域访问:jwt存储在请求头或者参数中,无需cookie就能进行跨域访问;
13:jwt令牌包含哪些部分?
jwt令牌包含头部,载荷,和签名:
头部由签名算法和令牌类型组成;
有效载荷为自定义信息;
签名是将头部,载荷和密钥通过算法进行计算而来的字符串;
其中头部和载荷都是JSON格式通过base64编码成字符串;
14:jwt为什么能解决集群部署?什么是集群部署?
在传统的令牌和cookie中,请求将令牌或者cookie保存在服务器内存或者数据库中,如果是集群部署,每次访问的服务器不同,cookie和令牌都要重新获取,比如要用户重新登录,这带来了额外的开销;
而jwt是无状态的,服务端无需存储jwt相关信息,jwt存储了一些必要信息如用户身份和权限,集群中的服务器只要解析jwt的内容就能获取相关信息用来维持特定状态;解决了集群部署的问题;
15:jwt的缺点是什么?
jwt一旦派发出去在失效之前都是有效,无法进行撤销;
如果解决这个问题,我们可以使用内存数据库比如redis,创建一个黑名单,将想要其失效的jwt加入到黑名单中,这样每次在使用jwt之前都会判断jwt是否在黑名单中;
16:jwt如果泄露了怎么办,如何解决?
1:及时失效令牌:让旧的令牌失效无法使用;
2:刷新令牌:刷新令牌获取新的令牌,让旧的失效;
3:黑名单:服务端维护黑名单,将旧的令牌加入黑名单;
17:前端是如何存储jwt的?
jwt存储在客户端,可以存储在localstotrage中,也可以存储在cookie,sessionstotrage中;
各自的优缺点:
1:localstotrage:
优点:存储空间大,一般都有几MB,而且不随着请求发送到服务端,所以不会出现在http缓存和日志中;
缺点:可能会受到xss攻击,恶意的javascpirt可以盗取jwt;
2:sessionstotrage:
优点:和localstotrage一样存储空间大,窗口关闭会清除缓存,一定程度上降低了泄露的风险;
缺点:每次刷新和打开新标签页使用同样的应用都要重新登录影响用户体验;
3:cookie:
优点:可以使用httponly来防止javaspript的访问,降低xss的风险。也可以设置secure标志来使用https发送请求,提高了安全性;
缺点:存储空间小只有4kb,而且每次访问会携带,增加性能负担;
18:都有http协议了为什么还会有rpc?
1:首先rpc本质上不是一种协议,是一种调用方式,像grpc,thrift才算是协议,他们是实现了rpc调用的协议。一般用于程序员像调用本地方法一样调用远程方法;
2:对于有多端服务的软件来说,对外一般用http,rpc用于集群不同服务之间的调用;
3:rpc出现的比http早,且性能要比http1.1要强;
4:虽然http2.0的性能对http1.1有提升,可能比rpc性能还有还要好,但是是近几年才推出,不太可能替代rpc;
19:http长连接和websocket的区别?
1:全双工和半双工:tcp是全双工的协议,虽然http1.1是基于tcp协议,但是http1.1是半双工协议,对于服务端主动推送服务端的场景不太友好,所以需要使用全双工协议websocket;
2:应用场景:http1.1是基于请求应答的协议,由客户端主动发送请求,服务端响应,服务端不能主动发送数据。对于一些简单场景可用通过定时轮询或者长轮询来实现服务器主动推送;对于需要频繁进行通信的场景可以使用websocket双向通讯协议;
20:nginx负载均衡的算法有哪些?
1:轮询:按照顺序依次将请求分配给后端服务器;这个算法最简单,但是无法处理服务器访问速度突然变慢或者客户端有连续访问需求的场景;
2:ip哈希:通过ip的哈希结果来分配后端服务器,同一个IP始终分配给同一台服务器;适用于保持同一个客户端的请求一直方式给同一个服务器的场景如会话保持。
3:url哈希:根据url的哈希结果来分配后端服务器,一个url定向发送给后端的一个服务器;
4:最短响应时间:根据响应时间来分配请求,优先分配给响应时间最短的后端服务器。
5:加权轮询:根据权重将请求分配给后端服务器,权重越大的分配的请求越多,适用于后端服务器性能不同的场景,可以提高高性能服务器的利用率;
21:nginx位于七层网络结构的那一层?
nginx位于应用层,因为主要处理http请求和响应;
实现负载均衡和反向代理;