DAY15刷面试题

竟然第15天了 神奇 半个月了 今天是不记得从哪里找到的别人面试题

计算机网络的协议,分别在什么哪一层?

  • 第七层 应用层

  • 应用层:提供为应用软件而设的界面,以设置与另一应用软件之间的通信。

  • HTTP、HTTPS、FTP、TELNET、SSH、SMTP、POP3

  • 第六层 表示层

  • 表示层:把数据转换为能与接收者的系统格式兼容并适合传输的格式。

  • 第五层 会话层

  • 会话层:负责在数据传输中设置和维护电脑网络中两台电脑之间的通信连接。

  • 第四层 传输层

  • 传输层:把传输表头TH 加至数据以形成数据包。传输表头包含了所使用的协议等发送信息。

  • 传输控制协议TCP、用户数据报协议UDP

  • 第三层 网络层

  • 网络层:决定数据的路径选择和转寄,将网络表头NH 加至数据包,以形成分组。网络表头包含了网络数据。

  • 互联网协议IP

  • ICMP是网络层的补充,可以回送报文。用来检测网络是否通畅。
    Ping命令就是发送ICMP的echo包,通过回送的echo relay进行网络测试。ARP是正向地址解析协议,通过已知的IP,寻找对应主机的MAC地址。
    RARP是反向地址解析协议,通过MAC地址确定IP地址。比如无盘工作站和DHCP服务。

  • 第二层 数据链路层

  • 数据链路层:负责网络寻址、错误侦测和改错。当表头和表尾被加至数据包时,会形成帧。数据表头DLH 是包含了物理地址和错误侦测以及改错的方法。数据链表尾DLT是一串指示数据包末端的字符串。

  • 以太网、无线局域网WIFI、通用分组无线服务GPRS

  • 分两个子层:逻辑链路层LLC子层和介质访问控制MAC子层

  • 第一层 物理层

  • 物理层:在局部局域网上传送数据框,负责管理电脑通信设备和网络媒体之间的互通。包括了针脚、电压、线缆规范、集线器、中继器、网卡、主机适配器等。

说一下http协议1.0和2.0的区别

(1)新进的二进制格式
1.0的解析基于文本,文本的表现形式多样,要做到健壮性考虑的场景就比较多。
2.0的协议解析采用二进制的格式,只认0和1的组合,实现方便健壮。
(2)多路复用
2.0使用多路复用,既连接共享,每一个request都是用作连接共享机制的,一个request对应一个id,这样一个连接可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的id将request再归属到各个不同的服务端请求里。
(3)header压缩
1.0的header带有大量信息,每次都要重复发送
2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,避免重复的header传输,减少了需要传输的大小。
(4)服务端推送
2.0具有server push功能

http和https的区别

https协议需要到CA申请证书,一般免费证书很少,需要交费。
http协议运行在tcp上,所有传输都是明文传输,https是具有安全性的ssl解密传输协议,所有传输的内容都是经过加密的。
http和ttps使用的是不同的连接方式,使用的端口也不一样,http端口80,https端口443。
http的连接很简单,是无状态的,https协议是由ssl+http协议构建的可进行加密传输,身份认证的网络协议,比http协议安全。
https可以有效防止运营商的劫持,解决了放劫持问题。

http状态码有哪些

2开头的表示成功
200请求成功,一般用于get和post请求
3开头的表示重定向
301永久重定向,请求的资源已经被永远的移动到新URL,返回信息会包括新URL,浏览器会自动重定向到新URL,后面的新请求都将使用新的URL代替。
302临时重定向,但资源只是临时被移动。客户端应继续使用原有URL。
304表示可以在缓存中取数据(协商缓存)未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源。
4开头表示客户端错误
400客户端请求的语法错误,服务器无法理解。
403跨域,服务器理解请求客户端的请求,但是拒绝执行此请求。
404请求资源不存在,服务器无法根据客户端的请求找到资源(网页)。
5开头表示服务端错误
500服务器内部错误,无法完成请求。
501服务器不支持请求的功能,无法完成请求。

浏览器存储有了解吗(强缓存和协商缓存)

强缓存
当浏览器去请求某个文件的时候,服务端就在respone header里面对该文件做了缓存配置。缓存的时间、缓存类型都由服务端控制,具体表现为:
respone header 的cache-control,常见的设置是max-age public private no-cache no-store等

在浏览器加载资源时,先看cache-control里的max-age,判断数据有没有过期,如果没有直接使用该缓存,有些用户可能会在没有过期的时候就点了刷新按钮,这个时候浏览器就回去请求服务端,要想避免这样做,可以在cache-control里面加一个immutable。
强缓存总结

  • cache-control: max-age=xxxx,public
    客户端和代理服务器都可以缓存该资源;
    客户端在xxx秒的有效期内,如果有请求该资源的需求的话就直接读取缓存,statu code:200 ,如果用户做了刷新操作,就向服务器发起http请求
  • cache-control: max-age=xxxx,private
    只让客户端可以缓存该资源;代理服务器不缓存
    客户端在xxx秒内直接读取缓存,statu code:200
  • cache-control: max-age=xxxx,immutable
    客户端在xxx秒的有效期内,如果有请求该资源的需求的话就直接读取缓存,statu code:200 ,即使用户做了刷新操作,也不向服务器发起http请求
  • cache-control: no-cache
    跳过设置强缓存,但是不妨碍设置协商缓存;一般如果你做了强缓存,只有在强缓存失效了才走协商缓存的,设置了no-cache就不会走强缓存了,每次请求都回询问服务端。
  • cache-control: no-store
    不缓存,这个会让客户端、服务器都不缓存,也就没有所谓的强缓存、协商缓存了。

协商缓存
客户端请求该资源时发现其过期了,就会去请求服务器,而这时候去请求服务器的这过程就可以设置协商缓存。这时候,协商缓存就是需要客户端和服务器两端进行交互的。
设置协商缓存
response header里面的设置

etag: '5c20abbd-e2e8'
last-modified: Mon, 24 Dec 2018 09:49:49 GMT

etag:每个文件有一个,改动文件了就变了,就是个文件hash,每个文件唯一
last-modified:文件的修改时间,精确到秒
请求资源时,把用户本地该资源的 etag 同时带到服务端,服务端和最新资源做对比。
如果资源没更改,返回304,浏览器读取本地缓存。
如果资源有更改,返回200,返回最新的资源。
response header中的etag、last-modified在客户端重新向服务端发起请求时,会在request header中换个key名

etag的作用

  • 一些文件也许会周期性的更改,但是他的内容并不改变(仅仅改变的修改时间),这个时候我们并不希望客户端认为这个文件被修改了,而重新get;
  • 某些文件修改非常频繁,比如在秒以下的时间内进行修改,(比方说1s内修改了N次),if-modified-since能检查到的粒度是秒级的,这种修改无法判断(或者说UNIX记录MTIME只能精确到秒);
  • 某些服务器不能精确的得到文件的最后修改时间。

一般什么文件用强缓存下,什么东西用协商缓存?

index.html文件采用协商缓存,理由就是要用户每次请求index.html不拿浏览器缓存,直接请求服务器,这样就保证资源更新了,用户能马上访问到新资源,如果服务端返回304,这时候再拿浏览器的缓存的index.html,切记不要设置强缓存!!!

其他资源采用强缓存 + 协商缓存。

xss攻击和CSRF(XSRF)攻击了解吗,攻击形式?怎么样抵御这些攻击?

XSS:跨站脚本(Cross-site scripting)是一种网站应用程序的安全漏洞攻击,是代码注入的一种。它允许恶意用户将代码注入到网页上,其他用户在观看网页时就会受到影响。这类攻击通常包含了HTML以及用户端脚本语言。
CSRF:跨站请求伪造(Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF, 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

简单理解:
XSS: 通过客户端脚本语言(最常见如:JavaScript)
在一个论坛发帖中发布一段恶意的JavaScript代码就是脚本注入,如果这个代码内容有请求外部服务器,那么就叫做XSS!

CSRF:又称XSRF,冒充用户发起请求(在用户不知情的情况下),完成一些违背用户意愿的请求(如恶意发帖,删帖,改密码,发邮件等)。

XSS攻击形式:
1、绕过 XSS-Filter,利用 <> 标签注入 Html/JavaScript 代码;
2、利用 HTML 标签的属性值进行 XSS 攻击。例如:<img src=“javascript:alert(‘xss’)”/>;(当然并不是所有的 Web 浏览器都支持 Javascript 伪协议,所以此类 XSS 攻击具有一定的局限性)
3、空格、回车和 Tab。如果 XSS Filter 仅仅将敏感的输入字符列入黑名单,比如 javascript,用户可以利用空格、回车和 Tab 键来绕过过滤,例如:<img src=“javas cript:alert(/xss/);”/>;
4、利用事件来执行跨站脚本。例如:<img src=“#” onerror= “alert(1)”/>,当 src 错误的视乎就会执行 onerror 事件;
5、利用 CSS 跨站。例如:body {backgrund-image: url(“javascript:alert(‘xss’)”)};
XSS防御方法:
XSS 漏洞是由于对用户提交的数据没有经过严格的过滤处理造成的,所以防御的原则就是不相信用户输入的数据,对输入进行过滤,对输出进行编码。
1、使用 XSS Filter
针对用户提交的数据进行有效的验证,只接受我们规定的长度或内容的提交,过滤掉其他的输入内容。比如:
表单数据指定值的类型:年龄只能是 int 、name 只能是字母数字等。
过滤或移除特殊的 html 标签:<script>、<iframe>等。
过滤 js 事件的标签:onclick、onerror、onfocus等。

2、HTML 实体
特殊字符不允许在文本中直接使用,需要将实体转化为相应的实体编号。
空格 &nbsp ;
< 小于 &lt ;
> 大于 &gt ;
& 和 &amp ;
'' 引号 &quot ;

3、JavaScript编码
这条原则主要针对动态生成的JavaScript代码,这包括脚本部分以及HTML标签的事件处理属性(如onerror, onload等)。在往JavaScript代码里插入数据的时候,只有一种情况是安全的,那就是对不可信数据进行JavaScript编码,并且只把这些数据放到使用引号包围起来的值部分(data value)之中,除了上面的那些转义之外,还要附加上下面的转义:
\ 转成 \\
/ 转成 \/
; 转成 ;(全角;)

4、Http Only cookie
许多 XSS 攻击的目的就是为了获取用户的 cookie,将重要的 cookie 标记为 http only,这样的话当浏览器向服务端发起请求时就会带上 cookie 字段,但是在脚本中却不能访问 cookie,这样就避免了 XSS 攻击利用 js 的 document.cookie获取 cookie。

CSRF攻击形式:
1、用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
2、在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
3、用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
4、网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
5、浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

CSRF防御方法:

  • (1)验证 HTTP Referer 字段
    根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,验证其 Referer 值,如果是以网站安全开头的域名,则说明该请求是来自网站自己的请求,是合法的。如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。
    但是 Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心 Referer 值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。
  • (2)在请求地址中添加 token 并验证
    token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对,但这种方法的难点在于如何把 token 以参数的形式加入请求。
    但是难以保证 token 本身的安全。特别是在一些论坛之类支持用户自己发表内容的网站,黑客可以在上面发布自己个人网站的地址。由于系统也会在这个地址后面加上 token,黑客可以在自己的网站上得到这个 token,并马上就可以发动 CSRF 攻击。为了避免这一点,系统可以在添加 token 的时候增加一个判断,如果这个链接是链到自己本站的,就在后面添加 token,如果是通向外网则不加。不过,即使这个 csrftoken 不以参数的形式附加在请求之中,黑客的网站也同样可以通过 Referer 来得到这个 token 值以发动 CSRF 攻击。这也是一些用户喜欢手动关闭浏览器 Referer 功能的原因。
  • (3)在 HTTP 头中自定义属性并验证
    这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入 token 的不便,同时,通过 XMLHttpRequest 请求的地址不会被记录到浏览器的地址栏,也不用担心 token 会透过 Referer 泄露到其他网站中去。
    但是XMLHttpRequest 请求通常用于 Ajax 方法中对于页面局部的异步刷新,并非所有的请求都适合用这个类来发起,而且通过该类请求得到的页面不能被浏览器所记录下,从而进行前进,后退,刷新,收藏等操作,给用户带来不便。另外,对于没有进行 CSRF 防护的遗留系统来说,要采用这种方法来进行防护,要把所有请求都改为 XMLHttpRequest 请求,这样几乎是要重写整个网站,这代价无疑是不能接受的。

跨域是什么?

当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域。
跨域,是指浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制。

你知道的跨域方法?

  • JSONP
    JSONP通过同源策略涉及不到的"漏洞",也就是像img中的src,link标签的href,script的src都没有被同源策略限制到。JSONP只能get请求

  • document.domain
    只能跨一级域名相同的域(www.qq.om和www.id.qq.com , 二者都有qq.com)

  • location.hash+iframe
    因为hash传值只能单向传输,所有可以通过一个中间网页,a若想与b进行通信,可以通过一个与a同源的c作为中间网页,a传给b,b传给c,c再传回a

具体做法:在a中放一个回调函数,方便c回调。放一个iframe标签,随后传值
在b中监听哈希值改变,一旦改变,把a要接收的值传给c
在c中监听哈希值改变,一旦改变,调用a中的回调函数

  • window.name+iframe
    Access利用window.name不会改变(而且很大)来获取数据,
    a要获取b的数据,b中把数据转为json格式放到window.name中

  • postMessage
    a窗口向b窗口发送数据,先把data转为json格式,在发送。提前设置好messge监听
    b窗口进行message监听,监听到了以同样的方式返回数据,
    a窗口监听到message,在进行一系列操作

  • CORS
    通过自定义请求头来让服务器和浏览器进行沟通
    有简单请求和非简单请求
    满足以下条件,就是简单请求
    请求方法是HEAD、POST、GET
    请求头只有Accept、AcceptLanguage、ContentType、ContentLanguage、Last-Event-Id
    简单请求,浏览器自动添加一个Origin字段
    同时后端需要设置的请求头
    Access-Control-Allow-Origin --必须
    Access-Control-Expose-Headers

  • nginx代理跨域
    nginx模拟一个虚拟服务器,因为服务器与服务器之间是不存在跨域的,
    发送数据时 ,客户端->nginx->服务端
    返回数据时,服务端->nginx->客户端

为什么jsonp可以跨域?

可以用<script src="...js"></script>这样的方法来加载一个远程服务器的js脚本。那么把需要的跨域数据写入这个服务器上的脚本remote.js,然后引入这个脚本,就可以使用别人的服务器数据,这就是jsonp的实现原理。

进程和线程的区别

线程是不能单独存在的,它是由进程来启动和管理的,一个进程就是一个程序的运行实例。线程是依附于进程的,而进程中使用多线程并行处理能提升运算效率。线程之间共享进程中的数据。当一个进程关闭后,操作系统会回收进程所占用的内存;多线程的好处就是可以提高CPU的利用率,在多线程程序中,如果一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样可以大大地提高程序的效率。

浏览器是多线程还是单线程?

多线程。
(1)js引擎线程:js引擎有多个线程,一个主线程,其他的后台配合主线程。
作用:执行js任务(执行js代码,用户输入,网络请求)
(2)ui渲染线程
作用:渲染页面(js可以操作dom,影响渲染,所以js引擎线程和UI线程互斥,js执行时会阻塞页面渲染)
(3)浏览器事件触发线程
作用:控制交互,响应用户
(4)http请求线程
作用:ajax请求
(5)定时器触发线程
setTimeOut和setInteval
(6)事件轮询处理线程
轮询消息队列,event loop
所以异步是浏览器的两个或者两个以上线程共同完成的。比如ajax异步请求和setTimeout

说一下浏览器从输入url到展示内容中间发生了什么?

1、首先,在浏览器地址栏中输入url
2、浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容。若没有,则跳到第三步操作。
3、在发送http请求前,需要域名解析(DNS解析),解析获取相应的IP地址。
4、浏览器向服务器发起tcp连接,与浏览器建立tcp三次握手。
5、握手成功后,浏览器向服务器发送http请求,请求数据包。
6、服务器处理收到的请求,将数据返回至浏览器
7、浏览器收到HTTP响应
8、读取页面内容,浏览器渲染,解析html源码
9、生成Dom树、解析css样式、js交互
10、客户端和服务器交互
11、ajax查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值