文章目录
http协议目前有如下几个版本:
- HTTP/0.9 HTTP的1991原型版本。这个版本的设计有许多严重的缺陷,几乎没有人在使用了
- HTTP/1.0 第一个得到广泛应有的HTTP协议,详情见https://tools.ietf.org/html/rfc1945
- HTTP/1.0+ 在1.0版本基础上增加Keep Alive连接,虚拟机支持已经代理连接支持等特性。也称之为1.1的非正式版本,详情见https://tools.ietf.org/html/rfc2068
- HTTP/1.1 当前比较流行的HTTP协议版本,该版本校正了之前版本的结构设计缺陷,明确了语义,引入了性能优化特性,删除了一些不友好的特性,详情见https://tools.ietf.org/html/rfc2616
- HTTP/NG 又称HTTP/2.0,该版本重点关注性能的优化,具有二进制分帧,首部压缩,多路复用,服务器推送等新特性。详情见https://tools.ietf.org/html/rfc7540
发展历史图如下:
注:
Google在2012年时推出了自己SPDY协议,该协议优化了HTTP/1.x中的请求延迟,解决了安全性等问题,大部分特性在HTTP/2.0中均已包含进去了
一、HTTP1.0和HTTP1.1的常见区别
HTTP/1.1是目前最广泛应用的协议,它与HTTP/1.0的几个明显在应用上差异如下:
- 长连接与短连接
- HTTP/1.0仅支持短连接,即每次请求都要经历一次建立连接(三次握手)的过程,效率很低,有些时候我们看到有些基于HTTP/1.0的协议,使用Connection: keep-alive来打开长连接,这里的HTTP/1.0是通常指HTTP/1.0+,真正的HTTP/1.0协议是没有这个特性的
- HTTP/1.1默认就是长连接,只要在Keep Alive的时间内,再次发起请求不需要再重新建立一个连接,直接使用上一次建立好的连接进行传输,减少了建立和关闭连接的资源消耗和延迟
- 缓存控制
- HTTP/1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准
- HTTP/1.1引入了更多的缓存控制策略例如ETag,If-Unmodified-Since, If-Match, If-None-Match,Cache-Control等更多可供选择的HEAD头来控制缓存策略
- 错误通知
- 在HTTP/1.1中新增了24个错误状态响应码,如409(Conflict)表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资源被永久性的删除
- Host头
- 在HTTP/1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个IP地址。HTTP/1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
- 断点续传
- HTTP/1.1在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content)
总结图:
二、URL
- URI:统一资源标识符(Uniform Resource Identifier)
- URL: 统一资源定位符(Uniform Resource Locator)
- URN: 统一资源名(Uniform Resource Name)
URI = URL + URN
- URL完整定义:
<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
举例:
mailto: president@example.com
ftp://ftp.example.com/pub/books.xls
rtsp://www.example.com:554/videos/cook.rmvb
ftp://joe:joepassword@www.joes.com:23/pub/gun;type=5;graphic=6?item=123&mode=test#dog
- URL 字符集与转义
由于 URL 常常会包含 ASCII 集合之外的字符,URL 必须转换为有效的 ASCII 格式。URL 编码使用 “%” 其后跟随两位的十六进制数来替换非 ASCII 字符。URL 不能包含空格。URL 编码通常使用 + 来替换空格
- URL的最大长度
在HTTP协议中并没规定URL的长度限制,但各个浏览器厂商及Web服务软件是有这个限制的,具体如下:
浏览器 | 最大长度(字节) |
IE浏览器 | 2,083 |
Firefox | 65,536 |
Chrome | 8,182 |
Safari | 80,000 |
Web服务软件:
Web Service | 最大长度(字节) | 备注 |
Apache | 8,192 | |
IIS | 16,384 | configuration/system.webServer/security/requestFiltering/requestLimits@maxQueryStringsetting. |
Nginx | 1,000 | client_header_buffer_size 1k large_client_header_buffers 4 4k/8k |
三、常见状态码
- 100 – 199 信息性状态码
- 200 – 299 成功状态码
- 300 – 399 重定向状态码
- 400 – 499 客户端错误状态码
- 500 – 599 服务器错误状态码
常见状态码列表:
状态码 | 含义 | HTTP/1.0是否支持 | HTTP/1.1是否支持 |
200 | OK | 是 | 是 |
206 | Partial Content | 否 | 是 |
301 | Moved Permanently | 是 | 是 |
304 | Not Modified | 是 | 是 |
400 | Bad Request | 是 | 是 |
403 | Forbidden | 是 | 是 |
404 | Not Found | 是 | 是 |
500 | Internal Server Error | 是 | 是 |
502 | Bad Gateway | 是 | 是 |
503 | Service Unavailable | 是 | 是 |
504 | Gateway Timeout | 否 | 是 |
四、METHOD
HTTP协议定义了一组安全的方法:GET方法和HEAD方法,即这两个方法不会让服务产生新的内容或影响。
常见METHOD列表:
方法名 | 含义 | HTTP/1.0是否支持 | HTTP/1.1是否支持 |
GET | 获取资源 | 是 | 是 |
HEAD | 获取报文HEAD | 是 | 是 |
POST | 向服务器提交数据 | 是 | 是 |
PUT | 向服务器提交资源 | 否 | 是 |
DELETE | 请求服务器删除资源 | 否 | 是 |
TRACE | 网络跟踪 | 否 | 是 |
CONNECT | 与PROXY之间的连接管理 | 否 | 是 |
OPTIONS | 查询能力 | 否 | 是 |
五、HEAD
HEAD头分为通用HEAD, 请求HEAD, 响应HEAD和实体HEAD四个部分
- 通用HEAD
HEAD字段 | 描述 | 备注 |
Connection | 允许客户端和服务器指定与请求/响应连接有关的选项 | HTTP/1.1 |
Date | 创建报文的日期时间 | HTTP/1.0、HTTP/1.1 |
Transfer-Encoding | 指定报文主体的传输编码方式 | HTTP/1.1 |
Via | 代理服务器的相关信息 | HTTP/1.1 |
Cache-Control | 控制缓存的行为 | HTTP/1.1 |
- 请求HEAD
HEAD字段 | 描述 | 备注 |
From | 客户端用户的E-Mail地址 | HTTP/1.0、HTTP/1.1 |
Host | 接收请求的服务器的主机名和端口号 | HTTP/1.1 |
Referer | 当前请求URI的文档的URL | HTTP/1.0、HTTP/1.1 |
User-Agent | HTTP客户端程序的信息 | HTTP/1.0、HTTP/1.1 |
Accept | 告诉服务器客户端能接收哪些媒体类型 | HTTP/1.1 |
Accept-Charset | 告诉服务器客户端能接收哪些字符集 | HTTP/1.1 |
Accept-Encoding | 告诉服务器客户端能接收哪些内容编码 | HTTP/1.1 |
Accept-Language | 告诉服务器客户端能接收哪些语言 | HTTP/1.1 |
Authorization | Web 认证信息 | HTTP/1.0、HTTP/1.1 |
If-Match | 比较实体标记(ETag) | HTTP/1.1 |
If-Modified-Since | 比较资源的更新时间 | HTTP/1.0、HTTP/1.1 |
If-None-Match | 比较实体标记(与 If-Match 相反) | HTTP/1.1 |
Range | 实体的字节范围请求 | HTTP/1.1 |
- 响应HEAD
HEAD字段 | 描述 | 备注 |
Age | 响应持续时间 | HTTP/1.1 |
Server | Web Service的名称和版本 | HTTP/1.0、HTTP/1.1 |
Location | 客户端重定向至指定 URI | HTTP/1.0、HTTP/1.1 |
Accept-Ranges | 服务器可接受的范围类型 | HTTP/1.1 |
Vary | 代理服务器缓存的管理信息 | HTTP/1.1 |
WWW-Authenticate | 服务器对客户端的认证信息 | HTTP/1.0、HTTP/1.1 |
- 实体HEAD
HEAD字段 | 描述 | 备注 |
Content-Encoding | 对Body执行的编码方式 | HTTP/1.0、HTTP/1.1 |
Content-Language | 对Body执行的自然语言 | HTTP/1.0、HTTP/1.1 |
Content-Length | Body的长度 | HTTP/1.0、HTTP/1.1 |
Content-Range | Body的位置范围 | HTTP/1.1 |
Content-Type | Body的媒体类型 | HTTP/1.0、HTTP/1.1 |
Expires | Body的过期日期时间 | HTTP/1.0、HTTP/1.1 |
Last-Modified | Body的最后一次修改的日期和时间 | HTTP/1.0、HTTP/1.1 |
ETag | Body的标记 | HTTP/1.1 |
六、参考文献
- David Gourley, Brian Totty, Marjorie Sayer, Sailu Reddy, Anshu Aggarwal. HTTP: The Definitive Guide, ISBN: 9781565925090
- https://tools.ietf.org/html/rfc1945
- https://tools.ietf.org/html/rfc2616
- https://tools.ietf.org/html/rfc7540
- https://tools.ietf.org/html/rfc2068
- https://www.cnblogs.com/heluan/p/8620312.html