1. 简单的HTTP协议
超文本传输协议,规范了浏览器和服务器的数据交互,其是基于TCP协议进行连接的,而传输的内容就是HTTP
浏览器即客户端发送的HTTP我们称之为请求报文,反之叫响应报文
1.1 报文的组成
报文首部 + 空行 + 报文主体
请求报文的组成:报文首部(请求方法、请求URI、协议版本、首部字段)、空行、报文主体
响应报文的组成:报文首部(协议版本、状态码、原因短语、首部字段)、空行、内容实体
1.2 持久连接
- keep-alive:保持TCP连接,建立一个TCP连接可进行多次请求和相应
- 管线化:不用等待响应可直接发送下一个请求
2. 常见的请求方法
请求方法用于告知服务器的意图
- GET:获取资源
- POST:传输实体主体
- PUT:传输文件(一般不使用,没有验证)
- HEAD:获得报文首部(确认URI有效性、资源更新时间)
- DELETE:删除文件(一般不使用,没有验证,但和RESTful意义不同了)
- OPTIONS:预查询资源支持的方法
- TRACE:追踪路径
- CONNECT:要求用岁宝协议连接代理(主要SSL/TLS用到)
GET与POST的区别
GET:
获取资源
请求参数附加在url后面,且有长度限制
POST:
传输实体主体
请求信息放入请求体里面,没有长度限制
有两个TCP包,先发送请求头,待响应100 continue后才发送请数据
3. URI、URL
URI统一资源标识符、URL统一资源定位符,URI包含URL。URL是我们常用的Web的网页地址,而RUI是任何不止于Web的唯一标识,比如身份证、UUID等
URI格式:
http://root:[email protected]:80/dir/index.html?search=test#ch1
协议 :// 认证信息 @ 服务器地址 : 端口号 / 文件路径 ? 查询参数 # 位置标识符
4 协议版本
常见的HTTP协议版本有 1.0 / 1.1 / 2.0 其区别如下:
- 1.0-1.1
- 支持长连接:keep-alive
- Host头处理:虚拟主机的出现
- 支持范围请求:增加range字段,可断点请求
- 增多了错误状态码
- 增多了缓存处理:增多了缓存控制
- 1.1-1.2
- 采用二进制格式:1.1是文本格式,二进制解析高效
- 报头压缩:以前版本大量字段且重复发送
- 主动推送
- 完全多路复用:连接共享,每个请求对应一个Id,那么一个TCP连接上可以有多个请求,可随机混杂到服务器再归并
5 状态码
负责表示客户端HTTP请求的返回结果,以三位数字和原因短语组成,类别如下:
常见的状态码:
101:切换协议
200:请求成功且返回
204:请求成功无返回
206:范围请求
301:永久重定向
302:临时重定向(常用)
303:存在另外URI,希望用GET方法
400:请求语法错误
401:未认证
403:无权限
404:无此资源
405:不支持该请求方法
500:服务器内部错误
503:服务器繁忙
6 首部字段
给浏览器或服务器提供报文主体大小、使用语言、认证信息等。其分类如下:
6.1 通用首部字段
- Connection:控制不再转发的字段、管理持久连接
Connection:update 、 Connection:keep-alive
- Date:创建报文的日期时间
- Trailer:事先声明报文主体记录的首部字段,分块传输会用到
- Transfer-Encoding:规定传输报文主体采用的编码
- Update:检测能否使用高级协议(只能用于邻接的服务器,要配合Connection)
6.2 请求首部字段
- Host:必须包含在内的主机名
- Accept:用户代理能处理的媒体类型eg:text/html
- Accept-Charset:用户代理支持的字符集
- Accept-Encoding:用户代理支持的内容编码eg:gzip、identity、compress
- Accept-Language:用户代理支持的语言集eg:zh-cn、en-us
- Authorization:告知服务器用户代理信息
- Range:范围请求eg:Range:bytes=1000-2000
- Referer:请求的原始URI
- User-Agent:客户端程序信息
6.3 响应首部字段
- Accept-Ranges:是否支持范围请求eg:none、bytes
- Age:创建响应过去多长时间,单位秒
- Localtion:重定向地址,配置302状态码
- Retry-After:告知客户端多久后再请求
- Server:告知HTTP的服务器应用程序
6.4 实体首部字段
- Content-Encoding:实体内容的编码
- Content-Length:实体主体大小单位字节
- Content-Range:范围请求资源
- Content-type:实体内容的媒体类型
- Expires:资源过期时间
6.5 为Cookie服务的字段
- Set-cookie:响应字段
- cookie:发给服务器的字段
7. HTTP协议的瓶颈
- 一条连接上只可发送一个请求(1.1版本长连接可多个)
- 请求只能从客户端开始,不可接收响应外的指令
- 首部字段未压缩发送,信息越多越延迟
- 发送冗长的首部,每次互相发送相同的首部浪费
- 可任意选择数据压缩格式,未强制要求压缩
应对方法:
7.1 Ajax
利用JavaScript和DOM操作,局部Web页面更新,响应中减少了传输的数据,但并未突破瓶颈
7.2 Comet
通过延迟应答(挂起响应)模拟服务器向客户端推送消息,需要连接时长变长,但并未突破瓶颈
7.3 SPDY
没完全改写HTTP协议,而是在应用层和传输层之间通过新的会话层形式运行。可多路复用、请求优先级、压缩首部、推送、服务器提示功能
突破了瓶颈,但SPDY只是单个域名的多路复用(只对当前网站适用),若请求其他网站则不适用,没有盛行
7.4 WebSocket
使用HTTP协议就无法完全消除瓶颈,那么只能使用另外的协议了----WebSokcet使用全双工通信,突破瓶颈
一旦建立WebSocket通信,后面都使用这个专用的协议,但由于其使用HTTP来升级协议,那么发起连接的还是客户端,升级协议后就没有区分了
WebSocket特点:推送功能、减少通信量
过程:建立HTTP连接后(TCP三次握手),需要再进行一次升级协议(HTTP字段),成功后使用WebSocket的独立数据帧(所以WebSocket使用到了TCP、HTTP的功能)
- 第一步:客户端发送Update:WebSocket字段、Connection:Update、Sec-WebSocket-Key:XXX
- 第二步:响应101状态码,字段:Sec-WebSocket-Accept:XXX(二者通过算法加密一样才可连接)
参考
《图解HTTP》