HTTP协议

特点:

1.无状态。同一个客户无论多少次访问服务器上的一个页面,服务器都不会记住客户的状态;

2.使用TCP做传输协议。但是HTTP协议本身是无连接的,交换HTTP报文之前不需要建立HTTP连接。

长连接、短连接:

短连接的操作步骤是:
建立连接——数据传输——关闭连接…建立连接——数据传输——关闭连接
长连接的操作步骤是:
建立连接——数据传输…(保持连接)…数据传输——关闭连接

Connection:keep-alive

短连接每次双方建立连接的时候都需要TCP三次握手、关闭连接的时候都需要TCP四次挥手;

长连接每次双方通信完之后,客户端和服务器都会保存着连接,下次通讯的时候客户端直接发送数据就行了。

TCP保活功能:保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。如果客户已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将应远等待客户端的数据,保活功能就是试图在服务 器端检测到这种半开放的连接。

如果一个给定的连接在两小时内没有任何的动作,则服务器就向客户发一个探测报文段,客户主机必须处于以下4个状态之一:

客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。
客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。
客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。
客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应。

HTTP怎么保存状态:

使用cookie和session:

cookie:用户第一次访问服务器的时候,服务器响应报头通常会带一个Set-Cookie响应头,让客户端在本地设置一个cookie,当再次访问服务器的时候,HTTP会把这个cookie带过去。

session:每个用户变量的值,用sessionID来区分用户。这个值是通过用户的浏览器在访问的时候返回给服务器,当客户禁用cookie时,这个值也可能设置为由get来返回给服务器。我们把用户在一定时间内访问某个网站时,请求不同页面的过程叫做一个会话,也就是session。在同一个session里,我们可以记录用户访问的状态和信息。

由于采用服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的。

如果cookie是身份证,那session就是你的档案。

brief:

A、cookie就是服务器发放给客户端的一些标识,让客户端记住每次请求的时候带上,以区分不同的用户;

B、session是服务器存放在自己那里的用户相关的数据,用每次用户带来的cookie去提取出来,恢复一个之前访问的历史或者相关环境。

session的分布式:

session的保存:
1.文件形式
2.cache形式
3.不保存,全部加密到cookie中

在分布式的场景下,请求会被分发到不同的服务器,这样子会导致用户session找不到,导致频繁登录等,解决方法有以下几种:

1.session粘性

每次请求都打到同一台服务器,但是这样服务器挂了session就丢失了:

upstream mycluster{ #这里添加的是上面启动好的两台Tomcat服务器 ip_hash;#粘性Session server 192.168.22.229:8080 weight=1; server 192.168.22.230:8080 weight=1; }

2.服务器session复制

服务器见通过进程间通信复制session,这样会加大网络负担,而且有可能session还没复制过去用户的下一次请求就到达了:

① 设置tomcat ,server.xml 开启tomcat集群功能 enter description here Address:填写本机ip即可,设置端口号,预防端口冲突。 ② 在应用里增加信息:通知应用当前处于集群环境中,支持分布式 在web.xml中添加选项

3.session共享:

使用memcached或者redis保存session信息,服务器不保存session。

4.Terracotta实现session复制:

Terracotta的基本原理是对于集群间共享的数据,当在一个节点发生变化的时候,Terracotta只把变化的部分发送给Terracotta服务器,然后由服务器把它转发给真正需要这个数据的节点。

session如何自动过期:

comments powered by Disqus