请求方法
| 方法 | 描述 |
|---|---|
| GET | 请求指定信息 |
| HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
| PUT | 从客户端向服务器传送的数据取代指定的文档的内容 |
| POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
| DELETE | 请求服务器删除指定的页面。 |
请求报文格式
响应格式
首部字段
通用首部字段
- Cache-Control:操作缓存的工作机制
public:明确表明其他用户也可以利用缓存
private:缓存只给特定的用户
no-cache:客户端发送这个指令,表示客户端不接收缓存过的响应,必须到服务器取;服务器返回这个指令,指缓存服务器不能对资源进行缓存。其实是不缓存过期资源,要向服务器进行有效期确认后再处理资源。
no-store:指不进行缓存
max-age:缓存的有效时间(相对时间)
- Connection
Connection:keep-Alive (持久连接)
- Date 表明创建http报文的日期和时间
- Pragma
兼容http1.0,与Cache-Control:no-cache含义一样。
但只用在客户端发送的请求中,告诉所有的中间服务器不返回缓存。
形式唯一:Pragma:no-cache
- Trailer
Trailer响应标头允许发送方在分块消息的末尾包括其他字段,以提供在发送消息正文时可能动态生成的元数据,例如消息完整性检查,数字签名或后处理状态。
例子:
HTTP/1.1 200 OK
Content-Type: text/plain
Transfer-Encoding: chunked
Trailer: Expires
7\r\n
Mozilla\r\n
9\r\n
Developer\r\n
7\r\n
Network\r\n
0\r\n
Expires: Wed, 21 Oct 2015 07:28:00 GMT\r\n
\r\n
- Transfer-Encoding
chunked (分块传输编码), 规定传输报文主体时采用的编码方式,http1.1的传输编码方式只对分块传输编码有效
- Upgrade
升级一个成其他的协议,需要额外指定Connection:Upgrade。服务器可用101状态码作为相应返回。
- Via
追踪客户端和服务器之间的请求和响应报文的传输路径。可以避免请求回环发生,所以在经过代理时必须要附加这个字段。
- Content-Length 内容长度
- Content-Type 内容格式
- Expires 响应过期时间
请求首部字段
响应首部字段
| 消息头 | 描述 |
|---|---|
| Accept | 用户代理期望的MIME 类型列表 |
| Accept-Encoding | 客户端通知服务端它能够理解的内容编码方式 |
状态码
- 100 continue
HTTP 100 Continue信息状态响应代码表明目前为止的所有内容都是正常的,并且客户端应该继续请求或者如果它已经完成则忽略它。
- 101 Switching Protocols
客户端的请求头包含Upgrade字段,服务器正在进行协议的切换
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
- 200 OK 服务器成功处理了请求
- 204 NO Content请求被受理但没有资源可以返回
- 206 Partial Content
服务器返回部分数据,数据范围由头部Range字段控制
HTTP/1.1 206 Partial Content
Date: Wed, 15 Nov 2015 06:25:24 GMT
Last-Modified: Wed, 15 Nov 2015 04:58:08 GMT
Content-Range: bytes 21010-47021/47022
Content-Length: 26012
Content-Type: image/gif
- 301 Moved Permanently
资源被永久移除,新的URI应当在在响应的Location域中返回
- 302 found
临时重定向,由于这样的重定向是临时的,客户端应当继续向原有地址发送以后的请求。只有在Cache-Control或Expires中进行了指定的情况下,这个响应才是可缓存的。
- 303 See Other
页面重定向 只要用于响应PUT 和 POST请求
- 304 Not Modified
不需要重新传输资源,请客户端使用缓存
- 307 Temporary Redirect
资源重定向,与302相比,307保证重定向后请求方法和body不会改变。一些浏览器对302的响应结果不确定
- 308 Permanent Redirect
所请求的资源已明确移动到Location标题给定的 URL
- 400 Bad Request
请求错误,客户端不应该再使用该请求
- 401 Unauthorized
该请求没有认证或授权
此状态与包含有关如何正确授权信息的WWW-Authenticate标头一起发送。
- 403 Forbidden
拒绝授权,场景如输错密码
- 404 not found
- 405 Method Not Allowed
请求方法不允许
服务器必须在405响应中生成允许标头字段,其中包含目标资源当前支持的方法的列表。
-
409 Conflict 请求的资源与资源的当前状态发生冲突
-
410 表示服务器上的某个资源被永久性的删除
-
500 Internal Server Error 内部服务器错误,服务器遇到一个错误,使其无法为请求提供服务
-
503 Service Unavailable 服务器正忙,服务器超时
状态码
| 分类 | 描述 |
|---|---|
| 1** | 信息,服务器收到请求,需要请求者继续执行操作 |
| 2** | 成功,操作被成功接收并处理 |
| 3** | 重定向,需要进一步的操作以完成请求 |
| 4** | 客户端错误,请求包含语法错误或无法完成请求 |
| 5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
cookie
Cookie 是 HTTP 报文的一个请求头,Web 应用可以将用户的标识信息或者其他一些信息(用户名等)存储在 Cookie 中。
session
服务器在创建 Session 的同时,会为该 Session 生成唯一的 Session ID,当浏览器再次发送请求的时候,会将这个 Session ID 带上,服务器接受到请求之后就会依据 Session ID 找到相应的 Session,找到 Session 后,就可以在 Session 中获取或者添加内容了。
HTTP 代理
代理种类:
- 匿名代理: 完全“隐匿”了被代理的机器,外界看到的只是代理服务器;
- 透明代理: 顾名思义,它在传输过程中是“透明开放”的,外界既知道代理,也知道客户
- 正向代理:靠近客户端,代表客户端向服务器发送请求;
- 反向代理:靠近服务器端,代表服务器响应客户端的请求;
作用
- 负载均衡(轮询 一致性哈希)
- 健康检查
- 安全防护
- 数据过滤
- 内容缓存
代理实现方式
Via 是一个通用字段,请求头或响应头里都可以出现。每当报文经过一个代理节点,代理服务器就会把自身的信息追加到字段的末尾,就像是经手人盖了一个章。
“X-Forwarded-For”的字面意思是“为谁而转发”,形式上和“Via”差不多,也是每经过一个代理节点就会在字段里追加一个信息。但“Via”追加的是代理主机名(或者域名),而“X-Forwarded-For”追加的是请求方的 IP 地址。所以,在字段里最左边的 IP 地址就是客户端的地址。
“X-Real-IP”是另一种获取客户端真实 IP 的手段,它的作用很简单,就是记录客户端 IP 地址,没有中间的代理信息,相当于是“X-Forwarded-For”的简化版。如果客户端和源服务器之间只有一个代理,那么这两个字段的值就是相同的。
“X-Forwarded-Host”和“X-Forwarded-Proto”,它们的作用与“X-Real-IP”类似,只记录客户端的信息,分别是客户端请求的原始域名和原始协议名。 缺点:改变原始报文 增加链路长度
代理协议
HAProxy定义的 今天只介绍比较好理解的 v1,它在 HTTP 报文前增加了一行 ASCII 码文本,相当于又多了一个头。这一行文本其实非常简单,开头必须是“PROXY”五个大写字母,然后是“TCP4”或者“TCP6”,表示客户端的 IP 地址类型,再后面是请求方地址、应答方地址、请求方端口号、应答方端口号,最后用一个回车换行(\r\n)结束。
知名代理软件 HAProxy Squid Varnish
java http框架
HttpURLConnection apache HttpClient OKhttp netty
长连接
定义
数据传输完成了保持TCP连接不断开(不发RST包、不四次握手),等待在同域名下继续用这个通道传输数据;
过期时间
传输完成识别
使用长连接之后,客户端、服务端怎么知道本次传输结束呢?两部分:1是判断传输数据是否达到了Content-Length指示的大小;2动态生成的文件没有Content-Length,它是分块传输(chunked),这时候就要根据chunked编码来判断,chunked编码的数据在最后有一个空chunked块,表明本次传输数据结束。(服务器是不可能预先知道内容大小,可以使用Transfer-Encoding:chunk模式来传输数据了。chunk编码将数据分成一块一块的发生。Chunked编码将使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。)
管道化技术
在一个TCP连接内,多个HTTP请求可以并行,下一个HTTP请求在上一个HTTP请求的应答完成之前就发起。
断点续传
- 客户端下载一个1024K的文件,已经下载了其中512K
- 网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续>传的片段: Range:bytes=512000- 这个头通知服务端从文件的512K位置开始传输文件
- 服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加: Content-Range:bytes 512000-/1024000 此时服务端返回的HTTP状态码应该是206,而不是200。