HTTP WEBSOCKET SOCKET三大协议的区别简介(zt)

SOCKET 应该算不上是个协议,应该是应用层与传输层间的一个抽象层,是个编程接口。  

参考文章:

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使用端口80(http) 443(https),使用HTTP一样的端口。

posted on 2014-04-11 12:43  麦兜布熊  阅读(1311)  评论(0)    收藏  举报