理解WebSocket

WebSocket的动机是什么?

目前的Web通讯使用的是HTTP协议,HTTP协议是基于TCP协议的应用层协议,HTTP协议的工做模式是request/response模式。在一次通讯中,必须首先由client向server发起TCP链接,而后server接受该TCP链接请求,在TCP链接创建以后,首先由client发起HTTP request,而后server再发出HTTP response。 程序员

 

所以,在这种标准HTTP工做模式的约定下,server是不被容许发起一个TCP请求的,所以也就不被容许在未收到HTTP request的状况下,发送一个HTTP response给client。在这种约束下,为了可以不断的随时从server发送内容到client端,就必须保证server端随时都有一个待响应的request(注意这与persistent connection不是同一个概念,persistent connection是用来复用HTTP之下的TCP链接)。 web

 

如何在现有的HTTP框架内,来得到这么一个时刻存在于server端的待响应请求呢?这就是COMET技术,具体说有2种方式: websocket

  • 多个HTTP请求不断接力(long polling)
  • 单个HTTP请求不终止 (HTTP streaming)

 

可是,若是咱们回过头来仔细想一下HTTP协议的细节,HTTP实际上是创建在TCP之上的,因此当咱们在进行HTTP通讯时,client和server之间已经创建起了一个TCP链接,而任何TCP链接(从程序员角度来讲,就是一个Berkeley socket)都是能够用来双向通讯的,那么为何不直接利用这个现成的TCP链接来实现client和server的双向通讯呢? 框架

 

没错!这就是WebSocket所作的事情! socket

WebSocket链接如何创建

咱们创建WebSocket通讯的过程是这样的: server

  • Step 1 创建TCP链接(这一步是一切的基础,和HTTP同样)
  • Step 2 经过TCP链接,发送HTTP Get 请求,其中包含关键的Upgrade: websocket header。
  • Step 3 Server收到HTTP请求后,会把Step 1的TCP链接的用户层协议从HTTP转变为WebSocket。至此,HTTP部分就退出舞台了,WebSocket开始接管一切。

 

 

如何理解WebSocket能够和HTTP共享80端口?

准确的说,应该是WebSocket能够分享HTTP正在使用的端口,不必定是80。缘由是WebSocket的initial handshake是一个valid HTTP request,因此除非咱们本身重写一套解析HTTP handshake的逻辑,不然必须发送到现有的HTTP端口来解析。而仅仅发送到HTTP端口仍是不够的,咱们还须要在server实现中添加关于WebSocket的逻辑。而后,server根据HTTP协议解析了initial handshake request以后,由server来进行协议切换,把HTTP换成WebSocket。 ip

 

因此,这里能够看出,HTTP协议本身并不须要了解WebSocket什么,也不须要知道它什么时候应该让位于WebSocket协议,HTTP协议只是规定了HTTP的通讯格式(好比WebSocket所使用的custom header),是server根据HTTP协议规定的格式,发觉了WebSocket的链接请求,而后再进行协议切换,server是协议切换逻辑的载体和执行者,当咱们要实现一个WebSocket server,就必须在server代码中加入如下逻辑: get

  • 识别HTTP格式的WebSocket 请求
  • 协议切换
  • WebSocket的协议模块

 

 

参考

相关文章
相关标签/搜索