http

238 阅读9分钟

请求方法

方法 描述
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包、不四次握手),等待在同域名下继续用这个通道传输数据;

过期时间

上图中的Keep-Alive:timeout=20,表示这个TCP通道可以保持20秒。另外还可能有max=XXX,表示这个长连接最多接收XXX次请求就断开。

传输完成识别

使用长连接之后,客户端、服务端怎么知道本次传输结束呢?两部分:1是判断传输数据是否达到了Content-Length指示的大小;2动态生成的文件没有Content-Length,它是分块传输(chunked),这时候就要根据chunked编码来判断,chunked编码的数据在最后有一个空chunked块,表明本次传输数据结束。(服务器是不可能预先知道内容大小,可以使用Transfer-Encoding:chunk模式来传输数据了。chunk编码将数据分成一块一块的发生。Chunked编码将使用若干个Chunk串连而成,由一个标明长度为0的chunk标示结束。)

管道化技术

在一个TCP连接内,多个HTTP请求可以并行,下一个HTTP请求在上一个HTTP请求的应答完成之前就发起。

断点续传

  1. 客户端下载一个1024K的文件,已经下载了其中512K
  2. 网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续>传的片段: Range:bytes=512000- 这个头通知服务端从文件的512K位置开始传输文件
  3. 服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加: Content-Range:bytes 512000-/1024000 此时服务端返回的HTTP状态码应该是206,而不是200。