Socket和Websocket的关系

之前一直被误导的同学注意了,它们的关系就像Java和JavaScript根本没有sm关系

Socket

Socket其实并不是一个协议,它是对传输层 TCP/IP 协议的抽象层,它是一组接口,提供一套调用TCP/IP协议的API

如果你要使用HTTP来构建服务,那么就不需要关心Socket,如果你想基于TCP/IP来构建服务,那么就要使用Socket的API了

WebSocket

WebSocket是HTML5中的协议,支持页面使用WebSocket协议与远程主机进行全双工的通信。

WebSocket和Http一样,都是应用层协议,只是WebSocket是通过在客户端与服务器之间HTTP协议的初始握手阶段将其升级到WebSocket协议来建立的,不过其底层仍是TCP连接。

详细过程

websocket 建立连接先通过 Http 协议与服务器进行握手,服务器解析相应的 Http 协议,确认出本次连接是 Http 还是 websocket连接,如果是 websocket 连接,则双端直接进入 TCP/IP 常规的三次握手阶段,建立TCP连接,进行双向数据通信。

WebSocket好处

  • Http协议的单向行导致服务器只能被动的返回信息,WebSocket协议可以让服务器主动返回信息。
  • 传统的轮询方式(即采用Http协议不断发送请求)有很多缺点,比如浪费流量(Http请求头比较大)、浪费资源(没有更新也要请求)、消耗服务器CPU占用(没有信息也要接收请求)
  • http1.1之后,浏览器默认开启keep-alive connection ,虽然这样可以在一次 Http连接中可以发送多个Request,接收多个Response,但是对每个请求仍然要单独发 header;然而websocket是基于回调设计的,不是request和response的形式,用于协议控制的数据包头部相对较小。如果请求频繁的话,就极大的减少了不必要的网络流量与延迟。

常用名词总结

  1. 轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
    优点:后端程序编写比较容易。
    缺点:请求中有大半是无用,浪费带宽和服务器资源。
    实例:适于小型应用。

  2. 长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
    优点:在无消息的情况下不会频繁的请求。
    缺点:服务器hold连接会消耗资源。
    实例:WebQQ、Hi网页版、Facebook IM。

  3. 长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。
    优点:消息即时到达,不发无用请求。
    缺点:服务器维护一个长连接会增加开销。
    实例:Gmail聊天

  4. WebSocket:客户端发送一次http(websocket协议升级)请求,服务器响应请求,三次握手后,双方建立持久连接,并进行双向数据传输,后面不进行HTTP连接,而是使用TCP连接。

    优点:双向通信减小服务器开销更强的实时性保持连接状态

    缺点:一旦服务器故障,连接就会中断,过老浏览器不支持WebSocket

    实例:网页游戏

  5. Http的无状态短连接:每次请求结束后,TCP连接就关闭,相关的内容就释放了,记不住任何状态。