原文连接:http://caibaojian.com/http-connection-and-websocket.htmljavascript
对这四个概念不太清楚,今天专门搜索了解一下,总结一下:css
长链接:在HTTP 1.1,客户端发出请求,服务端接收请求,双方创建链接,在服务端没有返回以前保持链接,当客户端再发送请求时,它会使用同一个链接。这一直继续到客户端或服务器端认为会话已经结束,其中一方中断链接。html
优点:减小了链接请求,下降TCP阻塞,减小了延迟,实时性较好。·html5
劣势:可能会影响性能,由于它在文件被请求以后还保持了没必要要的链接很长时间。java
短链接:在HTTP1.0中,客户端发送请求,服务器接收请求,双方创建链接,服务器响应资源,请求结束。css3
长轮询:(我本身的理解)客户端不断发送请求,获取服务器上的数据。也有人说是长链接的一种,是这样吗???web
WebSocket:客户端发送一次http websocket请求,服务器响应请求,双方创建持久链接,并进行双向数据传输,后面不进行HTTP链接,而是使用TCP链接。ajax
在HTTP/1.0中默认使用短链接。也就是说,客户端和服务器每进行一次HTTP操做,就创建一次链接,任务结束就中断链接。当客户端浏览器访问的某个HTML或其余类型的web页中包含有其余的Web资源(如JavaScript文件、图像文件、CSS文件等),每遇到这样一个Web资源,浏览器就会从新创建一个HTTP会话。后端
而从HTTP/1.1起,默认使用长链接,用以保持链接特性。使用长链接的HTTP协议,会在响应头加入这行代码:api
Connection:keep-alive
在使用长链接的状况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP链接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经创建的链接。Keep-Alive不会永久保持链接,它有一个保持时间,能够在不一样的服务器软件(如Apache)中设定这个时间。实现长链接须要客户端和服务端都支持长链接。
HTTP协议的长链接和短链接,实质上是TCP协议的长链接和短链接。
TCP长链接
咱们再模拟一下长链接的状况:client向server发起链接,server接受client链接,双方创建链接,client与server完成一次请求后,它们之间的链接并不会主动关闭,后续的读写操做会继续使用这个链接。
由上能够看出,长链接能够省去较多的TCP创建和关闭的操做,减小浪费,节约时间。对于频繁请求资源的客户端适合使用长链接。在长链接的应用场景下,client端通常不会主动关闭链接,当client与server之间的链接一直不关闭,随着客户端链接愈来愈多,server会保持过多链接。这时候server端须要采起一些策略,如关闭一些长时间没有请求发生的链接,这样能够避免一些恶意链接致使server端服务受损;若是条件容许则能够限制每一个客户端的最大长链接数,这样能够彻底避免恶意的客户端拖垮总体后端服务。
短链接对于服务器来讲管理较为简单,存在的链接都是有用的链接,不须要额外的控制手段。但若是客户请求频繁,将在TCP的创建和关闭操做上浪费较多时间和带宽。
长链接和短链接的产生在于client和server采起的关闭策略。不一样的应用场景适合采用不一样的策略。
长轮询自己不是一种真正的推送技术,而只是传统轮询技术的一个变种。然而,其可以在真正推送技术没法实现时模拟推送机制。
在长轮询机制中,客户端像传统轮询同样从服务器请求数据。然而,若是服务器没有能够当即返回给客户端的数据,则不会马上返回一个空结果,而是保持这个请求等待数据到来(或者恰当的超时),以后将数据做为结果返回给客户端。
例如,BOSH是一个常见的、长久的、在TCP困难或没法实现的状况下(如在使用浏览器的状况下)使用长轮询模拟TCP的技术。这也是一种XMPP中隐含的技术,苹果公司将其用于iCloud推送支持。
WebSocket一种在单个 TCP 链接上进行全双工通信的协议。WebSocket通讯协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范。WebSocket API也被W3C定为标准。
WebSocket 使得客户端和服务器之间的数据交换变得更加简单,容许服务端主动向客户端推送数据。在 WebSocket API 中,浏览器和服务器只须要完成一次握手,二者之间就直接能够建立持久性的链接,并进行双向数据传输。
如今,不少网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,而后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器须要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费不少的带宽等资源。
而比较新的技术去作轮询的效果是Comet。这种技术虽然能够双向通讯,但依然须要反复发出请求。并且在Comet中,广泛采用的长连接,也会消耗服务器资源。
在这种状况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,而且可以更实时地进行通信。
Websocket使用ws或wss的统一资源标志符,相似于HTTPS,其中wss表示在TLS之上的Websocket。如:
//code from http://caibaojian.com/http-connection-and-websocket.html ws://example.com/wsapi wss://secure.example.com/
Websocket使用和 HTTP 相同的 TCP 端口,能够绕过大多数防火墙的限制。默认状况下,Websocket协议使用80端口;运行在TLS之上时,默认使用443端口。
WebSocket 是独立的、建立在 TCP 上的协议。
Websocket 经过 HTTP/1.1 协议的101状态码进行握手。
为了建立Websocket链接,须要经过浏览器发出请求,以后服务器进行回应,这个过程一般称为“握手”(handshaking)。
一个典型的Websocket握手请求以下:
客户端请求
GET / HTTP/1.1 Upgrade: websocket Connection: Upgrade Host: example.com Origin: http://example.com Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ== Sec-WebSocket-Version: 13
服务器回应
HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s= Sec-WebSocket-Location: ws://example.com/
附录知乎一个解释:
另外,对于长链接和socket链接也有区分: