HTTP 协议介绍
HTTP协议(HyperText Transfer Protocol,超文本传输协议),用来规定服务端和浏览器之间的数据交互的格式,也是用于从万维网(WWW:World Wide Web)服务器传输超文本到本地浏览器的传送协议。
该协议构建于TCP/IP 协议族之上,属于应用层协议。主要用于传输与超文本相关的资源文件,如HTML网页,css,js,图片,视频,音频等。其中 HTTP1.0、HTTP1.1、HTTP2.0 均为 TCP 实现,HTTP3.0 基于 UDP 实现。现主流使用 HTTP1.0 和 HTTP3.0。
协议: 为了使数据在网络上从源头到达目的,网络通信的参与方必须遵循相同的规则,这套规则称为协议,它最终体现为在网络上传输的数据包的格式。
通俗点讲,协议就是要保证网络通信的双方,能够互相对接上号。就像是两个人传递纸条通过互相指定的暗号,如果发送天亮了,表示可以打游戏了等等。
注意: 当我们访问一些网页时,是显示通过 HTTPS 来进行通信的,并且当下大多数的网页都是通过 HTTPS 来进行通信的,因为 HTTPS 在 HTTP 的基础上做了一个加密的工作。
HTTP和HTTPS的区别
- 直接构建于TCP协议之上
- 没有进行加密传输数据的是HTTP协议
- 默认通信端口是80端口
- 常用端口有:3000,5000,8000,8080等。
- 构建于TLS或SSL协议之上
- 对数据使用SSL加壳加密传输数据的是HTTPS协议
- 默认通信端口是443端口
- 常用端口8443。
HTTP协议的四大特性
http协议具有无状态、无事务、所有请求必有所回应的特点。
(1)基于请求、响应
当我们在浏览器输入一个网址,此时浏览器就会给对应的服务器发送一个 HTTP 请求,对应的服务器收到这个请求之后,经过计算处理,就会返回一个 HTTP 响应。并且当我们访问一个网站时,可能涉及不止一次的 HTTP 请求和响应的交互过程。
基础术语:
客户端: 主动发起网络请求的一端
服务器: 被动接收网络请求的一端
请求: 客户端给服务器发送的数据
响应: 服务器给客户端返回的数据
HTTP 协议的重要特点: 一发一收,一问一答
注意: 网络编程中,除了一发一收之外,还有其它的模式
- 多发一收:例如上传大文件
- 一发多收:例如看直播时,搜索一个词条可以得到多个视频源
- 多发多收:例如串流(steam link、moonlight 等等)
(2)基于TCP/IP作用于应用层之上的协议
- 应用层协议:HTTP HTTPS FTP ...
(3)无状态
HTTP是一种不保存状态,即无状态(stateless)协议。HTTP协议自身不对请求和响应之间的通信状态进行保存。也就是说在HTTP这个级别,协议对于发送过的请求或响应都不做持久化处理。
总结:见你千百遍,我始终待你如初恋。
-
所谓的无状态是指http协议默认情况下,服务端不识别客户端的。
-
在客户端多次发起请求到同一个服务器,服务端接收到客户端的请求在处理完成以后就会主动断开。
-
所以对于客户端的每一次请求,对于服务端来说,都是一次新的客户端请求。
-
也就是说,服务端无法区分多次请求的客户端是否同一个客户端。
问题:比如,用户登录到一家购物网站,即使他跳转到该站的 其他页面后,也需要能继续保持登录状态。针对这个实例,网站为了能 够掌握是谁送出的请求,需要保存用户的状态。那怎样实现?
使用一些专门记录用户状态的技术:cookie、session、token....
(4)短连接
- 请求来一次我响应一次,之后我们两个就没有任何链接和关系了
补充:双方建立连接之后默认不断开,例:websocket(群聊功能,服务端主动给客户端发消息)
请求协议 和 HTTP响应协议
1、请求协议
(1) 请求数据格式
HTTP GET方法的请求格式
客户端给服务端发送消息应该遵循的数据格式
- 请求首行(标识HTTP协议版本,当前请求方法)
- 请求头(一大堆k:v键值对)
- 换行不可省略(\r\n)
- 请求体(并不是所有的请求方式都有,get没有post有,存放的是post请求提交的敏感数据)
(2)请求行
请求行由三部分组成:请求方法 、请求路径 、HTTP协议版本。
- HTTP请求方法(HTTP Request Method):表示客户端希望对服务器指定资源进行哪一种类型的操作;
- 请求路径:表示远程web服务器的一个可访问资源;
- HTTP协议版本:表示客户端目前使用的HTTP协议版本,并期望服务端也采用同样版本的协议与客户端进行通信。
请求方法
-
“get” 请求 : 朝服务端索要数据
-
url?username=xiao&password=123
-
eg:输入网址获取对应的内容
-
-
“post” 请求 : 朝服务端提交数据
- eg:用户登录,输入用户名和密码之后,提交到服务端后端做身份校验
常见请求方法如下:
请求方法 | 描述 | 报文中是否包含请求体 |
---|---|---|
GET | 表示客户端希望从服务器中获取或下载资源信息 | Flase |
POST | 表示客户端希望上传文件或通过请求在服务器创建资源信息。 | True |
PUT | 表示客户端希望修改或更新服务器资源(表示修改全部资源信息,例如数据表的一整个记录) | True |
PATCH | 表示客户端希望修改或更新服务器资源(表示修改部分资源信息,例如数据表的一个记录里面某个属性值) | True |
DELETE | 表示客户端希望删除或废弃服务器资源 | Flase |
OPTION | 表示客户端希望获取服务器所支持的请求方法列表 | Flase |
HEAD | 表示客户端希望获取服务器支持的跨域地址列表 | Flase |
请求路径
- 表示远程web服务器的一个可访问资源。
- 一般就是代表的就是一个服务器的具体文件或数据表中的记录信息,或一个服务端里面的函数或方法。
/ 表示根路径
/1.html 表示web服务器中web根目录下的1.html文件
/login 表示web服务器中的一个login方法或者login函数
http协议版本
-
表示客户端目前使用的HTTP协议版本,并期望服务端也采用同样版本的协议与客户端进行通信。
-
http协议发展至今已经到了HTTP/3.0版本,目前主流的使用版本有:HTTP/1.0 、HTTP/1.1、 HTTP/3.0。
(3)请求头
- HTTP请求头(Request Head)
- 主要对客户端请求操作进行限制条件与补充说明。
- 常见的标准HTTP请求头如下:
选项 | 描述 | 值 |
---|---|---|
Host | 指定客户端请求的服务器的域名和端口号。 | www.baidu.com |
Content-Type | 告诉服务器,客户端请求携带的请求体数据的媒体类型信息(MIME类型) | |
User-Agent | 告知服务器HTTP 客户端网络代理程序的版本信息,一般就是浏览器的版本信息。 | |
Authorization | 告知服务器客户端的Web认证信息。 | |
Content-Length | HTTP报文中请求体的大小,以字节为单位。 | |
Referer | 告诉服务器该网页是从哪个页面链接过来。也就是上一页页面的地址。 | |
Accept | 指定客户端能够接收并理解的媒体类型类型(MIME类型),用于表达希望服务端的返回资源格式。 | |
Accept-Encoding | 指定浏览器可以支持的web服务器返回内容压缩编码类型。 | gzip, deflate, br |
Pragma | 指定服务端控制缓存行为。http/1.0以前的字段。 | Pragme: no-cache |
Cache-Control | 指定服务端控制缓存行为。http/1.1以后的字段。 | Cache-Control: no-cache |
Upgrade | 向服务器请求在当前http协议的基础上升级采用新的某种传输协议以便服务器进行转换 | 常用于http协议升级到ws协议。 |
Connection | 指定本次http通信结束以后,是否关闭TCP网络连接。如果设置持久连接,则可以在一次会话中,可以使用同一个TCP连接,进行多次的HTTP通信,提高效率。 | 持久连接,Connection: keep-alive 非持久连接,Connection: close |
注意:在http通信过程中,请求头也是可以自定义的,但是不能出现多字节编码字符,例如中文等。
(4)常见的MIME格式
类型 | 描述 | 别名 |
---|---|---|
text/html | HTML网页 | |
application/json | json文本 | text/json |
text/plain | 纯文本,普通文本 | |
text/xml | xml文档 | |
application/javascript | js脚本 | text/javascript |
text/css | css样式 | |
image/png | png格式图片 | |
image/jpeg | jpg格式图片 | |
image/gif | gif格式图片 | |
application/x-gzip | gzip格式压缩包 | |
application/msword | doc文档 | |
application/vnd.openxmlformats-officedocument.wordprocessingml.document | docx文档 | |
application/vnd.ms-excel | xls文档 | |
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | xlsx文档 | |
application/pdf | pdf文档 | |
audio/mpeg | mp3音频 | |
video/mp4 | mp4视频 |
(5)URL
- 统一资源定位符(网址)
2、HTTP响应
服务器收到了客户端发来的HTTP请求后,根据HTTP请求中的动作要求,服务端做出具体的动作,将结果回应给客户端,称为HTTP响应。
(1)响应数据格式
服务端给客户端发送消息应该遵循的数据格式
- 响应首行(标识HTTP协议版本,响应状态码)
- 响应头(一大堆k:v键值对)
- 换行不可省略(\r\n)
- 响应体(返回给浏览器展示给用户看的数据)
(2)响应行
HTTP响应行(HTTP Request Line),是HTTP响应报文的首行。由三部分组成:状态行、响应头、响应正文;
- 状态行:包括协议版本Version、状态码Status Code、回应短语;
- 响应头(server header):包括搭建服务器的软件,发送响应的时间,回应数据的格式等信息,包含HTTP状态码 (HTTP Status Code) ;
- 响应正文:就是响应的具体数据。
HTTP协议版本
- 响应报文的HTTP协议版本,与客户端的协议版本保持一致。
- 例如:HTTP/1.0,HTTP/1.1。
响应状态码
- 状态码(Status Code)
- 用一串简单的数字来表示一些复杂的状态或者描述性信息
状态码类型 | 描述 |
---|---|
1xx | 服务端已经成功接受到了你的数据正在处理,你可以继续提交额外的数据。 |
2xx | 服务端成功响应了你想要的数据。 |
3xx | 重定向(当你在访问一个需要登录之后才能看的页面,你回发现自动跳转到登录页面,例如:学校校园网登录认证) |
4xx | 告诉客户端,本次请求有误,服务器无法处理。 |
5xx | 告诉客户端,本次请求服务端在处理过程中服务端出错了。 |
ps:上述的状态码是HTTP协议规定的,其实到了公司之后每个公司还会自定定制自己状态码及提示信息
常见的HTTP状态码
状态码 | 响应信息 | 描述 |
---|---|---|
101 | Switching Protocols | 服务器已经理解了客户端的请求,并将通过Upgrade消息头通知客户端采用升级协议来完成请求。 |
200 | OK | 请求已成功,请求所希望的响应头或数据体将随此响应返回。出现此状态码是表示正常状态。常用于GET,PUT或PATCH |
201 | Created | 请求已成功,请求的资源已经创建成功或更新完成,常用于POST,PUT或PATCH |
204 | No Content | 请求已成功,但是没有任何内容返回。常用于DEELTE |
301 | Moved Permanently | 永久重定向,表示当前客户端请求的资源地址已经永久发生改变。 |
302 | Move Temporarily | 临时重定向,表示当前客户端请求的资源地址还存在,但是访问客户端达不到访问资源的条件,所以暂时无法访问。 |
304 | Not Modified | 表示本次客户端请求的资源,并非来自服务端,而是本地缓存。如果web项目有做了客户端缓存,一般静态文件都会出现304 |
305 | Use Proxy | 被请求的资源必须通过指定的代理才能被访问。 |
307 | Temporary Redirect | 请求的资源临时从不同的URI 响应请求。 |
400 | Bad Request | 本次请求,报文语义有误或请求参数有误,当前请求无法被服务器理解。 |
401 | Unauthorized | 本次请求,需要需要用户验证,但用户并没有提供认证。 |
403 | Forbidden | 服务器已经理解请求,但是拒绝执行它。一般是因为没有权限导致的。 |
404 | Not Found | 请求失败,请求所希望得到的资源未被在服务器上发现,请求路径不存在。 |
405 | Method Not Allowed | 请求行中指定的请求方法不能被用于请求相应的资源。使用了错误的请求方法。 |
500 | Internal Server Error | 服务器遇到了一个未曾预料的状况,导致了它无法完成对请求的处理。就是服务端的代码报错了。 |
502 | Bad Gateway | 网关宕机,作为网关或者代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应。一般就是大量访问请求导致服务器瘫痪或宕机了。 |
503 | Service Unavailable | 网关过载,由于临时的服务器维护或者过载,服务器当前无法处理请求。 |
504 | Gateway Timeout | 网关超时,作为网关或者代理工作的服务器尝试执行请求时,未能及时从上游服务器或者辅助服务器(例如DNS)收到响应。 |
507 | Insufficient Storage | 服务器无法存储完成请求所必须的内容。 |
(3)响应头
- HTTP响应头(Response Head),主要是服务器返回的内容进行补充说明,并提供下一次请求的一些辅助信息。
选项 | 描述 |
---|---|
Content-Type | 告知客户端,响应数据的MIME类型 |
Content-Length | 告知客户端,响应数据的字节大小 |
Content-Encoding | 告知客户端,响应数据采用的压缩格式 |
Server | 告知客户端,响应服务器的名字或类型 |
Date | 告知客户端,响应请求的时间 |
Location | 告知客户端,实际要请求的资源地址(用于301或302进行页面跳转) |
Cache-Control | 告知客户端,响应数据的缓存机制 |
Refresh | 告知客户端,要定时刷新的时间间隔 |
Connection | 告知客户端,本次HTTP通信完成以后是否要保持TCP连接。 |
Transfer-Encoding | 告知客户端,数据是以分块方式响应回来的。 |
Content-Disposition | 告知客户端,以下载方式打数据的,格式:Content-Disposition: attachment;filename=文件名 |
Expires | 告知客户端,响应数据的过期事件,-1表示马上过期,客户端不要缓存当前响应数据。 |
Retry-After | 告知客户端,应该在多久之后再次发送请求。常见于服务端限流,或503中。 |
Access-Control-Allow-Origin | 指定客户端通过哪些域名下的脚本可以访问服务器资源。 |
Access-Control-Allow-Methods | 指定客户端通过哪些HTTP请求方法访问服务端资源。 |
Access-Control-Allow-Headers | 指定客户端请求服务器的报文中,允许包含哪些请求头。 |
3、get 与 post 的区别
标签:协议,HTTP,请求,前端,响应,服务器,服务端,客户端 From: https://www.cnblogs.com/xiao01/p/18081232
- 都可以携带额外的参数 :
GET 提交的数据会放在URL之后,以"?"分割URL和传输数据,参数之间以"&"相连
POST方法是把提交的数据放在HTTP包的请求体(Body)中.- 提交的数据大小限制 :
浏览器对URL长度有限制, 所以GET提交的数据大小有限制
POST方法没有数据大小限制- 数据的安全性 :
GET方式提交数据, 会带来安全问题, 比如一个登录页面, 通过GET方式提交数据时, 用户名和密码将出现在URL上
如果页面可以被缓存或者其他人可以访问这台机器, 就可以从历史记录获得该用户的账号和密码