Socket权威分析(官方分析,少道听途说)

简介: 一、最近有个技术的朋友,每次搞技术讨论都在谈什么WebSocket,然而并没有对它有全面清晰的人数,凡是口口相传的东西都是会有问题的。

一、最近有个技术的朋友,每次搞技术讨论都在谈什么WebSocket,然而并没有对它有全面清晰的人数,凡是口口相传的东西都是会有问题的。
下面就给大家权威分析一下。
二、对一种技术的了解,最好的方式,首选官网,其次百科
官网地址:Socket.IO
官网有详细的具体实现。
官网有句话:
Socket.IO enables real-time bidirectional event-based communication.
It works on every platform, browser or device, focusing equally on reliability and speed.
译:Socket的流,能够基于事件,进行实时双向的通信。
它能够在很多平台工作,浏览器或者客户端,都能够有可靠和快速的表现。
主要有以下几个方面的优点:
1.Real-time analytics(实时数据分析)
Push data to clients that gets represented as real-time counters, charts or logs.
(在给客户端推送数据的时候,能够获得实时的计数、图表和日志信息)
2.Instant messaging and chat(即时通讯和交流)
Socket.IO’s “Hello world” is a chat app in just a few lines of code.
用Socket.IO发送一条消息,只需要几个字节就够了,很快很轻量
3.Binary streaming(二进制流)
Starting in 1.0, it’s possible to send any blob back and forth: image, audio, video.
(从1.0版本开始,支持二进制文件的传递,支持图片、声音和视频的传递)
4.Document collaboration(文件协作)
Allow users to concurrently edit a document and see each other’s changes.
允许用户实时编辑文档,并且给其他人看到文档的修改的地方。
三、看看维基百科是怎么介绍这个的
维基百科:WebSocket
四、一句话描述
WebSocket是一种在单个TCP连接上进行全双工通讯的协议。WebSocket通訊協定於2011年被IETF定為標準RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定為標準。

WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就直接可以建立持久性的连接,并进行双向数据传输。

五、背景
现在,很多网站为了实现推送技术,所用的技术都是轮询。轮询是在特定的的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而HTTP请求可能包含较长的头部,其中真正有效的数据可能只是很小的一部分,显然这样会浪费很多的带宽等资源。

而比较新的技术去做轮询的效果是Comet。这种技术虽然可以双向通信,但依然需要反复发出请求。而且在Comet中,普遍采用的长链接,也会消耗服务器资源。

在这种情况下,HTML5定义了WebSocket协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。

Websocket使用ws或wss的统一资源标志符,类似于HTTPS,其中wss表示在TLS之上的Websocket。如:

ws://example.com/wsapi
wss://secure.example.com/

Websocket使用和 HTTP 相同的 TCP 端口,可以绕过大多数防火墙的限制。默认情况下,Websocket协议使用80端口;运行在TLS之上时,默认使用443端口。

六、优点
较少的控制开销。在连接建立后,服务器和客户端之间交换数据时,用于协议控制的数据包头部相对较小。在不包含扩展的情况下,对于服务器到客户端的内容,此头部大小只有2至10字节(和数据包长度有关);对于客户端到服务器的内容,此头部还需要加上额外的4字节的掩码。相对于HTTP请求每次都要携带完整的头部,此项开销显著减少了。
更强的实时性。由于协议是全双工的,所以服务器可以随时主动给客户端下发数据。相对于HTTP请求需要等待客户端发起请求服务端才能响应,延迟明显更少;即使是和Comet等类似的长轮询比较,其也能在短时间内更多次地传递数据。
保持连接状态。于HTTP不同的是,Websocket需要先建立连接,这就使得其成为一种有状态的协议,之后通信时可以省略部分状态信息。而HTTP请求可能需要在每个请求都携带状态信息(如身份认证等)。
更好的二进制支持。Websocket定义了二进制帧,相对HTTP,可以更轻松地处理二进制内容。
可以支持扩展。Websocket定义了扩展,用户可以扩展协议、实现部分自定义的子协议。如部分浏览器支持压缩等。
更好的压缩效果。相对于HTTP压缩,Websocket在适当的扩展支持下,可以沿用之前内容的上下文,在传递类似的数据时,可以显著地提高压缩率。

七、握手协议
WebSocket 是独立的、建立在 TCP 上的协议。
Websocket 通过 HTTP/1.1 协议的101状态码进行握手。
为了建立Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”(handshaking)。

八、一个握手的例子
一个典型的Websocket握手请求如下:
客户端请求

GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13

服务器回应

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Location: ws://example.com/

字段说明

Connection必须设置Upgrade,表示客户端希望连接升级。
Upgrade字段必须设置Websocket,表示希望升级到Websocket协议。
Sec-WebSocket-Key是随机的字符串,服务器端会用这些数据来构造出一个SHA-1的信息摘要。把“Sec-WebSocket-Key”加上一个特殊字符串“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,然后计算SHA-1摘要,之后进行BASE-64编码,将结果做为“Sec-WebSocket-Accept”头的值,返回给客户端。如此操作,可以尽量避免普通HTTP请求被误认为Websocket协议。
Sec-WebSocket-Version 表示支持的Websocket版本。RFC6455要求使用的版本是13,之前草案的版本均应当弃用。
Origin字段是可选的,通常用来表示在浏览器中发起此Websocket连接所在的页面,类似于Referer。但是,与Referer不同的是,Origin只包含了协议和主机名称。
其他一些定义在HTTP协议中的字段,如Cookie等,也可以在Websocket中使用。

九、目前就到这里了,学习一个技术千万不要道听途说,一定要先去官网,获取第一手的消息。

目录
相关文章
|
7月前
|
弹性计算 负载均衡 监控
记一次socket read导致业务线程阻塞的案例分析
记一次socket read导致业务线程阻塞的案例分析
242 3
|
监控 网络协议 Java
netstat统计的tcp连接数与⁄proc⁄pid⁄fd下socket类型fd数量不一致的分析
新blog地址: http://hengyunabc.github.io/netstat-difference-proc-fd-socket-stat/ 最近,线上一个应用,发现socket数缓慢增长,并且不回收,超过警告线之后,被运维监控自动重启了。
2008 0
|
JSON 网络协议 数据处理
|
缓存 网络协议 Linux
Linux TCP/IP 协议栈之 Socket的实现分析(数据包的接收)
   前面了解过 sk 有一个接收队列,用于存储接  收到的 skb,对于 socket 层面上来讲,数据接收,就是要把数据从这个队列中取出来,交给上层用户态。这里涉及到出队操作,但是,要了解如何出队,就  得了解传输层协议如何入队。
971 0
|
网络协议 Linux
Linux TCP/IP协议栈之Socket的实现分析(socket listen)
sys_listen对面向连接的协议,在调用 bind(2)后,进一步调用 listen(2),让套接字进入监听状态: int listen(int sockfd, int backlog);backlog 表示新建连接请求时,最大的未处理的积压请求数。
1267 0
|
网络协议 Linux
Linux TCP/IP 协议栈之 Socket的实现分析(Connect客户端发起连接请求)
sys_connect对于客户端来说,当创建了一个套接字后,就可以连接它了。                case SYS_CONNECT:                         err = sys_connect(a0, (struct sockaddr __user ...
785 0
|
网络协议 Linux API
Linux TCP/IP协议栈之Socket的实现分析(socket bind)
当创建了一个Socket 套接字后,对于服务器来说,接下来的工作,就是调用 bind(2)为服务器指明本地址、协议端口号,常常可以看到这样的代码:strut sockaddr_in sin;  sin.
869 0
|
网络协议 Linux
Linux TCP/IP协议栈之Socket的实现分析(socket listen)
sys_listen对面向连接的协议,在调用 bind(2)后,进一步调用 listen(2),让套接字进入监听状态: int listen(int sockfd, int backlog);backlog 表示新建连接请求时,最大的未处理的积压请求数。
1318 0
|
网络协议 Linux
Linux TCP/IP协议栈之Socket的实现分析(Accept 接受一个连接)
Tcp栈的三次握手简述进一步的分析,都是以 tcp 协议为例,因为 udp要相对简单得多,分析完 tcp,udp的基本已经被覆盖了。  这里主要是分析 socket,但是因为它将与 tcp/udp传输层交互,所以不可避免地接触到这一层面的代码,这里只是摘取其主要流程的一些代码片段,以更好地分析accept的实现过程。
1651 0
|
网络协议 Linux
Linux TCP/IP 协议栈之 Socket的实现分析(Connect客户端发起连接请求)
sys_connect对于客户端来说,当创建了一个套接字后,就可以连接它了。                case SYS_CONNECT:                         err = sys_connect(a0, (struct sockaddr __user ...
838 0