HTTP
HTTP的特性
- HTTP协议构建于TCP/IP协议之上,是一个应用层协议,默认端口号是80
- HTTP是无连接无状态的
HTTP报文
请求报文
HTTP协议是以ASCII码传输,建立在TCP/IP协议之上的应用层规范。
规范把HTTP请求分为三个部分:状态行、请求头、消息主体
<method> <request-URL> <version>
<headers>
<entity-body>
HTTP定义了与服务器交互的不同方法,最基本的方法有四种
分别是GET/POST/PUT/DELETE
一个URL地址用于描述一个网络上的资源,而HTTP以上的四种方法对应这对这个资源的查、增、改、删四种操作
-
GET用于信息获取,而且应该是安全的和幂等的
安全意味着该操作用于获取信息而非修改信息。
幂等意味着对同一URL的多个请求应该返回相同的结果GET请求报文示例:
GET /books/?sex=man&name=Professional HTTP/1.1 Host:www.example.com User-Agent:Mozilla/5.0(Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Connection:Keep-Alive
-
POST代表一个可能会改变服务器资源的请求
POST / HTTP/1.1 Host:www.example.com User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6) Gecko/20050225 Firefox/1.0.1 Content-Type:application/x-www-form-urlencoded Content-Length: 40 Connection:Keep-Alive sex=man&name=Professional
-
ATTENTION:
- GET可提交的数据量受到URL长度的限制,HTTP协议规范没有对URL长度进行限制。这个限制是特定的浏览器和服务器对它的限制
- 理论上说,POST是没有大小限制的,HTTP协议规范也没有进行大小限制,处于安全考虑服务器在实现时会做一定限制
POST提交数据的方式
HTTP协议规定POST提交的数据必须在body部分中,但是协议中没有规定数据使用哪种编码方式或者数据格式。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的HTTP请求满足上面的格式即可。
但是数据发送出去,还要服务端解析成功才有意义。服务端通常根据请求头(headers)中的Content-Type字段来获取请求中的消息主体的编码方式,再对主体进行解析。POST提交数据方案,包含了Content-Type和消息主题编码方式两部分
-
application/x-www-form-urlencoded
这是最常见的POST数据提交方式。浏览器的原生<form>表单,如果不设置enctype属性,那么最终就会以 application/x-www-form-urlencoded方式提交数据 -
multipart/form-data
这是另一种常见的POST数据提交方式。我们使用表单上传文件时,必须让<form>表单的enctype等于multipart/form-data。示例如下:
HTTP1.0与HTTP1.1的区别
- 缓存处理:
- HTTP1.0 使用if-Modified-Since,Expired来作为缓存判断的标准
- HTTP1.1 使用Entity tag, if-Unmodified-Since, if-Match, if-None-Match控制缓存
- 带宽优化及网络连接的使用
- HTTP1.0 存在带宽浪费的现象,不支持断点续传
- HTTP1.1 引入range头域,允许只请求资源的某个部分
- 错误通知的管理
- HTTP1.0新增 24个错误状态响应码,
如409(conflict)表示请求的资源与当前状态发生冲突,410(Gone)表示服务器上的某个资源被永久性删除
- HTTP1.0新增 24个错误状态响应码,
- Host头处理
- HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此请求消息中URL不会传递主机名(hostname),随着虚拟主机技术的发展,一台物理服务器上可以存在多个虚拟主机,并且共享一个IP地址。
- HTTP1.1请求消息和响应消息都支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
- 长连接
- HTTP1.1支持长连接(PersistentConnection)和请求的流水线处理(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了简历和关闭连接的消耗和耗时。在HTTP1.1中默认开启Connection:keep-alive
HTTPS与HTTP的区别
- HTTPS协议需要到CA申请证书,一般免费证书少,需要缴费
- HTTP协议运行在TCP之上,所有传输的内容都是明文的,HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都是经过加密的
- HTTP和HTTPS使用完全不同的连接方式,用的端口也不一样(80->443)
- HTTPS可以有效的防止运营商劫持
SPDY:HTTP1.x的优化
- 多路复用:SPDY采用多路复用,解决了HTTP高延迟的问题
- 请求优先级:多个请求同时发送时,可优先发送高优先级的请求
- header压缩
- 基于HTTPS的加密协议传输,大大提高了传输数据的可靠性
- 服务端推送
SPDY: HTTP->SPDY->SSL->TCP
HTTP2.0和SPDY的区别
- HTTP2.0支持明文HTTP传输,而SPDY强制使用HTTPS
- HTTP2.0消息头的压缩算法采用HPACK,而SPDY采用DEFLATE
HTTP2.0与HTTP1.x相比的新特性
- 新的二进制格式(Binary Format)
HTTP1.0 解析是基于文本的,HTTP2.0解析采用二进制格式 - 多路复用
每一个request 都支持连接共享机制,一个request对应一个id,这样一个连接上可以有多个request。每个request可以随机混杂在一起,接收方可以根据id将request归属带不同的服务端请求中- HTTP1.x一次请求建立一个连接,用完关闭;每一个请求建立一个连接
- HTTP1.1 Pipelining 采用串行排队处理请求,一旦前面有请求超时,后面的都会被阻塞
- HTTP2.0 多个请求可同时在一个连接上并行执行,某个请求被阻塞不会影响其它连接
- header压缩
HTTP2.0维护一个字典,差量更新HTTP头部,大大降低因头部传输产生的流量 - 服务端推送
服务端推送可以将客户端需要的资源伴随index.html一起发送到客户端,省去客户端重复请求的步骤。因为没有发起请求,建立连接等操作,所以静态资源通过服务端推送可以极大提高速度