websocket由rfc6455所定义,主要用于在html5上模拟raw socket通信,这个牛逼的feature需要浏览器支持(很显然的)。 websocket是传统的c/s协议,服务端和客户端(通常是浏览器)分别遵循rfc6455的定义进行实现,由浏览器暴露接口给js进行客户端编程(暴露给js的接口用起来很简单,本文就不讨论了)。 根据rfc6455所述(6455的篇幅较为短小,跟以前读过的3720比起来的话。。。),websocket是用来解决browser-based应用需要双向通信的需求。它实际上是一种建立在tcp之上的传输协议(连接建立时会使用HTTP协议进行handshake),所以一个ws连接是占用一个tcp连接的,并且是有状态的。 相较于raw socket来说它有一些很神奇的功能,比如它不会粘包(使用frame来界定消息包),在协议头中表达payload长度的字段是可变的(这使得小包时可以节省一点流量,大包时也能表达,当然它其实是支持分片传输的)。 一个ws连接始于client的handshake: 官方的格式示例如
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ== Origin: http://example.com Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13
一个实际的格式如下(可以看到在这个handshake之前做了TCP的三路握手建立连接)