引言
原文如下:
3.1 HTTP 常见面试题 | 小林coding (xiaolincoding.com)
HTTP 是什么?
一句话解释是:超文本传输协议,HyperText Transfer Protocol。
超文本传输协议的概念可以拆分为三部分:
- 协议:分为“协”和“议”两个部分,协代表协商,所以必须是两个人以上才能完成,“议”表示协商的具体内容,白纸黑字的约定。
- 超文本:超文本我们得重点关注超这个单词,在英文里面叫做
Super
,它有一个含义是更加,简单理解为“更多的文本”,按照老外的思考逻辑我们应该理解为“不仅仅是文本”。 - 传输:注意在HTTP中的传输不仅仅是单方向的,我们传输给对方信息的同时也期待对方能够回应,根据传输的定义我们可以发现HTTP协议本身就是双向的,也就说说HTTP是一个双向协议。
三者的关系:超文本 ⊆ 传输 ⊆ 协议
HTTP下定义:实现两台计算机(或者说设备)两点之间不仅限于文本的数据传输的约定或规范。
针对HTTP,我们还可以给出这样的说法。
- HTTP 是用在计算机世界里的协议,确定了计算机之间的通信交流规范,以及相关的各种控制和错误处理方式。
- HTTP 专门用来在两点之间传输数据,不能用于广播、寻址或路由。
- HTTP 传输的是文字、图片、音频、视频等超文本数据。
- HTTP 是构建互联网的重要基础技术s,它没有实体,依赖许多其他的技术来实现,但同时许多技术也都依赖于它。
HTTP 常⻅的状态码,有哪些?
关联文章:[[《图解HTTP》- 状态码]]
(必须吹一波小林的图做的真好)
状态码定义
- 1XX:1XX开头多为信息提示信息,几乎看不到使用场景,忽略即可。此外1XX的状态码并不会影响到SEO 优化。
- 2XX: HTTP状态代码是成功请求。 比如HTTP 200 OK成功状态响应代码指示请求已成功。
- 3XX:HTTP状态代码指示重定向。 最常见的 3XX HTTP状态代码包括“ 301永久移动”,“找到302”和“ 307临时重定向” HTTP状态代码。
- 4XX 状态代码是客户端错误。 最常见的4xx状态代码是“ 404未找到”和“ 410消失” HTTP状态代码。
- 5XX HTTP状态代码是服务器错误。 最常见的5xx HTTP状态代码是“ 503服务不可用”状态代码。
常见的响应码:
更多状态码的定义可以看这一篇文章:[[《图解HTTP》- 状态码]]
2XX状态码:
- 200:表示一切正常,⾮HEAD 请求,服务器返回的响应头都会有 body 数据。
- 204 No Content 常见成功状态码,和200相同但是没body。
- 206 Partial Content 应用于HTTP分块下载或者断点续传,主要表示响应数据并不是全部,而是其中一部分。
3XX状态码:301:表示永久重定向,表示资源不在原来的位置,需要新的URL访问。 302:临时重定向,资源还在但是需要另一个URL访问。 304:请求的资源没有改变,但是被重定向到已缓冲的文件,所以也叫做缓存重定向,这个子弹主要是用于缓存处理。
400状态码:
需要注意的状态码区别
- 401 和 403 的区别(登录、权限)
- 401 未授权:客户端访问请求的资源需要授权。响应内容中需要包含www-Authnticate 头信息和询问信息,如果已经存在证书访问还是401说明证书已经不被接受,如果401和前一个身份验证请求相同,并且浏览器进行了至少一次重试,则浏览器应该展示响应包含的实体信息(也就是诊断信息)。
- 403 Forbidden:客户端尝试访问的资源被禁止。和401的区别是不提供任何身份认证的帮助,也不允许重复提交,但是服务端有义务声明不能访问的理由。
- 404 和 410 的区别(是否永久不存在)
- 404 未找到:服务器可访问,但客户端查找的特定页面不可访问或者资源不存在。服务可以利用这个状态码暴露自己服务存在的同时不想暴露“资源存在”。
- 410 Gone:客户端想要访问的资源已被永久删除。主要用于服务端想要删除某个资源并且告知用户此资源不再接受访问的一种提示。注意这个状态码很像404,最大的区别是资源是否永久不存在。
- 408 和 504 的区别(服务端接收客户端超时、代理接收服务端超时)
- 408 请求超时:客户端向网站服务器发送的请求已过期,切记这个错误来自客户端。客户端可以随时再次提交这一请求而无需进行任何更改。
- 504 网关超时:服务器充当网关或者代理的时候,没有收到响应。和408的区别是408是服务端接受客户端超时,504是代理接收服务端超时。
- 409 的场景(资源支持版本)409 冲突:发送的请求与服务器的内部操作发生冲突。注意只有在客户端具备自身处理能力,比如重新提交请求的前提下才能返回此状态码,响应信息中也需要提供冲突的源头内容。 此外冲突通常会发生在
PUT
请求当中,在使用版本检查的情况下,如果某次请求附带的版本信息和之前的内容冲突,就会返回此响应码。
HTTP 常见字段有哪些?
首先列举一遍,然后根据需要一个个过:
Host
字段Content-Length
字段Connection
字段Content-Type
字段Content-Encoding
字段- Host:用于客户端请求的时候指定服务端的域名。有时候同一个域名绑定多个服务器,通过此字段可以获取同一台服务器的不同网站。
- Content-Length:表示本次返回数据长度。
- Content-Encoding 字段:表示数据的压缩方式,表示服务器使用的压缩格式。比如使用GZIP的方式对于请求内容进行压缩。
- Connection:主要的作用对于服务器的TCP进行持久链接,常用属性为
Keep-Alive
。 - Content-Type:表示指定本次请求返回的时候使用什么样的格式返回,
常见请求头
GET与POST
两者主要区别:
- GET天然具备幂等性,幂等性指的是无论请求多少次,每次请求的结果都应该是一致的,不多次请求改变请求的状态。而POST请求通常很难保持幂等性,比如一次支付请求在重复提交的过程中,后到达的请求会被挡掉。
- GET请求通常用于直接获取浏览器的资源,但是请求的URL会因为浏览器受到限制,并且URL传输的只能是ASCII字符,中文字符传输会被转义(HTTP协议本身没有限制URL长度)。POST请求定义为携带请求载荷数据对于服务器资源进行处理。
看完主要区别,再强调一下幂等性的关系:
- GET本身就是幂等和安全的,浏览器可以对于GET请求进行缓存,理论上浏览器可以利用缓存完全避免对于服务器的请求,当然还有一种方式是借助NGINX代理等方式。GET请求可以作为书签使用。
- POST对于服务器资源做修改操作的时候会修改资源,所以POST请求不具备幂等性,并且上文说的重复提交的场景也是导致不幂等的原因之一。所以浏览器一般不会缓存POST请求,也不能把POST请求当书签。
小结:
- GET 本身就是安全幂等的,GET的定义是获取资源。
- POST请求是通过负荷对于服务器进行操作,由于操作之后数据状态会发生改变,每次操作结果都会不同,所以是不幂等的。POST不幂等所以不能进行缓存。
但是我们需要避免先入为主的观念,比如可以使用GET对于数据进行增加和删除,也可以通过POST查询数据,幂等只是协议规范里面的定义。
HTTP本身就是明文传输,所谓的数据安全传输不是由请求方法决定的,而是取决于服务端对于敏感数据的保护。
所以为了保护这些数据,很多服务器对于敏感数据都会使用HTTPS的请求。
现在还有最后一个问题,,GET请求能不能带BODY?
答案是可以。RFC没有规定GET才能传数据,也没有规定POST不能URL传参。
最后留个小问题,如果在POST请求URL当中设置A=10,同时在请求BODY中设置A=20,假设服务端没有对请求方法做限制,A=?
HTTP不是什么
- HTTP 不是互联网。虽然大部分情况下我们接触HTTP协议是最为频繁的,但是并不是所有的互联网数据传输都是依赖HTTP,比如邮件依赖SMTP和POP3,服务器文件需要FTP等。
- HTTP 不是编程语言。 而是一份协议,所谓的协议就是计算机和计算机之间的交流语言规范,
- HTTP 不是 HTML。虽然经常出现,但是两者是完全不同的技术。HTTP是通信层数据传输协议,HTML是超文本标记语言,最直接的区别是HTML是标记的“编程语言”。但是HTML通常编写需要HTTP传输的相关文本数据进行交互和展示。
- HTTP 不是一个孤立的协议。 指的是它是TCP/IP 协议群里面的一员,HTTP本身是不具备数据传输功能的,我们所看到的网页从服务器依靠TCP/IP 各层通信协议的配合,最终才送到客户端提供给用户浏览。
HTTP 历史快速回顾
- HTTP 协议始于三十年前蒂姆·伯纳斯 - 李的一篇论s文;
- HTTP/0.9 是个简单的文本协议,只能获取文本资源;
- HTTP/1.0 确立了大部分现在使用的技术,但它不是正式标准;
- HTTP/1.1 是目前互联网上使用最广泛的协议,功能也非常完善;
- HTTP/2 基于 Google 的 SPDY 协议,注重性能改善,但普及程度不是很理想;
- HTTP/3 基于 Google 的 QUIC 协议,但是存在某些缺陷,目前有大厂以此进行改进。
FAQ
HTTP 是⽤于从互联⽹服务器传输超⽂本到本地浏览器的协议 ,这种说法正确吗?
错误,首先HTTP协议传输是双向的,其次传输不一定是服务器到浏览器传输,可以使任意支持HTTP协议的设备。
什么是WebServer,什么是WebServer服务器
Web server是web服务器,web service是一种web服务协议