1,什么是http协议
超文本传输协议,通过浏览器和服务器进行数据交互,进行超文本(文本、图片、视频等)传输的规定
http2.0有哪些参数
二进制分帧 这是一次彻底的二进制协议,头信息和数据体都是二进制,并且统称为"帧":头信息帧和数据帧
头部压缩 HTTP 1.1版本会出现 「User-Agent、Cookie、Accept、Server、Range」 等字段可能会占用几百甚至几千字节,而 Body 却经常只有几十字节,所以导致头部偏重。HTTP 2.0 使用 HPACK 算法进行压缩。
多路复用 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,这样子解决了队头阻塞的问题。
服务器推送 允许服务器未经请求,主动向客户端发送资源,即服务器推送。
请求优先级 可以设置数据帧的优先级,让服务端先处理重要资源,优化用户体验。
3,说说http浏览器缓存机制
首先从缓存的类型上来说, 可以分为两种: 强缓存与协商缓存,强缓存是不需要发送HTTP请求的,
而协商缓存需要.也就是在发送HTTP请求之前, 浏览器会先检查一下强缓存, 如果命中直接使用,否则就进入下一步。
强缓存
浏览器检查强缓存的方式主要是判断这两个字段:
(1),HTTP/1.0时期使用的是Expires;
(2),HTTP/1.1使用的是Cache-Control (expires中文意思有效期, cache-control中文意思缓存管理)
Expires: Expires字面意思表示的是有效期, 那么很好理解, 它表示的就是一个具体的时间.
很有意思的是, 若是设置了Expires, 但是服务器的时间与浏览器的时间不一致的时候(比如你手动修改了本地的时间), 那么就可能会造成缓存失效,
因此这种方式强缓存方式并不是很准确, 它也因此在HTTP/1.1中被摒弃了.
Cache-Control:表示的是这个资源在响应之后的300s内过期, 也就是5分钟之内再次获取这个资源会直接使用缓存.
********Expires和Cache-control的对比
Expires产于HTTP/1.0, Cache-control产于HTTP/1.1;Expires设置的是一个具体的时间,
Cache-control?可以设置具体时常还有其它的属性;两者同时存在, Cache-control的优先级更高;在不支持HTTP/1.1的环境下, Expires就会发挥作用, 所以先阶段的存在是为了做一些兼容的处理
协商缓存:
协商缓存概括来说就是浏览器会携带缓存标识(tag)向服务器发送请求, 服务器会根据缓存标识(tag)来决定是否使用缓存.
所以对于服务器的返回结果会有这两种情况:
协商缓存生效, 返回304和Not Modified(空的响应体)
协商缓存失效, 返回200和请求结果
而刚刚提到的这个缓存标识(tag)也是有两种:分为Last-Modified和 ETag.
Last-Modified 和 If-Modified-Since****
从字面意思上我们可以看出, Last-Modified表示的是资源的最后修改时间, 因此其中一种协商缓存判断的就是最后修改时间.
ETag 与 If-None-Match
在浏览器请求服务器资源的时候, 服务器会根据当前文件的内容, 给文件生成一个唯一的标识, 若是文件发生了改变, 则这个标识就会改变
服务器会将这个标识ETag放到响应体的header中与请求的资源一起返回给浏览器, 而浏览器同样也会缓存文件与这个header
在下一次再次加载该资源时, 浏览器会将刚刚缓存的ETag放到请求体头部(request header)的If-None-Match里发送给服务器.
****两者对比
首先对于Last-Modified
若是本地打开了缓存文件, 并没有进行修改, 也还是会改变最后修改时间, 导致缓存失败;
由于Last-Modified是以秒来计时的, 若是某个文件在一秒内被修改了很多次, 那么这时候的 Last-Modified 并没有体现出修改了.
然后对于ETag:
性能上的不足,只要文件发生改变,ETag就会发生改变. ETag需要服务器通过算法来计算出一个hash值.
两者都支持的话, ETag优先级更高
缓存位置****
Service Worker, Memory Cache, Disk Cache, Push Cache
Service Worker: 是运行在浏览器背后的独立线程, 也就是说它脱离了浏览器的窗体, 无法直接访问DOM.功能上主要是能实现: 离线缓存、消息推送、网络代理等.比如离线缓存就是Service Worker Cache
Memory Cache: Memory Cache就是内存中的缓存, 存储的主要是当前页面已经抓取到的资源, 比如页面上已经下载的样式、脚本、图片
读取效率快, 可是缓存持续时间短, 会随着进程的释放而释放(一旦关闭Tab页面, 就被释放了, 还有可能在没关闭之前, 排在前面的缓存就失效了, 例如一个页面的缓存占用了超级多的内存
Disk Cache: Disk Cache, 也叫做HTTP Cache, 是存储在硬盘上的缓存, 所以它是持久存储, 是实际存在于文件系统中的.
Push Cache: Push Cache(推送缓存), 它是浏览器缓存的最后一段防线, 当以上三种缓存都没有命中的时候, 它才会被使用.
它只会在会话(Session)中存在, 一旦会话结束它就会被释放, 并且缓存时间也很短暂, 在Chrome浏览器中只有5分钟 Push Cache 中的缓存只能被使用一次
4,强缓存里面的expires和cache-control那个优先级更高
强缓存: expires优先级比Cache-Control低
协商缓存: Etag优先级比Last-Modified优先级高
5,协商缓存的last-modified时间和服务端时间是否一致
如果本地时简修改了就不一致
6,一个url从输入到渲染完成发生了啥
DNS 解析:将域名解析成 IP 地址
TCP 连接:TCP 三次握手
发送 HTTP 请求
服务器处理请求并返回 HTTP 报文
浏览器解析渲染页面
断开连接:TCP 四次挥手
7,dns解析分哪几种解析,它有缓存嘛?
dns解析分为集中式域名解析和分布式域名解析,它有缓存
缓存有两种:浏览器缓存和操作系统(OS)缓存
浏览器DNS缓存: 首先,浏览器DNS缓存的时间跟DNS服务器返回的TTL值无关。浏览器在获取网站域名的实际IP地址后会对其IP进行缓存,减少网络请求的损耗。每种浏览器都有一个固定的DNS缓存时间,如Chrome的过期时间是1分钟,在这个期限内不会重新请求DNS。常用的浏览器的DNS缓存时间如下:Chrome:为了加快访问速度,Google Chrome浏览器采用了预提DNS记录,在本地建立DNS缓存的方法,加快网站的连接速度。在Chrome地址栏中输入chrome://net-internals/#dns 就可以看各域名的DNS 缓存时间。默认,Chrome对每个域名会默认缓存60s
操作系统DNS缓存: OS缓存会参考DNS服务器响应的TTL值,但是不完全等于TTL值。
8,http1.1里面有个keep-alive有啥作用
当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
keep-alive技术的创建目的,能在多次HTTP之前重用同一个TCP连接,从而减少创建/关闭多个 TCP 连接的开销(包括响应时间、CPU 资源、减少拥堵等)
9,dns解析有几种方式
DNS域名解析两种方式分别为分布式域名解析和集中式域名解析
分布域名解析,是指分在客户端上维护一个静态du的文本文件,其中包含主机名和IP地址的映射。随着网络规模的扩大,分布式分辨率的有效性越来越低。
集中域名解析 要求网络中有多台DNS服务器,负责维护域名/IP地址映射数据库。客户端从指定的服务器获取域名的地址信息。
一旦客户端指定的DNS服务器不包含相应的数据,DNS服务器就会在网络中进行递归查询,并获取其他服务器上的地址信息。
10,三次握手说出详细流程
1,客户端发送一个带SYN=1,Seq=X的数据包到服务器端口
2,服务器发回一个带SYN=1,ACK=X+1,Seq=Y的响应包以示传达确认信息
3,客户端再回传一个带ACK=Y+1,Seq=z的数据包,代表握手结束
11,四次挥手过程
第一次挥手:客户端发送一个 FIN 报文,报文中会指定一个序列号。此时客户端处于 FIN_WAIT1 状态。 即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入FIN_WAIT1(终止等待1)状态,等待服务端的确认。
第二次挥手:服务端收到 FIN 之后,会发送 ACK 报文,且把客户端的序列号值 +1 作为 ACK 报文的序列号值,表明已经收到客户端的报文了,此时服务端处于 CLOSE_WAIT 状态。 即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务端进入CLOSE_WAIT(关闭等待)状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入FIN_WAIT2(终止等待2)状态,等待服务端发出的连接释放报文段。
第三次挥手:如果服务端也想断开连接了,和客户端的第一次挥手一样,发给 FIN 报文,且指定一个序列号。此时服务端处于 LAST_ACK 的状态。 即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入LAST_ACK(最后确认)状态,等待客户端的确认。
第四次挥手:客户端收到 FIN 之后,一样发送一个 ACK 报文作为应答,且把服务端的序列号值 +1 作为自己 ACK 报文的序列号值,此时客户端处于 TIME_WAIT 状态。需要过一阵子以确保服务端收到自己的 ACK 报文之后才会进入 CLOSED 状态,服务端收到 ACK 报文之后,就处于关闭连接了,处于 CLOSED 状态。 即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入TIME_WAIT(时间等待)状态。此时TCP未释放掉,需要经过时间等待计时器设置的时间2MSL后,客户端才进入CLOSED状态。
12,为什么强缓存和协商缓存返回什么状态码
强缓存返回状态码200 协商缓存返回状态码304
13,http状态码301和302分别是什么
301 代表永久性重定向 302 代表暂时性重定向
14,为什么需要三次握手和四次挥手
三次握手: 为了防止服务器端开启一些无用的连接增加服务器开销以及防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误。
四次挥手:因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,"你发的FIN报文我收到了"。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。
15,http常用状态有哪些
1xx:代表请求已被接受,需要处理
2xx:表示成功状态
200 ok 204 请求成功但没资源返回
206 :该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的 GET 请求 响应报文中包含由 **「Content-Range」** 指定范围的实体内容。
3xx:表示重定向
302 found,临时性重定向,表示资源临时被分配了新的 URL。
303 see other,表示资源存在着另一个 URL,应使用 GET 方法获取资源。
304 not modified,当协商缓存命中时会返回这个状态码。
307 temporary redirect,临时重定向,和302含义相同,不会改变method
4xx:表示客户端错误
400 请求报文存在语法错误。
401 表示发送的请求需要有通过 HTTP 认证的认证信息。
403 表示对请求资源的访问被服务器拒绝。
404 表示在服务器上没有找到请求的资源。
5xx: 表示服务器错误
500 表示服务器端在执行请求时发生了错误。
502 服务器自身是正常的,访问的时候出了问题,具体啥错误我们不知道。
503 表明服务器暂时处于超负载或正在停机维护,无法处理请求。
16,http和https的区别
HTTPS 要比 HTTP多了安全性这个概念,实际上, HTTPS 并不是一个新的应用层协议,它其实就是 HTTP + TLS/SSL 协议组合而成,而安全性的保证正是 SSL/TLS 所做的工作。
1. 对数据进行加密,并建立一个信息安全通道,来保证传输过程中的数据安全;
2. 对网站服务器进行真实身份认证。
17,http请求方法都有哪些
post,get,delete,head,options等主要方法
18,如何解决跨域问题
jsonp,cors等方法
19,Options方法有什么作用
1,这个方法会请求服务器返回该资源所支持的所有 HTTP 请求方法,该方法会用'*'来代替资源名称,向服务器发送 OPTIONS 请求,可以测试服务器功能是否正常。
2,JS 的 XMLHttpRequest对象进行 CORS 跨域资源共享时,对于复杂请求,就是使用 OPTIONS 方法发送嗅探请求,以判断是否有对指定资源的访问权限
18,post提交有几种格式
application/x-www-form-urlencoded, multipart/form-data, application/json , text/xml
19,udp和tcp的作用以及区别
1、TCP是什么?
一种传输控制协议,提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
2、TCP有什么作用?
(1) 首先,TCP提供客户与服务器之间的连接。TCP客户先与某个给定服务器建立一个连接,然后通过该连接与服务器交换数据,最后终止该连接。
(2) 其次,TCP提供了可靠性。超时重传。当TCP向另一端发送数据时,要求对端返回一个确认ACK。如果没有收到确认,TCP就自动重传数据并等待更长时间。在数次重传失败后,TCP才放弃,如此在尝试发送数据上所花的时间一般为4~10分钟(依赖于具体实现)。注意:TCP并不能保证对端一定能接收到数据,因为这是不可能做到的。如果有可能,TCP就把数据递送给对端,否则就(通过放弃重传并中断连接这一手段)通知用户。这样来看,TCP也不能看作是100%可靠的协议,它的可靠性体现在数据的可靠递送和故障的可靠通知。
(3)TCP通过给其中每个分节关联一个序列号对所发送数据进行排序。如果这些分节非顺序到达,接收端TCP将先根据它们的序列号进行重新排序,再把结果数据传递给接收应用。
(4)TCP提供流量控制。TCP总是告知对端在任何时刻它一次能从对端接收多少字节的数据,即通知窗口。确保不会发生缓冲区溢出。
(5)TCP提供RTT估算。在第二点里面的重传时间也会用到RTT估算的时间。RTT估算时间 = SYN_RECV - ESTABLISHED(服务端)
(6)TCP连接是全双工的,两边可以相互通信。
1、UDP是什么?
一种无连接的计算机传输协议,受到Internet 协议集支持,这个协议一般被称为用户数据报协议(UDP,User Datagram Protocol)。
在Internet传输层例有着TCP与UDP两种互为补充的主要协议,其中无连接协议就是UDP,它一般除了给应用程序发发送数据包功能并允许它们在所需的层次上架构自己的协议之外没有做任何事情。其他事情几乎全部都是面向连接的TCP协议做的。
UDP协议为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
2、UDP有什么作用?
(1)它是无连接协议,传输数据之前不会和源端终端建立连接。所以当它想传输时可以随意的去抓取来自应用程序的数据,并尽可能的以最快速度发送到网络上。
(2) UDP协议吞吐量只会受应用软件生成数据的速率、传输带宽、源端和终端主机性能的限制,不受拥挤控制算法的调节。
(3)因为UDP传输数据不会建立连接,所以也就不需要维护各种可能出问题的状态,如连接、收发状态等,因此使用一台服务器就可以同时向多个客户端传输相同消息了。
(4)相对tcp协议的20个字节信息包而言,UDP信息包的标题短的可怜,只有8个字节,这样使得它的额外开销也比TCP小很多。
(5)UDP协议是面向报文的。发送方的UDP在面对应用程序交下来的报文时,会在上面添加首部后就向下交付给IP层。它既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。
(6)UDP虽然常被人说是一个不可靠的协议,但对于分发消息来说它还是蛮理想的。如在高铁站报告航班信息等。UDP也适用于在路由信息协议RIP(Routing Information Protocol)中修改路由表。
(7)UDP 广泛用于视频会议和实时计算机游戏等多媒体应用中。因为它允许丢弃单个数据包,并以与发送它们不同的顺序接收UDP数据包,从而实现更好的性能。
TCP与UDP的区别
(1)连接与无连接
TCP是面向连接的,UDP是面向无连接的。因此导致TCP更适合于消息的多播发布可以向多个点传送消息(因为没有繁琐的握手机制与挥手机制)同时也导致UDP适用于快速传输的协议,对信息的时实性要求严格的协议。由于UDP的速度快,所以适合于在线视频媒体,电话视频聊天,qq聊天,电视广播,多人在线游戏这些项目。(为了时实性牺牲写可靠性,即使有包丢失,可能会导致语音不清楚,视频不清楚等问题,不过没有影响)
(2)可靠性
TCP是可靠的传输协议,UDP是不可靠的。因此导致UDP不适合金融支付这方面要求可靠性的项目。(因为UDP没有超时重传的机制不能保证可靠性)。
(3)有序性
TCP协议可以保证有序性,UDP协议不保证。
(消息将会以从服务端发出的顺序发送给客户端,尽管消息可能到网络的另一端时是无顺序的,TCP协议会为你排好序)但是即使UDP不可靠,无序,但是我们可以将这些要求转移给上层应用来实现,不仅降低了执行时间,而且使质量得到保证。(例如可以通过给UDP协议使用序列号和重传机制来改善它的这两个缺点)。
(4)重量级与轻量级
TCP协议是重量级,UDP协议是轻量级 因为TCP要保证可靠性和有序性,所以TCP数据报报头的信息量大,报头大小是20个字节,UDP报头的大小是8个字节。所以TCP占用的系统的开销大。
(5)拥塞和流量控制
TCP有流量控制,UDP没有。 TCP通常在发送包之前会测试网络的快慢情况,就好比我们在linux中投的ping命令,通过往返的时间和丢包率来评估网路的状况,来调动滑动窗口的大小。(这项机制增加了TCP的可靠性)。
(6)数据边界
TCP协议没有数据边界,UDP有 因此TCP容易发生粘包的现象。在UDP中数据包是单独发送的,只有当他们到达时才会再次集成,包有明确的界限来判断哪些包已经收到。
20,get和post有啥区别
1,get请求能缓存,post不能
2,post相对于get安全一点,get请求包含在url上且会被浏览器保存到历史记录,而post不会
3,Url有限制长度,会影响get请求
4,Post支持更多编码类型,不对数据类型限制
21,Cors跨域要如何配置,以及简单请求和复杂请求的区别
浏览器将CORS请求分成两类:简单请求(simple request)和非简单请求(not-so-simple request)。
只要同时满足以下两大条件,就属于简单请求。
(1)请求方法是以下三种方法之一: get post以及HEAD
(2)HTTP的头信息不超出以下几种字段: Accept Accept-Language Content-Language
Content-Type:只限于三个值application/x-www-form-urlencoded、multipart/form-data、text/plain
简单请求: 对于简单请求,浏览器直接发出CORS请求。具体来说,就是在头信息之中,增加一个Origin字段。
上面的头信息中,Origin字段用来说明,本次请求来自哪个源(协议 + 域名 + 端口)。服务器根据这个值,决定是否同意这次请求。
如果Origin指定的源,不在许可范围内,服务器会返回一个正常的HTTP回应。浏览器发现,
这个回应的头信息没有包含Access-Control-Allow-Origin字段(详见下文),就知道出错了,从而抛出一个错误,被XMLHttpRequest的onerror回调函数捕获。注意,这种错误无法通过状态码识别,因为HTTP回应的状态码有可能是200,如果Origin指定的域名在许可范围内,服务器返回的响应,会多出几个头信息字段。Access-Control-Allow-Origin就不能设为星号,必须指定明确的、与请求网页一致的域名。同时,Cookie依然遵循同源政策,只有用服务器域名设置的Cookie才会上传,其他域名的Cookie并不会上传,且(跨源)原网页代码中的document.cookie也无法读取服务器域名下的Cookie。
非简单请求:
请求方法是PUT或DELETE,或者Content-Type字段的类型是application/json
非简单请求的CORS请求,会在正式通信之前,增加一次HTTP查询请求,称为"预检"请求(preflight)
浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,以及可以使用哪些HTTP动词和头信息字段。只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错
服务器收到"预检"请求以后,检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers字段以后,确认允许跨源请求,就可以做出回应
22,Jsonp原理
jsonp是利用script标签没有跨域限制的漏洞,通过script标签指向一个需要访问的地址并提供一个回调函数来接收数据