1.http/1.0
一个http的请求过程,就是建立一个socket通讯的过程,http是不保存状态的协议,因此每次完成一次http请求,就会断开一次TCP连接。
由于互联网的飞速发展,http通讯过程中,传输的文本数据量越来越大,因此,某些请求都会建立很多次socket,造成无谓的TCP连接和断开,增加了通讯量的开销。
大致如下:
建立TCP连接
http请求/响应
断开TCP连接
...
建立TCP连接
http请求/响应
断开TCP连接
直到http请求的文本全部获取,中间可能经历了N次的TCP连接。
2.http/1.1
因而在Http/1.1的版本中,增加了持久连接的方法(keep-alive),http长连接,即只要任意一方没有提出断开连接,那么TCP保持连接状态,一般情况由client这边主动断开连接,但是也不排除服务器不支持长连接,或者等待时间长而导致服务器断开TCP
大致如下:
建立TCP连接
http请求/响应
...
http请求/响应
断开TCP连接
很明显省去了中间的多次TCP连接的过程,提升了web传输的效率,节省了带宽。(注:除非手动附带connection:close的首部,否则默认开启持久连接。)
虽说如此,但是持久化连接和非持久化连接都有一个共同的缺点,每次http的请求都需发送header,除了传输报文主体外,还需传输交换大量的header信息。
3.WebSocket的出现:
WebSocket是HTML5出的东西(协议)
http发送请求后,建立一个TCP连接,之后就不需要继续发送http请求,依然可以和服务端保持长连接,同时,websockt
还是一个双通道的连接,任一端都可以发送和接受消息。
虽然websocket实现了长连接,但是这种长连接可能会出现一种假死状态,因为现实网络中,client端和server端之间存在着复杂的中间网络层,很多时候,
由于C和S端长时间没有互相通讯,TCP可能出现自动断开的情况,而中间网络层在设计上做了层层的缓存处理,websocket在断开之后,仍然会存在一种没有
断开的假象。
解决方法
服务器和客户端能够发送 Ping/Pong Frame(心跳)。这种 Frame 是一种特殊的数据包,它只包含一些元数据而不需要真正的 Data Payload,
可以在不影响 Application 的情况下维持住中间网络的连接状态。
网友评论