`
lizhuang
  • 浏览: 904268 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

HTTP,Socket,WebSocket异同

阅读更多
参考文章:
http://abbshr.github.io/2013/11/05/new46.html
http://www.zhihu.com/question/20215561 等
首先,
HTTP WEBSCOKET SCOKET是三个网络协议,http网络协议目前最新版本为1.1 相关的API有HTML5等,使用httprequest httpresponse来收发数据,数据采用应答式,即客户端主动向服务端发送数据请求,服务端返回数据,应答结束,连接结束。当然可以使用keep-alive的应答模式,但是即使在这种模式中也是通过客户端ajax,comet(还没研究)等技术来实现,本质上服务端还是无法主动向客户端发送数据。(而且目前的web server中普遍有timeout的概念如apache2.0为15s 2.2为5s timeout后会断开keep-alive的连接)

socket基于TCP/IP的网络协议,数据以数据包package的形式传递,多用于桌面程序中,比较成熟,应用广泛,基于transport layer数据传递。
数据接收过程中以package的形式传递,接收的时候不保证一次接收到想要的数据长度,需要循环接收知道数据完整,常用的函数:
socket("ip","port")
bind()
send()
recv()
read()
write()等

websocket是html5中提供的api 基本原理是在http协议层上实现了tcp通信(可双向收发信息,和http有本质的不同html5的新东西嘛,不过底层实现的原理还没有研究呢)。
和http的区别在于真正实现了双向收发数据(一个是application layer 一个是 TCP layer),但是是为了解决浏览器和web server通信不能使用tcp来实现而出现了,因此为了兼容在websocket和web server进行handshake的时候使用了http协议(只有这一个地方使用了http协议,之后数据交互使用的是tcp协议),和普通http不同的是协议中发送的数据为:
upgrade : websocket 明确告诉服务器使用升级版本协议websocket如果服务器不支持会返回错误 ,支持则连接创建成功(这个要说明的是websocket的连接需要客户端服务器同时支持否则无法成功连接)
client:
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: ************==
Sec-WebSocket-Version: **
server:
Upgrade:websocket
Connnection: Upgrade
Sec-WebSocket-Accept: ******************
和socket不同的是首先websocket是为了解决browser和web server的数据传输而产生的,因此为了兼容使用了http协议的handshake,其次数据传输使用了frame格式的数据 区别于socket的package数据包的格式,如
下面就是一个Frame:(以bit为单位表示)
  0                   1                   2                   3
  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-------+-+-------------+-------------------------------+
|F|R|R|R| opcode|M| Payload len |    Extended payload length    |
|I|S|S|S|  (4)  |A|     (7)     |             (16/64)           |
|N|V|V|V|       |S|             |   (if payload len==126/127)   |
| |1|2|3|       |K|             |                               |
+-+-+-+-+-------+-+-------------+ - - - - - - - - - - - - - - - +
|     Extended payload length continued, if payload len == 127  |
+ - - - - - - - - - - - - - - - +-------------------------------+
|                               |Masking-key, if MASK set to 1  |
+-------------------------------+-------------------------------+
| Masking-key (continued)       |          Payload Data         |
+-------------------------------- - - - - - - - - - - - - - - - +
:                     Payload Data continued ...                :
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
|                     Payload Data continued ...                |
+---------------------------------------------------------------+


三者都是基于TCP协议的,socket TCP协议 websocket HTTP + TCP协议 HTTP TCP协议(HTTP通信本质上是server开启了一个TCP连接来处理HTTP请求,keep-alive的原理就是开启并保持一个持久了tcp channel来处理多个HTTP请求,非keep-alive则是处理完一个http请求后tcp channel 随之关闭)。
另外,websocket(ws)使用端口80(http) websocket security(wws)443(https)使用HTTP一样的端口。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics