1.0(1996年)和1.1(1999年) 的一些区别(三年升级,三年磨一剑)
长连接:
HTTP1.0需要主动的设置Connection: keep_alive 的连接方式,才能开启长连接
HTTP1.1默认支持长连接的,在一个TCP连接上可以传输多个HTTP请求,减少了建立和关闭连接的消耗和延迟
Host头域
Http1.0中认为每台服务器都绑定了一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名,但随着虚拟主机的技术发展, 一台服务器上可以存在多一个虚拟主机,共享一个IP地址
Http1.1的请求信息和响应信息都应该支持Host头域,且请求信息中如果没有Host头域就回报一个错误(400 Bad Request)。
传送优化
Http1.0中header和body必须一起发送,有时候会造成浪费宽带的现象,并且不支持断点续传的功能。
Http1.1 则在请求头中引入了range头信息,允许只请求资源的部分,及返回码为206,这样就方便了开发者充分利用带宽和连接。
新增的一些响应状态码
如上面提到的400 206
2.0的新特性(2015年)
1.多路复用
http2.0采用多路复用的技术,可以做到一个链接并行处理多个请求
2. header压缩
http2.0 使用enoder来压缩需要传输的header,使得header头文件变小了不少
3. 服务器推送
根据请求,服务器会顺便把一些客户端需要的别的资源一起推送过来,这样的话只需要一次h't't'p传输就能得到较完整的资源,提高性能
4. 解析格式
http1.0和1.0 都是基于文本解析的,而http2.0是通过二进制解析的。
http的请求头和响应头部
我们可以看见请求报文格式
请求行,请求头,空行,请求包体(仅限post方法)
请求的方法可以分为:post , get , put , options , delet , head
响应报文的格式
状态行(协议版本,状态码,还有一些描述),响应头部,空行,响应包体
状态码
- 1** 信息相关
- 2** 请求成功
- 3** 重定向相关
- 4** 客户端错误相关,或无法完成请求
- 5** 服务端错误相关
以请求htttp://localhost:8080/zzz1/denglu.jsp为例子说一下请求的整个过程
1.首先建立根据请求头的一些信息建立一个TCP链接
2. Connector把该请求交给了它所在的Service的Engine引擎来处理
3.Engine引擎匹配该Host,Host获得/zzz1/denglu.jsp,匹配 /zzz1 的Contex
4. Context得到/denglu.jsp的资源,在他的Mapping table中寻找对应的servlet
5. 对应于Jspservlet类,构造HttpServletRequest和response
6.通过responst返回给Host,返回给Engine, 返回给Connnector , 返回给客户端。