websocket 设计

之前没有做web开发,认为web上进行数据传输只依赖http. 后来同事用到websocket, 才知道web上也能用socket. 那为什么出现了websocket?
大家都知道,http是无状态的。一个请求对应一个响应。请求必须由client端发起,如果server端主动向client发送数据怎么办呢?
1. client轮询向serve发送请求,比如每一秒就发送一次请求,查看server端是否有新数据。这样做的问题是什么?因为每发送一次请求,底层tcp需要进行三次握手,就会浪费带宽;同时,频繁的建立很多连接,对server端也会造成压力。针对http 1.0 的这种情况,http1.1进行了改进。有了长连接(persistent connection)的概念。
2. 建立长连接。http 1.1中已经支持长连接了,请参见rfc 2616. 长连接允许在一次连接建立成功后,传输多个数据。比如 在http1.0中需要建立两次或多次连接,http1.1可以将这些数据在一个connection中进行传输,这样就减少了每次都进行三次握手的开销。同时,因为connection是一直保持的,server也可以主动向client发送数据。但是数据一定要是按照http的标准的。http的标准是数据都要有一些header, 所以即使传输一个字节,也都得带着这些header,就会导致在传输过程中,浪费网络带宽。
因此,在这种情况下, websocket就诞生了。websocket主要解决了client和server进行双向通信的问题。那么它的设计时,是如何考虑的?
websocket是基于TCP的协议,它最基本的思想是将数据以frame的单位进行传输,至于数据的意义,则由它的上层定义。它只负责数据传输。
1.安全模型。
因为websocket是用在web上,因此会参考http的安全模型。http是origin-base的安全模型。什么是origin? 其实就是 host + port. 它阻碍未被信任的client的请求。因此websocket也是基于origin的安全模型。
2.寻址操作
由于一台机器,有可能会有好几个端口都在使用websocket,那这台机器收到数据后,应该将数据分发到哪个进程?这就是websocket的寻址。基于ip+port的寻址。这个和TCP的过程有些像。
3. 数据包装
虽然websocket和tcp 的frame比较像,但是它是没有长度限制的。因为毕竟它不需要控制真正的传输。
4.挥手(closing handshake)
它引入了额外的挥手机制,它得保证在现有的代理以及中间设备上都work.

总之,websocket其实什么都没有增加,它只是想在web上可以使用socket.如果大家都写过socket编程和话,就比较容易理解它是什么。它只不过是有了一个接口,别人可以调用 这个接口,来进行数据传输,而websocket只是将接到的数据交给tcp发出去。

具体请参考rfc6455.

你可能感兴趣的:(网络传输)