根据维基百科的文章:http://en.wikipedia.org/wiki/WebSocket, 服务器在握手期间将此响应发送回客户端:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk=
Sec-WebSocket-Protocol: chat
这是否会关闭连接(如HTTP响应通常那样),或者在整个握手期间保持打开状态,它可以立即开始发送WebSocket帧(假设成功)?
答案 0 :(得分:0)
在此过程中,不会关闭要通过握手过程升级到webSocket协议的HTTP套接字。相同的开放套接字遍历整个过程,然后成为用于webSocket协议的套接字。一旦升级完成,那个套接字就可以根据webSocket协议发送消息了。
使用完全相同的套接字可以使webSocket连接在与HTTP请求相同的端口上运行(不需要额外的端口),因为它实际上是作为HTTP请求开始的(附加了一些额外的头)然后当识别出这些标题并且双方都同意时,原始Web端口(通常是端口80)上的原始HTTP请求的套接字然后被切换为使用webSocket协议。不需要在某些新端口上建立额外连接。
我实际上发现它是一个相对优雅的设计,因为它可以轻松与Web服务器共存,这是一个重要的设计参数。并且,一点点额外的连接开销(协议升级协商)通常不是问题,因为webSocket连接本质上被设计为长时间运行的套接字,您打开一次并在较长时间内使用,因此需要额外的开销打开它们通常不会打扰它们。
如果出于任何原因,升级没有完成(双方都不同意升级到webSocket),那么套接字将保持HTTP套接字,并且会像HTTP套接字通常那样(可能会关闭)马上,但受到正常的HTTP交互)。
在升级到webSocket期间,您可以看到此答案以获取有关来回的更多详细信息:SocketIO tries to connect using same port as the browser used to get web page