无状态含义
每次的请求都是独立的,即不会受上一次请求状态的影响,也不会影响下一次的请求进程。如http 、udp 、ip均为无状态请求
有状态含义
与无状态请求相对应,上一次的请求成功与否直接影响下一次的请求进程。如tcp 为有状态请求
tcp 有状态请求过程
tcp的三次握手
1、当客户端开始发送请求建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认。
2、服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态
3、客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手
SYN:同步序列编号(Synchronize Sequence Numbers)
tcp的四次挥手
与tcp的三次握手建立连接对应,tcp的四次挥手就断开连接
1、客户端发送一个FIN,用来关闭客户端到服务器端的数据传送,客户端进入FIN_WAIT_1状态
2、服务器端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务器端进入CLOSE_WAIT状态
3、服务器端发送一个FIN,用来关闭服务器端到客户端的数据传送,服务器端进入LAST_ACK状态
4、客户端收到FIN后,客户端进入TIME_WAIT状态,接着发送一个ACK给服务器端,确认序号为收到序号+1,服务器端进入CLOSED状态,完成四次挥手。
tcp传输的安全性
由tcp的三次握手和四次挥手 可以看出,tcp 的每次请求都和上一次状态有关,也会直接影响下一次的请求进程,所有tcp传输也具有极高的安全性。如生活中的电话语音通讯等,必须双方同时建立连接才可以进行。
udp 无状态请求
udp是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去。如生活中的视频直播,服务端不需要确认大量客户端是否完全正常连接,就可进行正常通讯,和朋友发送微信消息时,也不需要确认朋友是否能立即接收。
也正因为如此,与tcp 相比,udp 传输安全性较低,数据传输量较小,但传输速度较快。
http 无状态
网络传输我们都知道,一共分为七层OSI协议和四层TCP/IP协议
http的传输层是由tcp 实现的,为什么说http 是 无状态的?
http是无状态的,但是http的一次完整请求,是使用有状态的tcp协议来完成的。而每次http请求之间没有任何关系。例如:第7次请求http协议包,并不知道,这个包是为了什么?它或许是因为上次没有请求成功而重传,或许是上次的后续请求,或许是其他的,这些http自身都不知道。
可以这么理解,http的一次请求是对tcp的三次握手和四次挥手的进一步完整包装。如我们平常身体的每次运动,是由身体的各个机能协调完成的,同时会有大量的细胞消耗,但每一个细胞的生命周期并不能代表我们人类的生命周期。
Web应用=http协议+session、cookie等状态机制+其他辅助的机制。
为什么http 不直接设计成有状态请求,而要加上session 和cookie 来做状态管理?
互联网初生时代,更多是用于资源共享,所以http 完全符合传输要求。但随着不同机构,不同用户的大量涌入,关于怎么进行资源的差异化分配,显然无状态请求已完全无法满足要求。本着网络设计的开闭原则,即对修改关闭、对扩展开放,人们便加入了session 、cookie甚至现在常用于分布式的tooken来进行状态的管理。
session 即把用户的信息存储在服务器端,客户端的每次请求都会和session 比较,但当大量用户的信息都存储在服务器端,显然服务器的压力会增大。 cookie 即把用户信息存储在客户端,客户的每次请求都会和客户端信息对比。但随着分布式、多客户端应用出现,想要要实现一次登陆,其余客户端都可获取用户信息,显然简单cookie 已无法满足需求。所以tooken 应用而生,客户端的每次http 请求头中 都会携带tooken 在服务器端解析对比,从而进行状态管理。
来源:oschina
链接:https://my.oschina.net/tcwong/blog/3213771