http协议是一种超文本传输协议,用于客户端和服务器的一种请求应答标准。设计http协议的最初目的是为了提供一种发布和接收html页面的方法,通过http或者https协议请求的数据使用url来标识。
1、http协议特点
- (1)基于请求/响应模型的客户端服务器模型。
- (2)简单快速:客户端请求服务端只需要指定请求方法+请求路径,由于http协议简单,使得http服务器程序规模较小,因而传输速度很快。
- (3)数据传输类型灵活:http允许传输任意类型的数据对象。传输的数据对象类型使用“Content-Type”来指定
- (4)无连接:无连接是指每次http连接只处理一个请求,服务端处理完客户端请求并收到客户端的应答之后,就断开连接。这样做的主要目的是服务端可能需要服务成千上万的客户端,若所有客户端都保持着连接不释放,会影响服务端对其他客户端的服务。设计者最初的目的是请求时建连接、请求完释放连接,以尽快将资源释放出来服务其他客户端。
- (5)无状态:无状态指服务器对每个客户端请求处理是独立的,服务器对事务处理没有记忆能力,服务器不知道客户端是什么状态;比如客户端向服务器发送请求之后,服务器响应服务端并返回客户端需要的数据,发送完之后服务端不会记录任何信息。
- (6)http协议默认端口为80.
2、http无连接、短连接与长连接
由于http需要保证数据的可靠性传输,所以http底层变采用可靠的传输层协议, Http协议底层大多使用TCP作为传输层协议。http没有限制只能使用TCP作为传输层协议,任何可以保证可靠传输的传输层协议都可以作为http的底层协议。
http的无连接特性指的是每个http连接只能处理一个请求,当服务器响应完客户端的请求并收到客户端的响应之后将关闭连接。无连接并不是指字面意义上的没有连接,它实际上是有连接的,只不过是短链接而已。设计者最初的目的是请求时建连接、请求完释放连接,以尽快将资源释放出来服务其他客户端。
http是无连接的是在应用层协议的角度看是无连接的。
http协议的长连接和短连接,实质上是TCP协议的长连接和短连接,但是在http应用层协议来看还是无连接的。
在使用http短链接的场景中,客户端向服务端发起一个请求,此时客户端和服务端之间建立一条TCP连接,http协议包体在这条TCP连接通道上传输,当服务端响应请求完毕并且收到客户端的回应的时候,TCP连接断开,客户端下次请求的时候需要重新建立TCP连接。
在使用http长连接的场景中,客户端向服务端发起一个请求,此时客户端和服务端之间建立一条TCP连接,http协议包可以在这条TCP连接通道上传输,当服务端响应请求完毕并收到客户端回应的时候,TCP连接依然保持建立;此时服务端就一直等待客户端再次请求数据,若此时客户端已经消失而未断开连接,则此时服务器上就会保留一个半开放的连接,此时服务器会在一定时间内检测当前TCP连接上没有数据过来而主动断开连接,否则服务器资源可能被消耗殆尽。
-
HTTP/0.9:http 0.9版本是1991年发布的,这个时候的http只支持短链接,也就是客户端每次向服务器请求数据都必须重新创建一个连接,请求完毕连接被断开。
-
HTTP/1.0:1996年发布,默认使用短链接,提出了长连接(持久连接)的概念,并提供简单支持
-
HTTP/1.1:1999年发布,默认使用长连接。使用长连接的http请求在请求头会添加
Connection:keep-alive
目前HTTP/1.1的长连接有个很大的弊端:在持久连接下一个连接中的请求是串行的,如果某个请求出现网络阻塞等问题,会导致同一条连接上的后续请求被阻塞。目前提到的解决方案就是:
1、使用pipeline的方式,客户端可以不需要等待服务端的响应就可以发送下一个请求,服务端返回数据保证与客户端的请求顺序一致;但是服务端的返回还是串行的。
2、采用多路复用技术,非阻塞的方式。
Http的报问结构请阅读另外一篇博客:http报文
3、http无状态详解
3.1无状态解释
http协议是无状态的,这句话的含义是指客户端和服务端之间的请求是互相独立的。这里的状态不仅包括不同URL之间的访问关系,还有对URL访问的数据记录,都是没有关系的。
但是大多数的应用场景都需要有状态的场景,比如系统需要记录你的喜好给你推荐商品等等。
3.2 cookie与session
在一些应用中,比如购物网站,用户浏览购物网站中的不同URL,网站服务器需要获知这一系列的行为都是当前你这个用户在操作,如你向购物车加入了一件商品,你收藏了一个商品等。
最开始http解决这个问题的方案是:当client访问Server的时候,Server在返回的数据中嵌入Token数据;然后client再次访问Server的时候,client请求将上次server返回的token携带到隐藏的表单或者直接放到URL中,将token发送给Server,这个时候Server就知道这次访问的用户和上一个就是同一个用户了。
因为token直接放到网页或者URL中太容易出错,并且写起来太复杂,后来引入了cookie和session的概念。
3.2.1 cookie详解
(1)Cookie本质:
cookie本质上是HTTP请求头中的一小段内容;它是服务器发送到用户浏览器并保存在本地的一小块数据,当client再次请求Server的时候,cookie将被携带到Header中发送到服务端。
(2)Cookie的作用:
- 识别用户的身份:该作用需要和Session配合使用,client向Server请求数据,Server除了正常需要返回的数据以外,生成一个ID(uid=123)给客户端,客户端收到后将该串数据保留到本地cookie中,下次client请求这个域名的时候,再带着这段cookie到Server,这样Server就能知道client是谁了
- 记录用户操作历史:前端js可以通过修改cookie内容来记录用户在这个域名下的操作记录。
(3)Cookie在客户端与服务端交互过程中的使用:
1、产生cookie:client第一次访问Server,Server生成一个cookie并返回给client
2、保存cookie:client收到cookie之后会将cookie保存在本地,并给cookie一个有效期,超过有效期,cookie就失效了
3、传递cookie:client再次访问Server的时候,会在请求头中带上cookie,将cookie传递到Server
4、解析cookie:服务端取到cookie之后解析cookie,并返回响应的信息给client。
在 cookie 没有失效之前,cookie 的使用都是围绕2,3,4三部分来进行的,第1步一般只需要进行一次。
(4)cookie在使用中存在的问题
1、cookie是基于浏览器的本地存储,跨浏览器cookie不通用
2、cookie的存储有大小限制,一般为4k左右
3、cookie可以被用户手动修改,有安全风险
4、cookie是有有效期的,默认有效时间是20分钟,可以通过后端强制设置有效期。
5、cookie有同源策略:在请求qq.com的时候只会带上qq.com的cookie,而不会带上Baidu.com的cookie,而访问wx.qq.com的时候既会带上qq.com的cookie也会带上wx.qq.com的cookie。
6、cookie保存是明文保存,可以被客户端任意修改有泄漏风险。
3.2.2 Session详解
(1)Session本质:
Session本质上是服务端保存的一段数据,在cookie的基础上,可以通过cookie和Session配合使用来识别网络用户。对于不同的语言Session 的保存方式不同。
Java:内存
PHP:磁盘
NodeJS:内存
(2)Session的作用:
Session的作用就是用来保存Server与客户端会话之间的上下文信息,以及该客户端ID对应的一些信息。它是基于Cookie实现的,生成的SessionID将以cookie的形式发送到客户端并被保存。
(3)Session在客户端与服务端交互中的使用:
1、产生SessionID:Client第一次请求Server,服务端生成一个随机数,叫做SessionID,Server将该SessionID放在响应头中,以cookie的形式返回给client.
2、保存SessionID:Server将要保存的数据保存在相对应的Session下,并将SessionID保存在Server端特定的位置(内存或者磁盘),数据结构一般使用Hash表。
3、使用Session:client再次访问Server的时候,它将SessionID带到请求头的cookie中发送给Server;Server读取到请求头中的SessionID,并根据SessionID从保存Session的hash表中找到对应的内容返回给client。
(3)Session与Cookie的区别
1、Session存储在服务端,cookie存储在服务端
2、Session无法被用户查看和修改,而cookie可以
3、Session和Cookie的存储容量不同
4、SessionID存储在客户端的Cookie中,所以Session本质上是基于Cookie的一种存储方式。
参考博客:
https://blog.youkuaiyun.com/tennysonsky/article/details/44562435
https://www.cnblogs.com/bellkosmos/p/5237146.html