【前端面试】http面试整理

"一问一答"模型的协议

客户端通过http请求;服务器端根据请求返回客户想要的资源;客户端接收到资源;

http是什么

HTTP是超文本传输协议,是一个在计算机世界里专门在两点之间传输文字、图片、音频、视频等超文本数据的约定和规范

抓包

抓包工具,是个特殊的软件,相当于一个"代理程序",浏览器给服务器发的请求就会经过这个代理程序,进一步的就能分析出请求和响应的结果如何,常用:Fiddler抓包工具

http协议格式

url:唯一资源标识符;唯一资源定位符
	原字符转义:encode
	转义字符还原:decode
服务器端口号: 标识了要访问目标服务器的哪个进程(将进程和端口号进行绑定,在浏览器中的URL里面端口号经常会省略不写,省略的时候使用的是当前协议的默认端口)

http协议组成

请求消息
	请求行:包含请求方法、URI、HTTP版本信息
	请求首部字段
	请求内容实体。
响应消息
	状态行(版本、状态码、状态码描述)
	响应头部
	空行
	响应体

http协议特点

http无连接:限制每次连接只处理一个请求,服务端完成客户端的请求后,即断开连接。(传输速度快,减少不必要的连接,但也意味着每一次访问都要建立一次连接,效率降低);
http无状态:对于事务处理没有记忆能力。每一次请求都是独立的,不记录客户端任何行为;
客户端/服务端模型:客户端支持web浏览器或其他任何客户端;
简单快速
灵活:可以传输任何类型的数据。

安全与幂等

一个http方法是安全的,那么该方法是不会修改服务器的数据,反之则不安全。这是一个对服务器只读操作的方法。所有安全的方法都是幂等的
一个HTTP方法是幂等的,指的是同样的请求被执行一次与连续执行多次的效果是一样的,服务器的状态也是一样的。

http中的方法

get:获取资源
post:向服务端发送待处理的数据
put:向服务端发送数据并替换服务端上指定的数据
head:获取报文首部;请求一个与GET请求的响应相同的响应,但没有响应体,只有资源的头部信息。(安全、幂等)
delete:删除文件
options: 用于获取目的资源所支持的通信选项。(安全、幂等)
trace:沿着目标资源的路径执行消息环回测试
connect:要求用隧道协议连接代理;用于开启一个客户端与所请求资源之间的双向沟通的通道。(不安全、不幂等)
PATCH:对资源进行部分修改。(不安全、不幂等)
link:建立与资源之间的联系
unlink:断开连接关系

http(1.1)

优缺点
	优点:简单(报文格式是简单文本形式)、灵活(可以自定义头部字段)和易于扩展(应用层传输协议,其下层可以变化)、应用广泛和跨平台(手机、平板、app都可使用)
	缺点:无状态、明文传输、不安全(HTTP 的安全问题,可以⽤ HTTPS 的⽅式解决,也就是通过引⼊ SSL/TLS 层,使得在安全上达到了极致)
性能
	长连接:请求默认使用一个持久连接,只要客户端和服务器没有明确提出断开连接,就保持TCP连接状态,减少额外的开销
	管道机制:在同⼀个 TCP 连接⾥⾯,客户端可以发起多个请求,只要第⼀个请求发出去了,不必等其回来,就可以发第⼆个请求出去,可以减少整体的响应时间。但是服务器还是按照顺序,先回应 A 请求,完成后再回应 B 请求。要是前⾯的回应特别慢,后⾯就会有许多请求排队等着。这称为队头堵塞。
	性能瓶颈:
		只压缩body部分,请求响应头部未压缩就发送,头部信息越多延迟越大。且每次相互发送相同的首部造成的浪费较多。
		服务器是按请求顺序响应的,如果服务器响应慢,就会招致客户端一直请求不到数据,也就是队头阻塞。
		请求只能从客户端开始,服务器只能被动响应。

HTTP1.1和HTTP2.0的区别

HTTP/2协议是基于HTTPS的,所以HTTP/2的安全性是有保障的。
HTTP/1.1使用文本格式传输数据,但是HTTP/2协议采用二进制传输数据,头信息和数据体都是⼆进制,并且统称为帧(frame):头信息帧和数据帧。收到报⽂后,⽆需再将明⽂的报⽂转成⼆进制,⽽是直接解析⼆进制报⽂,这提高了数据传输的效率。
HTTP/1.1每次请求都会携带大量的头部信息,浪费资源。而HTTP/2使用HPACK算法对消息头进行压缩,通信过程中只传输索引号,提高速度、节省流量
HTTP/2采用数据流的形式收发数据,一个完整的请求或响应数据包称为一个数据流stream,其可以分成非连续多次发送。在数据包发送时,必须标记所属的数据流编号,用来区分是哪个数据流,规定客户端发出的数据流编号为奇数,服务器发出的数据流编号为偶数。客户端还可以指定数据流的优先级,优先级高的请求,服务器就先响应该请求。
HTTP1.1虽然通过管道机制也能发起多个请求,但服务器得按顺序处理客户端的请求,容易出现队头阻塞。而HTTP/2实现了多路复用,在一个连接中并非多个请求或回应,而不用按照顺序一一对应,降低了延迟,大幅度提高了连接的利用率。服务器同时(或先后)收到了A、B两个请求,先回应A请求,但由于处理过程非常耗时,于是就发送A请求已经处理好的部分, 接着回应B请求,完成后,再发送A请求剩下的部分。
HTTP1.1请求只能从客户端开始,服务器只能被动响应。而HTTP/2支持服务器推送,即可以主动向客户端发送消息,比如在浏览器刚请求HTML的时候,就提前把可能用到的JS、CSS文件等静态资源主动发送给客户端,减少延时的等待。

http2的缺陷,http3做的优化

HTTP/2如果出现丢包现象,就会触发TCP的重传机制,这样就会阻塞所有的HTTP请求。而HTTP/3把HTTP下层的TCP协议换成了UDP协议。虽然 UDP 是不可靠传输的,但基于 UDP 的 QUIC 协议 可以实现类似 TCP 的可靠性传输。当某个流发⽣丢包时,只会阻塞这个流,其他流不会受到影响。
TLS3 升级成了最新的 1.3 版本,头部压缩算法也升级成了 QPack 。
HTTPS 要建⽴⼀个连接,要花费 6 次交互,先是建⽴三次握⼿,然后是 TLS/1.3 的三次握⼿。QUIC 直接把 以往的 TCP 和 TLS/1.3 的 6 次交互合并成了 3 次,减少了交互次数

http的keep-alive

每次http请求都要创建一个连接,创建连接需要消耗时间和资源,为了减少消耗,所以需要重用连接;在http请求头中加入Connection: keep-alive来告诉对方这个请求响应完成后不要关闭,下一次还用这个请求继续交流
优点
	较少的CPU和内存的使用(由于同时打开的连接的减少了)
	允许请求和应答的HTTP管线化
	降低拥塞控制 (TCP连接减少了)
	减少了后续请求的延迟(无需再进行握手)
	报告错误无需关闭TCP连

http与https的区别

httpsHTTPS 协议需要向 CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。http一般没有
http是超文本传输协议,信息是明文传输,不安全;HTTPS 则解决 HTTP 不安全的缺陷,在 TCP 和 HTTP ⽹络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。
HTTP 连接建⽴相对简单, TCP 三次握⼿之后便可进⾏ HTTP 的报⽂传输。⽽ HTTPS 在 TCP 三次握⼿之 后,还需进⾏ SSL/TLS 的握⼿过程,才可进⼊加密报⽂传输。
http默认80端口,https默认443端口

https解决了http什么问题

窃听问题
	HTTP存在窃听风险(可以获取通信内容)
	解决:HTTPS 在 HTTP 与 TCP 层之间加⼊了 SSL/TLS 协议,使用混合加密的方式对信息加密,实现信息的机密性,解决了风险
纂改与冒充风险
	http:篡改风险(篡改内容)和冒充风险(冒充淘宝网站)
	https:使用摘要算法确保数据的完整性,保证通信内容无法被篡改,如果被修改了就不能正常显示。将服务器的公钥加入到数字证书中,解决了冒充的风险。
注:在通信建立前使用非对称加密的方式交换会话秘钥,后续就不再使用非对称加密了。在通信过程中使用对称加密的会话秘钥的方式加密明文数据。

https如何建立连接,其间交互了什么(回答SSL/TLS的握手阶段涉及四次通信)

客户端向服务器发起加密通信请求(ClientHello请求),发送的信息有客户端支持的SSL/TLS协议版本、产生的随机数、支持的密码套件列表(比如RSA算法)。
服务器收到客户端请求后,向客户端发出响应(ServerHello),发送的信息有确认的SSL/TLS协议版本、服务器产生的随机数、确认密码套件列表、服务器的数字证书。
客户端收到服务器的回应后,通过浏览器或者操作系统中的CA公钥。确认服务器的数字证书的正确性,如果证书没有问题,客户端就会从数字证书中取出服务器的公钥,然后使用它来加密报文。然后向服务器发送消息,包含一个用服务器公钥加密的随机数、加密通信算法改变通知、客户端握⼿结束通知。
服务器用自己的私钥获取客户端发送过来的随机数,之后使用前面三个随机数生成会话密钥,用来加密之后的通信内容。然后向客户端发送加密通信算法改变通知、服务器握手结束通知。

get与post的区别

没有本质的区别,用get 的场景也可以用post
语义区别
	get:从浏览器获取数据
	post:往浏览器提交数据
使用习惯
	GET请求通过URL传输数据
	POST的数据通过请求体传输
安全性问题
	get:把参数放到url中,如果实现登录页面,点击登录后,你的用户名和密码就直接以query string 的形式放到url中了,就直接显示到浏览器地址栏中了,会被别人看到,所以就不安全
	post是把参数放到body中,body不会显示到浏览器界面上,所以就不会直接显示出来就更安全,但是仍会被抓包工具抓出来,所以需要在代码中实现加密解密
	实例:项目用js-加解密库crypto-js,设置密钥和密钥偏移量,进行加解密
数据类型
	GET只允许 ASCII 字符
	POST无限制

请求报头header

Host:表示服务器主机的地址和接口,放的是ip和端口,如果省略端口,则用默认端口(http是80,https是443)
Accept:客户端可识别的内容类型列表。
Content-Length(body中的数据长度)
	一般在post请求出现,为了解决粘包问题(粘包问题:tcp无法区分应用层数据包;所以需要给包与包之间划分界限,标识数据长度),Content-Length不需要我们自己手动设置,一般都是浏览器和HTTP服务器自己计算好的
Content-Type(表示请求的body中的数据格式)
User-Agent(UA):
	UA主要包含的信息,就是 操作系统信息 和 浏览器信息
	描述了用户在使用怎样的设备来上网
	可以区别平板、电脑、手机设备,根据不同尺寸来调整css和js,响应式页面
Referer:表示这个页面是从哪个页面跳转过来的
Cookie:浏览器在本地存储数据(存到硬盘上)的一种机制
	一般拿来存放身份信息,最常用的场景:在客户端维持登陆状态

cookies机制和session机制的区别

cookies数据保存在客户端,session数据保存在服务端;
cookies可以减轻服务器压力,但是不安全,容易进行cookies欺骗;
session安全一点,但是占用服务器资源。

响应报头

Allow:对某资源的有效的请求行为
Cache-Control:告诉所有的缓存机制是否可以缓存及哪种类型。
Content-Location	:请求资源实际所处位置
【Content-Length】:服务器在返回数据时,会有 Content-Length 字段,表明本次回应的数据⻓度
【Content-Type】:告诉客户端实际返回的内容的内容类型。
 【Content-Encoding】:表示服务器返回的数据使⽤了什么压缩编码形式
【Connection】: 决定当前的事务完成后,是否会关闭网络连接。如果该值是“keep-alive”,网络连接就是持 久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。

HTTP报文

HTTP协议在客户端和服务端之间传送的数据块
组成
	起始行(start line):对报文进行的描述
	头部(header):包含报文的一些属性
	主体(body):包含报文的数据(可选,非必选)
类型
	请求报文
		客户端向服务端发送请求时,就是发送请求报文
			请求头参考上述
	响应报文
		当服务端向客户端返回数据时,就是返回响应报文
	两者报文都会用到的首部
		Cache-Control 控制缓存 
		Connection 连接管理、逐条首部 
	两者实体部分使用首部
		Connection 连接管理、逐条首部 
		Expires 实体主体的过期资源
		Allow 资源可支持http请求的方法

HTTP响应

状态码
	200:访问成功
	404:not found
	403 Forbidden 访问被拒绝(没有权限)
	4XX都是客户端出现错误状态
	 500 Internal Server Error   服务器内部错误
	504 Gateway Timeout  访问超时了
	302 重定向:访问一个旧的URL 自动转移到新的URL上,服务器返回的头部信息中会包含一个Location字段,内容是重定向到的url。

构造http请求

通过ajax构造http请求

ajax 默认发起的请求不会引起跳转,也可以手动控制跳转,局部刷新浏览器,大大地提高性能

通过postman构造http请求

http无状态协议

无状态协议:对于事务处理没有记忆能力
状态协议解决办法:通过1、Cookie 2、通过Session会话保存。

UDP和TCP的区别

UDP
	用户数据报协议。它不需要所谓的握手操作,从而加快了通信速度,允许网络上的其他主机在接收方同意通信之前进行数据传输。
	数据报是与分组交换网络关联的传输单元。
	特点:能够支持容忍数据包丢失的带宽密集型应用程序;具有低延迟的特点;能够发送大量的数据包;能够允许 DNS 查找,DNS 是建立在 UDP 之上的应用层协议。
tcp
	传输控制协议。它能够帮助你确定计算机连接到 Internet 以及它们之间的数据传输。通过三次握手来建立 TCP 连接,三次握手就是用来启动和确认 TCP 连接的过程。一旦连接建立后,就可以发送数据了,当数据传输完成后,会通过关闭虚拟电路来断开连接。
	特点:确保连接的建立和数据包的发送;支持错误重传机制;支持拥塞控制,能够在网络拥堵的情况下延迟发送;能够提供错误校验和甄别有害数据包
区别
	TCP 是面向连接的协议 。 UDP 是无连接的协议
	TCP 在发送数据前先需要建立连接,然后再发送数据 。 UDP 无需建立连接就可以直接发送大量数据
	TCP 传输的速度比较慢 。 UDP 的传输会更快
	TCP 会按照特定顺序重新排列数据包 。 UDP 数据包没有固定顺序,所有数据包都相互独立
	TCP 是重量级的,在发送任何用户数据之前,TCP需要三次握手建立连接。 UDP 是轻量级的。没有跟踪连接,消息排序等。
	TCP 的头部字节有 20 字节 。 UDP 的头部字节只需要 8 个字节
	TCP 会进行错误校验,并能够进行错误恢复 。 UDP 也会错误检查,但会丢弃错误的数据包。
	TCP 有发送确认。 UDP 没有发送确认
	TCP 会使用握手协议,例如 SYN,SYN-ACK,ACK。 UDP无握手协议
	TCP 是可靠的,因为它可以确保将数据传送到路由器。 UDP 中不能保证将数据传送到目标。

tcp的三次握手

相关概念解说
	SYN 这个消息是用来初始化和建立连接的。它的全称是 Synchronize Sequence Numbers,同步序列编号。是 TCP/IP 建立连接时使用的握手信号。在客户机和服务器之间建立 TCP 连接时,首先会发送的一个信号。客户端在接受到 SYN 消息时,就会在自己的段内生成一个随机值 X。
	SYN-ACK 本地的 SYN 消息和较早的 ACK 数据包。SYN-ACK:服务器收到 SYN 后,打开客户端连接,发送一个 SYN-ACK 作为答复。确认号设置为比接收到的序列号多一个,即 X + 1,服务器为数据包选择的序列号是另一个随机数 Y。
	ACK 帮助对方确认收到的 SYN 消息。ACK:Acknowledge character, 确认字符,表示发来的数据已确认接收无误。最后,客户端将 ACK 发送给服务器。序列号被设置为所接收的确认值即 Y + 1。
	FIN 用来断开连接
通俗例子
	小明给小红打电话,接通了后,小明说喂,能听到吗,这就相当于是连接建立。
	小红给小明回应,能听到,你能听到我说的话吗,这就相当于是请求响应。
	小明听到小红的回应后,好的,这相当于是连接确认。在这之后小明和小红就可以通话/交换信息了。

tcp四次挥手

首先,客户端应用程序决定要终止连接(这里服务端也可以选择断开连接)。这会使客户端将 FIN 发送到服务器,并进入 FIN_WAIT_1 状态。当客户端处于 FIN_WAIT_1 状态时,它会等待来自服务器的 ACK 响应。
然后第二步,当服务器收到 FIN 消息时,服务器会立刻向客户端发送 ACK 确认消息。
当客户端收到服务器发送的 ACK 响应后,客户端就进入 FIN_WAIT_2 状态,然后等待来自服务器的 FIN 消息
服务器发送 ACK 确认消息后,一段时间(可以进行关闭后)会发送 FIN 消息给客户端,告知客户端可以进行关闭。
当客户端收到从服务端发送的 FIN 消息时,客户端就会由 FIN_WAIT_2 状态变为 TIME_WAIT 状态。处于 TIME_WAIT 状态的客户端允许重新发送 ACK 到服务器为了防止信息丢失。客户端在 TIME_WAIT 状态下花费的时间取决于它的实现,在等待一段时间后,连接关闭,客户端上所有的资源(包括端口号和缓冲区数据)都被释放。
通俗例子
	小明对小红说,我所有的东西都说完了,我要挂电话了。
	小红说,收到,我这边还有一些东西没说。
	经过若干秒后,小红也说完了,小红说,我说完了,现在可以挂断了
	小明收到消息后,又等了若干时间后,挂断了电话。

你可能感兴趣的:(前端,面试,http)