HTTP(超文本传输协议)是一种运行于应用层的协议,HTTP协议是在Web上进行数据交换的基础,是一种“客户端-服务器端”协议。
无状态协议
HTTP是一种无状态协议,也就是说在HTTP这个级别,协议对于发送过的请求和响应都不做持久化处理。HTTP/1.1为了解决因无状态而导致的业务处理变得棘手的情况,为了保持状态,引入了Cookie技术。
Cookie技术通过在请求和响应报文中写入Cookie信息来控制客户端的状态。Cookie会根据从服务器端发送的响应报文内的一个叫做Set-Cookie的首部字段信息,通知客户端保存Cookie,当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中写入Cookie的值之后发送出去。服务端发现客户端发送过来的Cookie之后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息。
HTTP常见方法
方法 | 作用 | 支持的版本 |
---|---|---|
GET | 获取资源吗 | 1.0 , 1.1 |
POST | 传输实体主体,将客户端数据传输给服务端 | 1.0 , 1.1 |
PUT | 传输文件 | 1.0 , 1.1 |
HEAD | 和GET方法一样,只是不返回报文的主体部分,用于确认URI的有效性和资源更新的日期时间 | 1.0 , 1.1 |
DELETE | 按URI删除指定的资源 | 1.1 |
OPTIONS | 查询针对请求URI指定的资源支持的方法 | 1.1 |
TRACE | 让web服务器端将之前的请求通信返回给客户端的方法 | 1.1 |
CONNECT | 与代理服务器通信时建立隧道,实现用隧道协议进行TCP通信。主要使用SSL和TLS协议把通信内容加密后经网络隧道传输 | 1.1 |
LINK | 建立和资源之间的联系 | 1.0 |
UNLINK | 断开连接关系 | 1.0 |
状态码
状态码有3位数字和原因短语组成
类别 | 原因短语 | |
---|---|---|
1XX | Informational(信息类状态码) | 接受的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error(客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error(服务端错误状态码) | 服务器处理请求出错 |
-
200 OK
请求正常处理 -
204 No Content
请求处理成功,但没有资源可返回 -
206 Partial Content
客户端进行了范围请求,而服务端处理了这部分请求 -
301 Moved Permanently
永久性重定向,表示请求的资源已被分配了新的URI -
302 Found
临时性重定向,与301不同之处在于它不会更新书签 -
303 See Other
请求志愿URI发生更新,需要重新使用GET方法请求资源 -
304 Not Modified
采用GET方法的请求报文中包含If-Match,If-Modified-Since,If-None-Match,If-Range,If-Unmodified-Since中任一首部,服务器端允许请求访问资源,但因为未满足条件后,直接返回304Not Modified (服务器端资源未改变,可直接使用客户端未过期的缓存),不包含任何响应的主体部分。 -
307 Temporary Redirect
临时重定向 -
400 Bad Request
请求报文中存在语法错误 -
401 Unauthorized
发送的请求需要通过HTTP认证,返回含有401的响应必须包含一个适用于被请求资源的WWW-Authenticate首部用以质询(challenge)用户信息。 -
403 Forbidden
请求资源的访问被服务器拒绝了 -
404 Not Found
服务器上无法找到请求的资源 -
500 Internal Server Error
服务器端在执行请求时发生了错误 -
503 Service Unavailable
服务器暂时处于超负载或正在进行停机维护,现在无法处理请求
HTTP报文
用于HTTP协议交互的信息被称为HTTP报文。HTTP报文大致可分为报文首部和报文主体两块,两者由最初出现的空行划分,通常,不一定要有报文主体。
- 请求行,包含请求的方法,请求URI和HTTP版本
- 状态行,包含表明响应结果的状态码,原因短语和HTTP版本
- 首部字段,包含表示请求和响应的各种条件和属性的各类首部,一般有四种首部:通用首部,请求首部,响应首部和实体首部
- 其他
HTTP首部字段
构成Http报文的要素之一,它能起传递重要信息的作用
首部字段结构
首部字段名:字段值
例如在HTTP首部中以Content-Type这个字段来表示报文主体的对象类型
Content-Type: text/html
4种Http首部字段类型
- 通用首部字段:请求报文和响应报文都会使用的字段
字段名 | 说明 |
---|---|
Cache-Control | 控制缓存的行为 |
Connection | 逐跳首部,连接的管理 |
Date | 创建报文的日期时间 |
Pragma | 报文指令 |
Ttrailer | 报文末端的首部一览 |
Transfer-Encoding | 指定报文主体的传输编码方式 |
Upgrade | 升级为其他协议 |
Via | 代理服务器的相关信息 |
Warning | 错误通知 |
- 请求首部字段:客户端向服务端发送请求报文时使用的首部,补充了请求的附加内容,客户端信息,响应内容相关优先级等信息。
字段名 | 说明 |
---|---|
Accept | 用户代理可处理的媒体类型 |
Accept-Charset | 优先的字符集 |
Accept-Encoding | 优先的内容编码 |
Accept-Language | 优先的语言 |
Authorization | Web认证信息 |
Expect | 期待服务器的特定行为 |
From | 用户的电子邮箱地址 |
Host | 请求资源所在的服务器 |
If-Match | 比较实体标记(ETag) |
If-Modified-Since | 比较资源的更新时间 |
If-None-Match | 比较实体标记(与If-Match相反) |
If-Modified-Since | 比较资源的更新时间(与If-Modified-Since相反) |
Max-Forwards | 最大传输逐跳数 |
Proxy-Authorization | 代理服务器要求客户端的认证信息 |
Range | 实体的字节范围请求 |
Referer | 对请求中URI的原始获取方 |
TE | 传输编码的优先级 |
User-Agent | HTTP客户端程序的信息 |
- 响应首部字段:从服务器端向客户端返回响应报文时使用的首部,补充了响应的附加内容,也会要求客户端附加额外的内容信息。
字段名 | 说明 |
---|---|
Accept-Ranges | 是否接受字节范围的请求 |
Age | 推算资源创建经过的时间 |
ETag | 资源的匹配信息 |
Location | 令客户端重定向到指定的URI |
Proxy-Authenticate | 代理服务器对客户端的认证信息 |
Retry-After | 对再次发起请求的时机要求 |
Server | HTTP服务器的安装信息 |
Vary | 代理服务器缓存的管理信息 |
WWW-Authenticate | 服务器对客户端的认证信息 |
- 实体首部字段:针对请求报文和响应报文底实体部分使用的首部。补充了资源内部的更新时间等与实体有关的信息
字段名 | 说明 |
---|---|
Allow | 资源可支持的HTTP方法 |
Content-Encoding | 实体主体适用的编码方式 |
Content-Language | 实体主体的自然语言 |
Content-Length | 实体主体的大小(单位:字节) |
Content-Location | 替代对应资源的URI |
Content-MD5 | 实体主体的报文摘要 |
Content-Range | 实体主体的位置范围 |
Content-Type | 实体主体的媒体类型 |
Expires | 实体主体过期的日期和时间 |
Last-Modified | 资源最后修改日期和时间 |
端到端首部和逐跳首部
HTTP首部字段将定义成缓存代理和非缓存代理的行为,分为2种类型:
End-to-end Header 端到端首部:此类别的首部会转发个请求/响应的最终接收目标,且必须保存在由缓存生成的响应中,另外规定它必须被转发。
Hop-by-hop Header 逐跳首部:只对单次转发有效。HTTP/1.1和之后的版本中,如果要使用逐跳首部,需提供Connection首部字段。
除了以下8个为逐跳首部字段,其余均为端到端首部
- Connection
- Keep-Alive
- Proxy-Authenticate
- Proxy-Authorization
- Trailer
- TE
- Transfer-Encoding
- Upgrade