说一下一次完整的 HTTP 请求过程包括哪些内容?
建立起客户机和服务器连接。
建立连接后,客户机发送一个请
求给服务器。
服务器收到请求,处理后给予响应信息。
客户端浏览器将返回的内容解析并呈现,断开连接。
HTTP 如何禁用缓存?如何确认缓存?
HTTP/1.1 通过 Cache-Control 首部字段来控制缓存。
禁止进行缓存
no-stroe 指令规定不能对请求或响应的任何一部分进行缓存。
Cache-Control: no-stroe
确认缓存
no-cache 指令规定缓存服务器需要先向源服务器验证缓存资源的有效性,只有当缓存资源有效时,才能使用该缓存对客户端的请求进行响应。
Cathe-Control: no-cache
HTTP 中缓存的私有和公有字段?知道吗?
Cache-Control 字段,其中:
private 指令规定了将资源作为私有缓存,只能被单独用户使用,一般存储在用户浏览器中。
public 指令规定了将资源作为公共缓存,可以被多个用户使用,一般存储在代理服务器中。
HTTP 中有个缓存机制,但如何保证缓存是最新的呢?(缓存过期机制)
max-age 指令出现在请求报文,并且缓存资源的缓存时间小于该指令指定的时间,那么就有可能接收该缓存。
max-age 指令出现在响应报文,表示资源在客户端缓存中可以被认为是最新的时间。
Expires 首部字段也可以用于告知客户端缓存该资源什么时候会过期。
在 HTTP/1.1 中,会优先处理 max-age 指令;
在 HTTP/1.0 中,max-age 指令会被忽略掉。
HTTP 长连接和短连接的区别?
连接的维持时间:
短连接:每次 HTTP 请求和响应完成后,连接就会关闭。也就是说,客户端向服务器发起一次请求,服务器响应后,连接立即断开。
长连接:在一次连接建立后,可以在一段时间内保持连接状态,允许客户端和服务器在这段时间内通过一个连接进行多次请求和响应。
性能:
短连接:频繁地建立和关闭连接会带来一定的性能开销。每次建立连接都需要进行 TCP 三次握手,关闭连接需要进行四次挥手,这些过程都会消耗时间和网络资源。
长连接:减少了连接建立和关闭的开销,提高了性能。由于连接可以在一段时间内重复使用,避免了频繁的握手和挥手过程,节省了时间和网络资源。
服务器资源管理:
短连接:服务器不需要长时间维持大量的连接,对服务器资源的占用相对较少。每次处理请求完毕后,连接就会关闭,服务器可以释放相关的资源。
长连接:服务器需要维持一定数量的长连接,这会占用服务器的内存和网络资源。如果连接数量过多,可能会导致服务器资源紧张,影响服务器的性能和稳定性。
HTTP 请求方法你知道多少?
GET : 请求指定的资源。通常是安全的和幂等的,请求参数会附加在 URL 中
POST : 向指定资源提交数据,通常用于提交表单数据、上传文件等。一般不是安全的和幂等的。
PUT : 向指定资源位置 上传其最新内容。通常是幂等的。
DELETE : 删除指定的资源。通常是幂等的。
HEAD :与 GET 方法类似,但只返回 HTTP 头部信息,不返回实体内容。
OPTIONS : 获取目标资源所支持的通信选项
TRACE : 用于沿着目标资源的路径执行一个消息环回测试,以确定中间代理服务器对请求所
做的处理。主要用于调试目的。
CONNECT : 用于建立一个到由目标资源标识的服务器的隧道。通常用于代理服务器场景,建立 HTTPS 隧道等。
GET 方法参数写法是固定的吗?
在约定中,我们的参数是写在 URL 的 ? 后面,多个参数之间用 & 分割。
我们知道,解析报文的过程是通过获取 TCP 数据,用正则等工具从数据中获取 Header 和 Body ,从而提取参数。
比如 header 请求头中添加 token ,来验证用户是否登录等权限问题。
也就是说,我们可以自己约定参数的写法,只要服务端能够解释出来就行,万变不离其宗。
GET 方法的长度限制是怎么回事?
网络上都会提到浏览器地址栏输入的参数是有限的。
首先说明一点,HTTP 协议没有 Body 和 URL 的长度限制,对 URL 限制的大多是浏览器和服务器的原因。
浏览器原因就不说了,服务器是因为处理长 URL 要消耗比较多的资源,为了性能和安全(防止恶意构造长 URL 来攻击)考虑,会给 URL 长度加限制。
POST 方法比 GET 方法安全?
有人说 POST 比 GET 安全,因为数据在地址栏上不可见。
然而,从传输的角度来说,它们都是不安全的,因为 HTTP 在网络上是明文传输的,只要在网络节点上捉包,就能完整地获取数据报文。要想安全传输,就只有加密,也就是 HTTPS。
POST 方法会产生两个 TCP 数据包?你了解吗?
有些文章中提到,POST 会将 header 和 body 分开送,先发送 header,服务端返回 100 状态码再发送 body 。HTTP 协议中没有明确说明 POST 会产生两个 TCP 数据包,而且实际测试(Chrome) 发现,header 和 body 不会分开发送。所以,header 和 body 分开发送是部分浏览器或框架地请求方法,不属于 POST 必然行为。
GET 和 POST 的区别,你知道哪些?
1、GET 语义是从服务器获取指定的资源,POST 的语义是根据请求负荷(报文body) 对指定的资源做出处理
2、GET 请求的参数位置一般是写在 URL 中,以分割 URL 和传输数据,参数之间以 & 相连,所以 GET 不太安全。而 POST 把数据放在 HTTP 的包体内(requrest body)
3、大多数浏览器对 URL 的长度限制在 2048 个字符左右,这也意味着通过 GET 方法提交的数据(包含在 URL 中)通常不应超过这个长度,GET 提交的数据最大是 2K,POST 理论上没有限制。
4、GET 请求会被浏览器主动缓存,而 POST 不会,除非手动设置。
5、本质区别:GET 是幂等的,而 POST 不是幂等的。
幂等性:是指一次和多次请求某一个资源应该具有同样的副作用。简单来说意味着对同一 URL 的多个请求应该返回同样的结果。
正因为它们有这样的区别,所以不应该且不能用 GET 请求做数据的增删改这些副作用的操作。因为 GET 请求是幂等的,在网络不好的隧道中会尝试重试。如果用 GET 请求增数据,会有重复操作的风险,而这种重复操作可能会导致副作用(浏览器和操作系统并不知道你会用 GET 请求去做增操作)。
GET 与 POST 传递数据的最大长度能够达到多少呢?
GET 时通过 URL 提交数据,因此 GET 可提交的数据量就跟 URL 所能达到的最大长度有直接关系。
很多文章都说 GET 方式提交的数据最多只能时 1024 字节,而实际上,URL 不存在参数上限的问题,HTTP 协议规范也没有对 URL 长度进行限制。
这个限制是特定的浏览器及服务器对它的限制,比如 IE 对 URL 长度的限制是 2083 字节(2K + 35 字节)。对于其他浏览器,如 FireFox , Netscape 等,则没有长度限制,这个时候其限制取决于服务器的操作系统;即如果 URL 太长,服务器可能会因为安全方面的设置从而拒绝请求或者发生不完整的数据请求。
POST 理论上讲是没有大小限制的,HTTP 协议规范也没有进行大小限制,但实际上 POST 所能传递的数据量大小取决于服务器的设置和内存的大小。
因为我们一般 POST 的数据量很少超过 MB 的,所以我们很少能感觉的到 POST 的数据量限制,但实际中,如果你上传文件的过程中可能会发现这样一个问题,即上传个头比较大的文件到服务器时候,可能上传不上去。
HTTP 请求和响应报文有哪些主要字段?
请求报文:
请求行(Request Line):方法、请求 URL 、HTTP 版本等
请求头(Request Headers):Host、Accept、Cookie 等
请求体(Request Body)
响应报文:
状态行(Status Line):HTTP 版本、状态码、状态描述等
响应头(Request Headers):Content-Type、Content-Length 等
响应体(Request Body):服务器返回内容
常见的 HTTP 状态码有哪些?
状态码 | 类别 | 含义 |
1XX | Informational (信息性状态码) | 接收的请求正在处理 |
2XX | Success (成功状态码) | 请求正常处理完毕 |
3XX | Redirection (重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error (客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error (服务器错误状态码) | 服务器处理请求出错 |
1XX 信息
100 Continue : 表明到目前为止都很正常,客户端可以继续发送请求或者忽略这个响应。
2XX 成功
200 OK
204 No Content : 请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送消息,而不需要返回数据时使用。
206 Partial Content : 表示客户端进行了范围请求,响应报文包含由 Content-Range 指定范围的实体内容。
3XX 重定向
301 Moved Permanently : 永久性重定向
302 Found : 临时性重定向
303 See Other : 和 302 有着相同的功能,但是 303 明确要求客户端应该采用 GET 方法获取资源
304 Not Modified : 如果请求报文首部包含一些条件,例如:If-Match , If-Modified-Since , If-NoneMatch , If-Range , If-Unmodified-Since , 如果不满足条件,则服务器会返回 304 状态码
307 Temporary Redirect : 临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法
4XX 客户端错误
400 Bad Request : 请求报文中存在语法错误
401 Unauthorized : 该状态码表示发送的请求需要有认证信息(BASIC 认证、DIGEST 认证)。
如果之间已进行过一次请求,则表示用户认证失败。
403 Forbidden : 请求被拒绝
404 Not Found
5XX 服务器错误
500 Internal Server Error : 服务器正在执行请求时发生错误
503 Service Unavailable : 服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
HTTP 的缺点有哪些?
使用明文进行通信,内容可能会被窃听;
不验证通信方的身份,通信方的身份有可能遭遇伪装;
无法证明报文的完整性,报文有可能遭篡改。