1、http概述
http是应用层协议,定义客户端如何向web服务器发送请求以及web服务器如何向客户端进行响应。在1991年发布0.9版本,很快被1.0版本取代,目前web应用最广泛的是1.1版本。最新版本是http/2.0尚未得到普及。不过2.0版本在性能方面优于1.1。
2、http连接
http是基于传输层的tcp传输报文。任一请求之前,首先要建立tcp连接「有非持久连接和持久连接之分」,而后才能发送或接收http报文。
a、非持久连接:http客户端与http服务端建立tcp连接后,通过该连接发送或响应http报文,然后断开连接。1.0版本默认是非持久连接,每请求一个对象(web页或图像文件)都需要建立建立,对象传输结束后,马上断开连接。由此可知,重复建立连接需要大量的rtt(所需时间=2的n次方,n代表传输对象个数),这也就导致其网络吞吐量低,延迟会更加明显。为了解决次问题,提出了两个优化方案:并行连接和持久连接。
b、并行连接:同时建立多个连接并行处理,从而提高传输效率。然而受链路带宽、服务器系统tcp连接数的限制,并行这一方案不一定总能减少延迟,提高效率。
c、持久连接:所谓持久就是在web页面后,不关闭连接。而是利用此连接继续传输web页引用的图像文件。根据传输对象的多少策略不同,持久连接分非管道方式和管道方式。
c1、非管道方式:客户端每收到一个响应报文后,才能发出对下一个对象的请求报文。这样总的传输时间rtt=所需传输对象的个数(不包含tcp建立连接时间)。
c2、管道方式:客户端在收到响应报文之前,可以持续依次发送对后续对象的请求报文,因此总的传输时间理论上只需要1个rtt(不包含tcp建立连接时间)。
注意:http/1.1版本默认使用管道持久连接。
3、http报文结构
http报文由{起始行,首部行,空白行,实体}4部分组成。从图中可知,二者仅是起始行不同。各部分最后是CRLF。CRLF其实是两个ascii字符”CR”(13位)和”LF”(10位)就是换行符”回车“。
3.1请求报文结构:
1、起始行(内容之间由空格分隔)
方法:是指http请求的5个方法{get,post,head,option,put}。
url:请求的资源路径。
协议版本:http/<主版本号>.<次版本号>
crlf:回车换行,标志本行结束。
2、首部行(以:分隔k和v)
这部分用于携带附加信息,可以是零行或者多行。具体内容形如:「字段名:字段值」。
3、空白行
这部分是必须存在,用于分隔首部行/起始行与实体。
4、实体
实体也成为主体,其内容可以是文本,图片,视频,文档等。多数情况下这部分是被省略的。
3.2响应报文结构:
1、起始行(也叫状态行)
协议版本:与请求报文内的定义与格式相同。用于声明服务器所用的Http版本号。
状态码:用于通知客户端响应状况,由3为十进制数组成(如:200,404),每个状态码有独特含义
短语:是对前面状态码的一种解释,便于理解。
注:剩下的首部行、空白行、实体的格式与规范都与请求报文结构一致。
请求报文示例:
HTTP/1.0 200 OK //起始行
Content-type:text/plain //首部行
Content-length:20 //首部行
//空白行
Hi I’m Jim! are you ok? //主体
4、http状态码
http利用3为十进制数的第一位来区分5类状态码,见下表。
平时比较常见的状态码如下:
5、cookie
5.1、cookie是什么?
cookie是存放在用户电脑上特定目录的一些数据。众所周知http是无状态协议,客户端和服务器传输数据后tcp连接会关闭,服务器无法跟踪用户的会话。例如在web购物网站,如果用户每次访问该网站都需要用户名和密码来验证身份,想象一下用户会是什么样心态。为此,有个叫Lou montulli的牛人发明了cookie(4kb大小)。
5.2、cookie工作原理
cookie的工作流程如下图:
场景示例:假如你有1亿现金需要存储在某银行,银行会给你办理一张储蓄卡,里面存储了你的各种重要信息。当你下次再来存钱或者取钱的时候,银行能识别你的银行卡,从而直接给你办理业务。银行卡丢失一定要及时办理冻结账户或者换卡,cookie的作用跟银行卡类似。由此可见,虽然cookie给web应用提供了很多方便,但也带来了一定的安全问题。
5.3、cookie的属性
#name=value:键值对kv形式保存数据,name不可为空。
#expires:cookie过期时间,设置的某个时间点后该 Cookie 就会失效。通常设置maxAge,取值范围:0、正/负整数。0表示立即删除cookie;正整数表示cookie会被持久化,多少秒后失效;负整数表示cookie不会被持久化,窗口或浏览器关闭后立即失效。
#domain:生成cookie的域名,如www.google.com。cookie不允许跨域名访问,既是二级域名也不行。只能通过设置domain为”.xxx.com“这种形式。
#path:cookie 是在当前的哪个路径下生成的。设置为”/”表示允许所有路径都可以使用ookie.
#secure:如果设置了这个属性,那么只会在 HTTPS/SSL连接时才会回传该 cookie。
tips:
①客户端只能读取cookie的name和value,提交时也只附带name和value。
②cookie的修改和删除只能通过覆盖name以及设置maxAge的方式。
③http是无状态的,也是不安全的。secure属性为ture时,要求必须是https/ssl来传输cookie。
6、session
session和cookie其功能大致类似,也是一种记录客户端状态的机制。session保存在服务端,以某种形式记录用户的特定信息。session能存储任意信息的数据,甚至可以当做容器使用。
session工作示意图:
①客户端发起http请求。
②服务端检查sessionID(Tomcat是JESSIONID),如果没有该标识,则创建一个唯一sessionID返回给客户端。
③客户端再次访问时附带上一步返回的sessionID,(sessionID存储在cookie中)。
④服务器根据sessionID来识别用户,并做出相应的响应。
tips:
1、如果浏览器禁用cookie或使用手机端浏览器,又要使用session机制,可用URL地址重写实现。
2、通过共享cookie和session实现同域名的单点登录。