HTTP协议是TCP/IP协议的一部分
- HTTP数据(应用层,客户端请求)
- TCP首部(传输层,对HTTP数据进行分割处理,使得大数据更容易传送)
- IP首部(网络层,地址相关信息)
- 以太网首部(链路层)
- IP协议:IP地址(可以改变)、MAC地址(基本不变)
- DNS协议:通过域名查找IP地址
- URI:用字符串标识某一互联网资源;
- URL:标识资源地址
- HTTP是无状态的协议(即对发送过的请求或者相应都不做持久化处理)(可以通过cookie技术解决状态不保存问题)
- 在首部字段的Host中保存着请求的网络域名或IP地址
- GET /index.html HTTP/1.1
- Host: www.bilibili.com
- HTTP method
method | 内容 |
---|---|
GET | 获取资源 |
POST | 传输数据 |
PUT | 传输文件(不太使用) |
HEAD | 获取报文首部 |
DELETE | 删除文件(不太使用) |
OPTIONS | 询问(服务器)支持的方法 |
TRACE | 查询发出去的请求如何被加工处理/篡改(危险,不常使用) |
CONNET | 要求用隧道协议连接代理(主要使用SSL/TLS协议把内容机密后经网络隧道传输) |
LINK | 建立和资源之间的联系 |
UNLINE | 断开连接关系 |
解决HTTP的非持久连接
- 管线化(pipelining):不用等待响应亦可发送下一个请求
- Cookie:
- 服务器在响应时通知客户端保存Cookie
- 客户端在再次请求时会自动将Cookie内容加入请求报文(request-message)
首部之间的换行符是\r\n;首部与主体之间的换行符是\r\n\r\n(即之间有一个空行)
Request | Response |
---|---|
报文首部(请求行等) | 报文首部(状态行等) |
空行(CR+LF) | 空行(CR+LF) |
报文主体 | 报文主体 |
- 报文(message)
- 实体(entity)
- 范围请求(Range Request):在请求中指定需求的范围
- 内容协商(Content Negotiation):响应时提供给客户端最为合适的资源
状态码
状态码 | 类别 | 原因 |
---|---|---|
1XX | Information(信息性状态码) | 接收到的请求正在处理 |
2XX | Success(成功状态码) | 请求正常处理完毕 |
3XX | Redirection(重定向状态码) | 需要进行附加操作以完成请求 |
4XX | Client Error (客户端错误状态码) | 服务器无法处理请求 |
5XX | Server Error (服务器错误状态码) | 服务器处理请求出错 |
具体状态码
状态码 | 名称 | 解释 |
---|---|---|
200 | OK | |
204 | No Content | |
206 | Partial Content | |
301 | Moved Permanently | 请求的资源已被分配新的URI(需要更新标签) |
302 | Found | 临时性分配到新的URI |
303 | See Other | 应当采用GET方法获取资源 |
304 | Not Modified | 为满足请求条件,返回中不包含任何相应的主体部分 |
307 | Temporary Redirect | |
400 | Bad Request | |
401 | Unauthorized | |
403 | Forbidden | |
404 | Not Found | |
500 | Internal Server Error | 服务器出现问题 |
503 | Service Unavailable | 服务器忙 |
- 代理:具有转发功能的应用程序
- 源服务器 vs 代理服务器
- 缓存代理:缓存源服务器响应资源
- 透明代理:不对报文做任何加工
- 网关:转发其他服务器通信数据的服务器
- 隧道:客户端和服务器间进行中转(以保持双方的连接)
HTTP首部字段
首部字段 | |
---|---|
通用首部字段 | 请求报文和响应报文都会使用的首部 |
请求首部字段 | |
响应首部字段 | |
实体首部字段 |
通用首部字段
首部字段 | 解释 |
---|---|
Cache-Control | 操作缓存工作机制 |
Connection | 控制不再转发给代理的首部字段 |
管理持久连接 | |
Date | 表明创建HTTP报文的日期和时间 |
Trailer | 说明在报文主体后记录了哪些首部字段 |
Transfer-Encoding | 规定了传输报文主体时采用的编码方式 |
Upgrade | 检测是否可以使用更高版本的协议进行通信 |
Via | 追踪传输路径(常和TRACE方法一起使用) |
Warning |
请求首部字段
首部字段 | 解释 |
---|---|
Accept | 通知服务器用户代理(如浏览器)能够处理的媒体类型及相对优先级 |
Accept-Charset | 通知服务器用户代理支持的字符集类型及相对优先级 |
Accept-Encoding | 通知服务器用户代理支持的内容编码及相对优先级 |
Accept-Language | 通知服务器用户代理能够处理的自然语言集及相对优先级 |
Authorization | 告知服务器用户代理的认证信息(证书值) |
Expect | 告知服务器期望出现的某种特定行为 |
From | 告知服务器用户代理的用户电子邮箱 |
Host | 区分运行在同一服务器(相同IP)下的不同虚拟主机 |
If-xxx | 服务器只执行判定条件为真的请求 |
Max-Forwards | 指定可经过的服务器的最大数目 |
Range | 告知服务器请求资源的指定范围 |
Referer | 告知服务器请求的原始资源的URI(处于安全考虑,一般不用) |
User-Agent | 将创建请求的浏览器和用户代理名称等信息传达给服务器 |
响应首部字段
首部字段 | 解释 |
---|---|
Accept-Ranges | 告知客户端是否能处理范围请求 |
Age | 告知客户端源服务器多久前创建了响应 |
ETag | |
Location | 配合3XX(Redirection)的响应,提供重定向的URI |
Retry-After | 告知客户端应该多久后再次发送请求 |
Server | |
Vary | 对缓存进行控制 |
实体首部字段
首部字段 | 解释 |
---|---|
Allow | 同时客户端能够支持Request-URI指定资源的所有HTTP method |
Content-Encoding | 告知客户端服务器对实体的主体部分选用的内容编码方式 |
Content-Language | 告知客户端实体的主题使用的自然语言 |
Content-Length | 实体主体的大小(单位是字节) |
Content-Loacation | 报文主体返回资源的对应URI(同首部字段Location不一样) |
Content-Range | |
Content-Type | 实体主体内对象的媒体类型 |
Expires | 告知客户端资源的实效日期 |
Last-Modified | 资源最后一次修改时间 |
Cookie服务的首部字段
首部字段名 | 说明 | 首部类型 |
---|---|---|
Set-Cookie | 开始状态管理所使用的Cookie信息 | 响应首部字段 |
Cookie | 服务器接收到的Cookie信息 | 请求首部字段 |
HTTP协议的不足
- 通信使用明文,内容可能会被窃听
- 可以使用SSL(Secure Socket Layer)或者TLS(Transport Layer Security)的组合加密HTTP的通信内容
- HTTP和SSL的组合被称为HTTPS(HTTP Secure)或者HTTP over SSL
- 不验证通信方的身份,因此可能遭遇伪装
- 服务器伪装、客户端伪装、DoS(Denial of Service)
- SSL可以确定通信的双方
- 无法证明报文的完整性,所以可能遭受篡改
- 没有办法确认发出的请求/响应和接收到的请求/响应时前后相同的:MITM(Man-in-the-Middle attack)
HTTPS=HTTP+加密+认证+完整性保护
SSL是当今世界上应用最为广发的网络安全技术
以上内容皆出自《图解HTTP》
网友评论