本文最后更新于 302 天前,内容可能失效,如有问题,请联系 imerryou@imerryou.com
前言
不知道你们是否注意到了,我们现在几乎浏览的每一个网址前面,都带上了“https”的样式,网址前面还会显示一个小锁或一个打勾的样式,看着就好像很安全的样子。但是“https”的原始形态可是“http”,是不是也很熟悉?虽然现在用的不是很多了,但依然还是能看到他的身影,很典型的就是政府网站了,例如以下一些。
那么你们有没有好奇过这些融入我们生活的技术究竟是什么,那么接下来我就以最初的http1.0版本来讲解一下这门技术。
为什么不讲现在最广泛使用的http2.0呢?因为后面加入了很多额外的规则,不方便展开讲,而1.0版本已经基本能够完整解释这门技术了。
随便截了张http2.0协议的目录,只能说笔者还是太才疏学浅了。
HTTP简介
HTTP是由Tim Berners-Lee这位大佬在1990年提出来的,然后在1996年被IETF(The Internet Engineering Task Force)规范并发布为HTTP1.0,代号为RFC1945,下图为部分截图
这里的MIT/LCS则指的是麻省理工学院计算机科学实验室(Laboratory for Computer Science)。
来看看百度百科对HTTP的定义
超文本传输协议(Hypertext Transfer Protocol,HTTP)是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII形式给出;而消息内容则具有一个类似MIME的格式。超文本传输协议是一种用于分布式、协作式和超媒体信息系统的应用层协议,是万维网WWW(World Wide Web)的数据通信的基础。
可以看出,这是一个很底层的协议了,现在绝大部分客户端和服务端都采用这样的通信方式。
通信
前面讲了,http服务于客户端和服务端。客户端和服务端的关系就像是消费者和商家,听名字也可知晓一二。客户端一般部署在个人终端,像手机啊,电脑啊。而服务端则一般部署在远程的云服务器里。虽然说通信肯定远远不只有http这个东西
正如上图所示,网络通信是很复杂的,我们讲的http仅仅属于其中的应用层。
其实说来也不难理解,你玩过纸杯穿根线然后传声嘛。我们的http就好像是这种方法本身,但是这种方法怎么实现,像纸杯和线怎么造出来,规格如何就管不到了。
有点扯远了。
那么http里是如何规定的呢?
请求和响应
这个容易理解,比如你随便点个网站下载个什么,就会向服务端发送一个请求,你开始下载了,就代表服务端返回给你了你要的东西并且让你开始下载了。和我前面举的消费者和商家的关系也十分相似。
那么我们向服务端是发送的请求是什么东西呢?
没错,就是报文(message)
请求
请求分为简单请求和完整请求
简单请求的格式如下
<方法> <请求URL>
即
方法 SP 请求URL CRLF
(CRLF是啥自行百度哟)
这种请求格式是为了兼容早期没有头部字段的http0.9,http0.9没有成文的官方规定,属于非常基础的协议。协议里也对这种请求进行了限制。
如果一个 HTTP/1.0 服务器收到一个简单请求,它必须用 HTTP/0.9 简单响应来回应。一个能够接收完整响应的 HTTP/1.0 客户端绝不应该生成简单请求。
If an HTTP/1.0 server receives a Simple-Request, it must respond withan HTTP/0.9 Simple-Response. An HTTP/1.0 client capable of receivinga Full-Response should never generate a Simple-Request.
完整请求的格式如下
<方法> <请求url>
即
请求行 *( 通用头部字段| 请求头部字段| 实体头部字段 ) CRLF[实体主体]
请求行就是简单请求URL后面加个http版本。
方法主要指的是客户端请求服务端对指定资源执行的操作类型,我会在后面对方法的类型进行详细的讲解。
请求url就是你所请求的资源的路径。
请求首部主要是描述一下你资源的属性和条件,分为通用头部字段、请求头部字段和实体头部字段。
| 都知道是或的意思,这里的 * 指的是可以出现任意次数。
这里我就不展开讲这三种字段了,否则篇幅就过长了。
实体主体指的就是HTTP请求或响应中包含的实际数据部分。比如你GET一般就不用包含,POST一般就要包含了。
[ ]指的是可以出现0或1次。
好了,请求报文写完了,发出去了,服务器怎么回复呢?
响应
响应也分成简单响应和完整响应,并且都和请求挺相似的。
简单响应格式如下
就是直接
[实体主体]
完整响应格式如下
即
状态行 ; *( 通用头部字段 | 响应头部字段 | 实体头部字段) CRLF[ 实体主体 ]
状态行就是http版本 SP 状态码 SP 原因短语 CRLF
状态码是一个三位数字的代码,用来表示服务端对请求的响应结果。后面我们来详细讲状态码。
响应头部和请求头部的差异也就只有响应头部字段,这里也不详细展开讲了。
当然,后面有时间肯定会单独写一篇headers的文章。
也是很复杂的东西啊。
这样一来二去,我们基本就能完成服务端和客户端的通信了,接下来我们就说说请求和响应里最重要的知识,方法(Method)和状态码(Status-Code)
方法和状态码
方法
http方法还是挺多的,熟知的就有GET POST HEAD,http1.0里也着重讲了这三个
GET
用于请求指定资源的数据,并让服务端返回指定资源,资源在实体主体中。这是一种很安全的方法,因为它只检索数据,不会导致服务器上的资源改变。
POST
用于向指定资源提交数据,也就是上传文件到服务器里,这通常会导致服务器上资源的创建或修改。
HEAD
类似于 GET 方法,但不要求服务器返回资源。用于获取资源详细信息而不是资源本身。可以用来测试链接的有效性和获取资源的修改信息。
其他
PUT:用于将请求体中的数据替换指定的资源全部内容。如果该资源不存在,则可能会创建新资源。
DELETE:用于删除指定的资源。
OPTIONS:用于描述目标资源的通信选项。可以查询服务器支持哪些 HTTP 方法。
PATCH:用于对资源进行部分修改。与 PUT 不同,PUT 通常用于替换整个资源。
TRACE:用于请求服务器回显请求消息,主要用于诊断。
CONNECT:用于将请求连接转换为一个传输层的 TCP/IP 隧道,通常用于代理服务器。
状态码
状态码虽然很多,远远比方法多,但是有一定的规律。
其实看文档目录差不多就能知道个七七八八了。
1xx 信息性状态码
一般表示接收到的请求正在处理中。这类状态码通常是临时的,一般用于通知客户端一些关于请求的处理信息。
常用的有:
100 Continue:服务器已收到请求的第一部分,请求者应继续发送其余部分。
101 Switching Protocols:服务器同意更改协议,通常是从HTTP切换到HTTPS。
2xx 成功状态码
一般表示请求已成功被服务器接收、理解,并接受。这类状态码意味着请求已成功处理了。
常用的有:
200 OK:请求成功,服务器返回了请求的数据。
201 Created:请求成功,并且服务器创建了新的资源。
202 Accepted:服务器已接受请求,但尚未处理。
204 No Content:请求成功,但没有内容需要返回。
3xx 重定向状态码
一般表示需要后续操作才能完成请求。这类状态码通常用于告诉客户端存在附加条件,需要客户端采取进一步的操作才能完成请求。一般和缓存相关。
常用的有:
301 Moved Permanently:请求的资源已被永久移动到新位置,客户端应使用新的URL再次发起请求。
302 Found:请求的资源临时被移动到新位置,客户端应使用新的URL再次发起请求,但资源的原始URL仍有效。
304 Not Modified:自从上次请求后,资源没有被修改过,客户端可以使用缓存的版本。
4xx 客户端错误状态码
一般表示请求包含错误,服务器无法处理。这类状态码通常意味着错误是由客户端引起的,如请求语法错误或请求无法实现。
常用的有:
400 Bad Request:服务器无法理解请求,因为请求的语法错误。
401 Unauthorized:请求要求用户的身份认证。
403 Forbidden:服务器理解请求,但是拒绝执行此请求。
404 Not Found:服务器无法找到请求的资源。
408 Request Timeout:服务器等待客户端发送请求数据时间过长,超时。
403、404很常见是吧,以后看到也能知道大概什么意思了
5xx 服务器错误状态码
表示服务器在处理请求的过程中发生了错误,无法完成请求。这类状态码通常意味着错误是由服务器引起的,如服务器内部错误或服务器资源不足。
常用的有:
500 Internal Server Error:服务器遇到意外情况,无法完成请求。
501 Not Implemented:服务器不支持请求的功能,无法完成请求。
502 Bad Gateway:服务器作为网关或代理,从上游服务器收到无效响应。
503 Service Unavailable:服务器暂时无法处理请求,通常是由于过载或维护。
浏览器
那么,浏览器的作用是什么呢?为什么我们能够通过在浏览器里输入网址来进入网页呢?
浏览器很显然是一个伟大的发明,但笔者在此文中只探讨浏览器和http的关系。
二者显然是相辅相成的。浏览器可以解析网站的服务器和资源地址,然后根据用户的自主选择,能够自动生成我们前面所说的请求报文发送给服务器,然后可以解析服务器发来的响应报文并将结果呈现出来。可以说浏览器的作用是不可替代的。
HTTP的发展以及协议原文
1996年,HTTP 1.0发布。
1999年,HTTP 1.1发布。
2015年,HTTP 2.0发布。
2022年,HTTP 3.0发布。
但是现在主流用的应该还是1.1和2.0。
探讨技术的话,看看下面这则http1.0协议的文档吧。
rfc1945.txt.pdf
未完待续