简介
HTTP(HyperText Transfer Protocol),当前一直使用的译法是超文本传输协议
。应该算是当前最广泛使用的一种网络协议,现在人们上网都少不了使用浏览器浏览网页,这里面使用的就是HTTP协议。
这里的Transfer是
转移,转换
的意思,不是传输的意思。当前的译法是一个历史遗留问题
发展史
HTTP协议更新还是比较慢的,也可以说明此协议还是比较稳定的,这么多年只发布了1.0、1.1、2.0三个版本。
- 1989年3月Tim BernersLee博士提出的一种能让远隔两地的研究者们共享知识的设想:借助多文档之间相互关联形成的超文本,连成可相互参阅的万维网(World Wide Web, 简称WWW或者web)。
- 1990年HTTP诞生,但是并没有形成一种标准,这时的HTTP被命名为HTTP/0.9
- 1996年5月,时隔六年之久才正式将HTTP做为一个标准公布,命名为HTTP/1.0,并记载于RFC1945。
- 1997年1月公布了HTTP/1.1版本是目前使用最为主流的HTTP协议版本。在HTTP/1.0的基础上增加了很多实用的特性。记载于RFC2068,后面又在RFC2626做了更新。
- 2015年5月HTTP/2.0版本公布,并记载于RFC7540。此版本来源于谷歌的SPDY协议,主要目标是降低延迟。当前浏览器应该都已经支持此版本,但是使用最多的还是HTTP/1.1版本
特点
HTTP有很明显的优点,也有很明显的缺点,所以现在单单使用HTTP协议的极少
- 原理简单。基于请求、响应方式来完成通信。客户端发出请求,服务端收到请求并处理返回响应信息。
- 无连接。即每次连接只处理一个请求,完成之后连接断开。在一开始很少人上网的时候是优点,但是当前上网人太多的时候就是一个缺点了,像同时发送大量请求的时候会导致创建大量的连接,浪费计算机资源。这点已经通过keepalive机制解决。
- 无状态。HTTP协议自身不对请求和响应之间的通信状态进行保存。这对于一个需要用户登录验证再操作的网站是一个灾难性的
优点
,因为每发一个请求都需要用户登录一次,不过当前已经通过cookie解决。 - 安全性很差,这个可以通过结合SSL/TLS协议解决,即我们所说的HTTPS:
- 通信使用明文,内容可以被窃听。
- 不验证通信方的身份,有可能遭遇伪装。
- 无法证明报文的完整性,内容有可能遭到篡改。
HTTP协议所处位置
HTTP是应用层协议底层使用的TCP/IP,如下图:
HTTP报文
HTTP报文结构包含首部和主体两个部分。根据HTTP的通信原理分为请求报文和响应报文
HTTP请求方法
主要是为了告知服务端要做什么样的操作。HTTP/1.1中可用的有:
- GET: 获取资源
- POST: 传输实体主体
- PUT: 传输文件,因安全性差一般不开启
- DELETE: 删除文件
- HEAD: 获取报文首部
- OPTIONS: 询问支持的方法
- TRACE: 追踪路径
PUT和POST是争议最大的两个方法,这两个方法都可以实现创建资源以及修改资源的目的,取决于设计实现。两者最主要的区别是PUT具有幂等性,而POST的具有。一般来讲都是使用PUT创建或者覆盖资源,而使用POST修改资源。
HTTP首部
HTTP首部由很多字段构成,每个字段由字段名和字段值构成,中间以":"分隔。字段值可以有多个以","分隔。每个字段值还可以设置属性以“;”分隔,q=[0,1]表示权重(即权重取值0到1,默认为1,越大权重越大)。
Accept-Language:zh-CN,zh;q=0.9
注意:当HTTP首部中出现了多个字段名一样的字段时,规范未做明确规定。所以结果也未可知,所以最好不要出现这种情况 。
4种HTTP首部
-
通用首部字段
请求报文和响应报文都会使用的字段。
常见的有:- Connection: 控制不在转发给代理的首部字段和管理持久连接
Connection:close
关闭连接
Connection:Keep-Alive
HTTP/1.0版本实现长连接的方法 - Upgrade:用于检测HTTP协议及其他协议是否可以使用更改版本进行通信,其参数值可以用来指定一个完全不同的通信协议,像WebSocket协议,就可以使用下面方法:
Connection: Upgrade Upgrade: websocket
- Connection: 控制不在转发给代理的首部字段和管理持久连接
-
请求首部
从客户端向服务端发送请求时使用的首部。补充请求的附加内容、客户端信息、响应内容相关优先级等。
常见的有:- Accept: 用户代码可处理的媒体类型
- Accept-Charset: 优先处理的字符集
- Accept-Encoding: 优先的内容编码
- Accept-Language: 优先的语言(中文、英文等自然语言)
- Host:请求资源所在服务器
accept:text/plain, */*; q=0.01 accept-encoding:gzip, deflate, br accept-language:zh-CN,zh;q=0.9
-
响应首部
从服务端向客户端返回报文时使用的首部。补充了响应的附加内容。
常见的有:- Location: 令客户端重定向到指定的URI
- Retry-After: 对再次发起请求的时机要求
- Server: HTTP服务器的安装信息
-
实体首部
针对请求报文和响应报文的实体部分使用的首部。补充了与实体资源有关的信息。
常用的有:- Content-Type: 实体主体的媒体类型
- Content-Length: 实体主体的大小,单位字节
- Content-Language: 实体主体的自然语言
- Content-Encoding: 实体主体适用的编码方式
- Expires: 实体主体过期时间
- Last-Modified: 资源的最后修改时间
content-length:5 content-type:text/html; charset=utf-8
HTTP状态码
状态码主要是描述服务端对请求处理的返回结果。
状态码类别
状态码 | 类别 | 描述 | 常用 |
---|---|---|---|
1XX |
Informational(信息性状态码) | 接收的请求正在处理 | |
2XX |
Success(成功状态码) | 请求正常处理完毕 | 200 OK,204 No Content,206 Partial Content |
3XX |
Redirection(重定向状态码) | 需求进行附加操作以完成 | 301 Moved Permanently, 302 Found, 303 See Other, 304 Not Modified, 307 Temporary Redirect |
4XX |
Client Error(客户端错误码) | 服务器无法处理请求 | 400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found |
5XX |
Server Error(服务端错误码) | 服务器处理请求出错 | 500 Internal Server Error, 503 Service Unavailable |