1. 简单的HTTP协议

超文本传输协议,规范了浏览器和服务器的数据交互,其是基于TCP协议进行连接的,而传输的内容就是HTTP

浏览器即客户端发送的HTTP我们称之为请求报文,反之叫响应报文


1.1 报文的组成

报文首部 + 空行 + 报文主体

了解HTTP协议-LMLPHP

请求报文的组成:报文首部(请求方法、请求URI、协议版本、首部字段)、空行、报文主体

了解HTTP协议-LMLPHP

响应报文的组成:报文首部(协议版本、状态码、原因短语、首部字段)、空行、内容实体

了解HTTP协议-LMLPHP


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》


06-01 08:39