HTTP概述
HTTP协议用于约定服务端(如Web服务器Tomcat、IIS)和客户端(如浏览器、APP)通信的消息格式和响应方式。了解HTTP协议内容有助于优化Http请求,如断点下载、多线程下载、防盗链等功能的实现。HTTP协议是建立在TCP协议之上的,理论上只要有一个Socket就能够实现Http消息的请求,实现比如HttpClient、UrlConnection的请求操作。只要有一个SocketServer就能够实现Http消息的响应,实现比如Tomcat、IIS等Web服务器的功能,比如在手机上部署网站,用户可以在浏览器端访问同一网络下的手机部署的站点。
HTTP请求协议详解
HTTP1.1的请求协议报文结构如下图,大体上可以分为三块,即请求行、头部、消息主体。
请求行
请求行包含HTTP请求方法、请求的URL、HTTP协议版本三个内容,它们之间以空格间隔,并以回车+换行结束。
HTTP请求方法有下面几种,常用的有GET、POST请求。
- OPTIONS
- GET
- HEAD
- POST
- DELETE
- TRACE
- CONNECT
请求头部
头部可以分成三个部分,为常用头域、请求头域、实体头域。其中常用头域和实体头域部分内容在响应协议部分也有相同的定义。
常用头域
常用头域名称 | 作用描述 |
---|---|
Cache-Control | 缓存控制 |
Connection | HTTP 1.1默认是支持长连接的(Keep-Alive),如果不希望支持长连接则需要在此域中写入close |
Date | 表明消息产生的日期和时间 |
Pragma | |
Trailer | |
Transfer-Encoding | 告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式 |
Upgrade | 给出了发送端可能想要”升级”使用的新版本或协议 |
Via | 显示了报文经过的中间节点(代理、网关) |
Warning |
请求头域
请求头域名称 | 作用描述 |
---|---|
Accept | 指明请求端可以接受处理的媒体类型 |
Accept-Charset | 指明请求端可以接受的字符集 |
Accept-Encoding | 指明请求端可以接受的编码格式 |
Authorization | 授权 |
Expect | 允许客户端列出某请求所要求的服务器行为 |
From | 提供了客户端用户的E-mail地址 |
Host | 指明请求端的网络主机和端口号 |
If-Match | 服务端在响应头部里面返回ETag信息,客户端请求时在头部添加If-Match(值为响应的ETag),服务端接收后判断ETag是否相同,若相同则处理请求,否则不处理请求。 |
If-Modified-Since | 客户端在请求某一资源文件时,在头部加上If-Modified-Since(值为该资源文件的最后修改时间),服务端接收后将客户端上报的修改时间与服务器存储的文件的最后修改时间做对比,如果相同,说明资源文件没有更新,返回304状态码,告诉客户端使用原来的缓存文件。否则返回资源内容。 |
If-None-Match | 服务端在响应头部里面返回ETag信息,客户端请求时在头部添加If-None-Match(值为响应的ETag),服务端接收后判断ETag是否相同,若相同,说明资源没有更新,返回304状态码,告诉客户端使用原来的缓存文件。否则返回资源内容。 |
If-Range | 该头域与Range头域一起使用,服务端在响应头部里面返回ETag信息,客户端请求时在头部添加If-Range(值为响应的ETag),服务端接收后判断ETag是否相同,若相同,则返回状态码206,返回内容为Range指定的字节范围。若不相同,则返回状态码200,返回内容为整个实体。 |
If-Unmodified-Since | 客户端在请求某一资源文件时,在头部加上If-Modified-Since(值为该资源文件的最后修改时间),端接收后将客户端上报的修改时间与服务器存储的文件的最后修改时间做对比,如果相同,则返回资源内容,如果不相同则返回状态码412。 |
Max-Forwards | 配合TRACE、OPTIONS方法使用,限制在通往服务器的路径上的代理或网关的数量。 |
Proxy-Authorization | 代理授权 |
Range | 表示客户端向服务端请求指定范围的字节数量:Range:bytes=0-500表示请求第1个到第501个的字节数量。Range:bytes=100-表示请求第101到文件倒数第一个字节的字节数量。Range:bytes=-500表示请求最后500个字节的数量。Range可以同时指定多组(Range:bytes=500-600,601-999)。并不是所有的服务端都支持字节范围请求的,如果支持字节范围请求,服务端会返回状态码206,若不支持则会返回200,客户端需要根据状态码来判断服务端是否支持字节范围操作。此域可用于断点下载,即在断点处请求后面的内容,也可用于多线程下载同一个文件,每个线程负责一个文件的一部分下载工作,多个线程协同完成整个文件的下载。 |
Referer | 用于指定客户端请求的来源,是从搜索引擎过来的?还是从其它网站链接过来的?服务器根据此域,有时可以用做防盗链处理,不在指定范围内的来源,统统拒绝。 |
TE | 指明客户端可以接受哪些传输编码。 |
实体头域
实体头域名称 | 作用描述 |
---|---|
Allow | 指明被请求的资源所支持的方法,如GET、HEAD、PUT |
Content-Encoding | 指明实体内容所采用的编码方式 |
Content-Language | 指明实体内容使用的语言 |
Content-Length | 指明请求实体的字节数量 |
Content-Location | 可以用来为实体提供对应资源的位置 |
Content-MD5 | 指定实体内容的MD5,用于内容的完整性校验(base64的128位MD5) |
Content-Range | |
Content-Type | 指定实体的媒体类型 |
Expires | 指明实体的过期时间 |
Last-Modified | 指明实体最后被修改的时间 |
HTTP响应协议详解
HTTP1.1的响应协议报文结构如下图,大体上可以分为三块,即状态行、头部、消息主体。
状态行
状态行包含HTTP协议版本、状态码、原因短语三个内容,它们之间以空格间隔,并以回车+换行结束。
状态码由三位数字组成,第一位数字定义了响应类型,主要有如下五种类型的状态码
状态码类型 | 作用描述 |
---|---|
1xx | 报告(请求被接收,继续处理) |
2xx | 成功(请求被成功的接收并处理) |
3xx | 重发 |
4xx | 客户端出错(客户端错误的协议格式和不能处理的请求) |
5xx | 服务器出错(服务器无法完成有效的请求处理) |
状态码和对应的原因短语详细描述
状态码 | 原因短语 | 中文描述 |
---|---|---|
100 | Continue | 继续 |
101 | Switching Protocols | 切换协议 |
200 | OK | 成功 |
201 | Created | 已创建 |
202 | Accepted | 接受 |
203 | Non-Authoritative information | 非权威信息 |
204 | No Content | 无内容 |
205 | Reset Content | 重置内容 |
206 | Partial Content | 部分内容 |
300 | Multiple Choices | 多个选择 |
301 | Moved Permanently | 永久移动 |
302 | Found | 发现 |
303 | See Other | 见其它 |
304 | Not Modified | 没有改变 |
305 | Use Proxy | 使用代理 |
307 | Temporary Redirect | 临时重发 |
400 | Bad Request | 坏请求 |
401 | Unauthorized | 未授权的 |
402 | Payment Required | 必需的支付 |
403 | Forbidden | 禁用 |
404 | Not Found | 没有找到 |
405 | Method Not Allowed | 方法不被允许 |
406 | Not Acceptable | 不可接受的 |
407 | Proxy Authentication Required | 需要代理验证 |
408 | Request Timeout | 请求超时 |
409 | Confilict | 冲突 |
410 | Gone | 不存在 |
411 | Length Required | 长度必需 |
412 | Precondition Failed | 先决条件失败 |
413 | Request Entity Too Large | 请求实体太大 |
414 | Request-URI Too Long | 请求URI太长 |
415 | Unsupported Media Type | 不支持的媒体类型 |
416 | Requested Range Not Satisfiable | 请求范围不被满足 |
417 | Expectation Failed | 期望失败 |
500 | Internal Server Error | 内部服务器错误 |
501 | Not Implemented | 服务端没有实现 |
502 | Bad Gateway | 坏网关 |
503 | Service Unavailable | 服务不能获得 |
504 | Gateway Timeout | 网关超时 |
505 | HTTP Version Not Supported | HTTP协议版本不支持 |
响应头域
响应头域名称 | 作用描述 |
---|---|
Accept-Ranges | 服务器向客户端指明服务器对范围请求的接受度 |
Age | 从原始服务器到代理缓存形成的估算时间(以秒计,非负) |
ETag | 实体标签 |
Location | 指定重定向的URI |
Proxy-Autenticate | 它指出认证方案和可应用到代理的该URL上的参数 |
Retry-After | 如果实体暂时不可取,通知客户端在指定时间之后再次尝试 |
Server | 指明服务器用于处理请求的软件信息 |
Vary | 告诉下游代理是使用缓存响应还是从原始服务器请求 |
WWW-Authenticate | 表明客户端请求实体应该使用的授权方案 |