Http与WebSocket的区别

Http与WebSocket的区别

  • Http
    • Http原理
    • Http特点
  • WebSocket
    • WebSocket和Http的区别
    • WebSocket和Socket的区别
    • WebSocket客户端请求报文
    • WebSocket服务端响应报文
    • WebSocket传输协议

Http

Http原理

HTTP是基于客户/服务器模式,且面向连接的。典型的HTTP事务处理有如下的过程:
(1)客户与服务器建立连接;
(2)客户向服务器提出请求;
(3)服务器接受请求,并根据请求返回相应的文件作为应答;
(4)客户与服务器关闭连接。

Http特点

被动型,客户端请求->服务端响应。服务端不能主动向客户端发送数据。

WebSocket

WebSocket和Http的区别

  1. WebSocket是一种全双工通信。服务端和客户端都能主动向对方发送数据。只要一次握手成功,后续就可以不断的收发数据(在程序设计中,这种设计叫做回调),客户端也不用一直查询服务器状态等信息,只需要等服务器主动发送数据过来就可以了。
  2. WebSocket比Http具有更好的实时性(不需要客户端通过Http长链接不断轮询处理结果)。
  3. WebSocket需要的资源比Http更少。如果是Http短连接,Http需要不断地和服务端握手,发送数据,服务器收到数据后,需要处理(耗时、耗资源),才能返回数据给客户端。如果是长链接,需要不断轮询,才能得到处理结果。而WebSocket,只需等待服务器处理完成,服务器就会向客户端发送数据,不需要重新握手,协议头等相关的数据也更少(数据传输效率更高)。
  4. 协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。如:ws://example.com:80/some/path
  5. WebSocket兼容Http,支持旧版本的浏览器访问。

WebSocket和Socket的区别

可以把WebSocket想象成HTTP,HTTP和Socket什么关系,WebSocket和Socket就是什么关系。都是基于Socket的上层协议。

WebSocket客户端请求报文

    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

WebSocket报文类似Http报文,所以WebSocket是兼容Http的;
Upgrade:websocket 表明这是WebSocket类型的请求。
Sec-WebSocket-Key是WebSocket客户端发送的一个base64编码的密文,要求服务端返回一个Sec-WebSocket-Accept应答(计算规则参考[rfc6455]部分的Sec-WebSocket-Key说明),否则客户端与服务端握手失败。

WebSocket服务端响应报文

服务端收到客户端的请求报文后,返回的数据个数类似:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

Sec-WebSocket-Accept计算规则如下,其中“258EAFA5-E914-47DA-95CA-
C5AB0DC85B11”是固定的:

base64( SHA1(dGhlIHNhbXBsZSBub25jZQ==258EAFA5-E914-47DA-95CA-
C5AB0DC85B11))

可以用代码计算,也可以用在线网站计算,得到的值都是“s3pPLMBiTxaQ9kYGzzhZRbK+xOo=”
在线网站:在线计算哈希 在线计算Base64

WebSocket传输协议

详见RFC6455 5.2
Http与WebSocket的区别_第1张图片
最少只需要传输两字节,比http传输效率高不少。

FIN,指明Frame是否是一个Message里最后Frame(之前说过一个Message可能又多个Frame组成);1bit,是否为信息的最后一帧
RSV1-3,默认是0 (必须是0),除非有扩展定义了非零值的意义。
Opcode,这个比较重要,有如下取值是被协议定义的
0x00 denotes a continuation frame
0x01 表示一个text frame
0x02 表示一个binary frame
0x03 ~~ 0x07 are reserved for further non-control frames,为将来的非控制消息片段保留测操作码
0x08 表示连接关闭
0x09 表示 ping (心跳检测相关)
0x0a 表示 pong (心跳检测相关)
0x0b ~~ 0x0f are reserved for further control frames,为将来的控制消息片段保留的操作码
Mask,这个是指明“payload data”是否被计算掩码。这个和后面的Masking-key有关,如果设置为1,掩码键必须放在masking-key区域,客户端发送给服务端的所有消息,此位的值都是1;
Payload len,数据的长度,
1-125:7bit表示payload长度
126:后16bit表示payload长度,最大2^16
127:后64bit表示payload长度,最大2^64
Masking-key,0或者4bit,只有当MASK设置为1时才有效。,给一个Websocket中掩码的意义
Payload data,帧真正要发送的数据,可以是任意长度,但尽管理论上帧的大小没有限制,但发送的数据不能太大,否则会导致无法高效利用网络带宽,正如上面所说Websocket提供分片。

你可能感兴趣的:(C/C++,http,websocket,socket)