Socket 与 WebSocket

HTTP、WebSocket、STOMP、MQTT 协议 要使用HTTP实现双向通讯,传统的方式即进行轮询已达到效果(即每隔一段时间,想服务器发出请求获取最新的数据),常见的轮询方式分为轮询(定时请求)和长轮询(请求后服务器在有数据变化时才响应,客户端在请求快过期前或请求响应后,再次发起请求)。这种传统的模式带来很明显的缺点,即浏览器需要不断的向服务器发出请求,然而 HTTP 请求与响应可能会包含较长的头部,其中真正有效的数据可能只是很小的一部分,所以这样会消耗很多带宽资源。通过TCP套接字,向服务器发送一个文本的请求报文(请求行、请求头、请求数据、空行) 阅读详情

2016-09-15 更新: 加入 PDF 版本网络协议图


去年光棍节的时候,我写过一篇 quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket 。这篇文章介绍了我为何决定在项目中使用 LuaSocket 。

现在想起来,当时对 WebSocket 是很感兴趣的,但由于服务端的限制,最终依然选择了 LuaSocket。我后来对 LuaSocket 进行了封装,使其更好用。

现在,面对一个全新的项目,我自然而然地选择了 WebSocket。

因此,我需要了解下面这些问题:

  1. Socket 和 WebSocket 有哪些区别和联系?
  2. WebSocket 和 HTML5 是什么关系?
  3. 必须在浏览器中才能使用 WebSocket 吗?
  4. WebSocket 能和 Socket 一样传输 raw 数据么?
  5. WebSocket 和 Socket 相比会多耗费流量么?

但是,目前网上全面介绍这两种协议的中文文章并不多,或者说不够全面。我无法找到一篇文章能解决上面的所有问题。因此,我写了本文,把找到的 Socket 和 WebSocket 的相关资料做一个梳理,以方便理解。

本文并不能直接完整回答上面提出的几个问题,但读完本文,要理解上面的那些问题,是很容易的事。

由于能力有限,本文不可能很长。而且,技术细节并非所有人都愿意仔细了解。本文包含了大量的外部链接,跟随这些链接,可以找到足够多的细节,满足你/我的求知欲。


1. 概述

选择了 WebSocket 技术之后,不可避免的,我要将它和其他协议以及技术做一下比较。最常见的,就是需要比较 WebSocket 与 HTTP、Socket 技术的异同。

WebSocket 是为了满足基于 Web 的日益增长的实时通信需求而产生的。在传统的 Web 中,要实现实时通信,通用的方式是采用 HTTP 协议不断发送请求。但这种方式即浪费带宽(HTTP HEAD 是比较大的),又消耗服务器 CPU 占用(没有信息也要接受请求)。(下图来自 WebSocket.org)

Latency comparison between the polling and WebSocket applications

而是用 WebSocket 技术,则会大幅降低上面提到的消耗:(下图来自 websocket.org)

Comparison of the unnecessary network throughput overhead between the polling and the WebSocket applications

关于更详细的描述,尹立的这篇文章讲得非常好:WebSocket(2)–为什么引入WebSocket协议 。

那么,WebSocket 到底与 HTTP 协议到底是一个什么样的关系呢?它和 Socket 又有什么联系?这就要讲到 OSI 模型和 TCP/IP 协议族。

2. OSI 模型与 TCP/IP

以下是 维基百科 中关于OSI 模型的说明:

开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,ISO/IEC 7498-1),简称为OSI模型(OSI model),一种概念模型,由国际标准化组织(ISO)提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。

而 TCP/IP 协议可以看做是对 OSI 模型的一种简化(以下内容来自 维基百科):

它将软件通信过程抽象化为四个抽象层,采取协议堆叠的方式,分别实作出不同通信协议。协议套组下的各种协议,依其功能不同,被分别归属到这四个阶层之中7,常被视为是简化的七层OSI模型。

这里有一张图详细介绍了 TCP/IP 协议族中的各个协议在 OSI模型 中的分布,一图胜千言(下图来自 科来):

TCP/IP 和 OSI 模型

这里是 PDF 版:

下载

TCP/IP 协议和 OSI 模型的内容,在互联网上有很多。我没有必要再次介绍它们。在这里,我们只需要知道,HTTP、WebSocket 等协议都是处于 OSI 模型的最高层: 应用层 。而 IP 协议工作在网络层(第3层),TCP 协议工作在传输层(第4层)。

至于 OSI 模型的各个层次都有什么系统和它们对应,这里有篇很好的文章可以满足大家的求知欲:OSI七层模型详解 。

3. WebSocket、HTTP 与 TCP

从上面的图中可以看出,HTTP、WebSocket 等应用层协议,都是基于 TCP 协议来传输数据的。我们可以把这些高级协议理解成对 TCP 的封装。

既然大家都使用 TCP 协议,那么大家的连接和断开,都要遵循 TCP 协议中的三次握手和四次握手 ,只是在连接之后发送的内容不同,或者是断开的时间不同。

更详细内容可阅读:wireshark抓包图解 TCP三次握手/四次挥手详解

对于 WebSocket 来说,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。

4. Socket 与 WebScoket

Socket 其实并不是一个协议。它工作在 OSI 模型会话层(第5层),是为了方便大家直接使用更底层协议(一般是 TCP 或 UDP )而存在的一个抽象层。

最早的一套 Socket API 是 Berkeley sockets ,采用 C 语言实现。它是 Socket 的事实标准,POSIX sockets 是基于它构建的,多种编程语言都遵循这套 API,在 JAVA、Python 中都能看到这套 API 的影子。

下面摘录一段更容易理解的文字(来自 http和socket之长连接和短连接区别):

Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

Socket是什么

Socket通信过程

主机 A 的应用程序要能和主机 B 的应用程序通信,必须通过 Socket 建立连接,而建立 Socket 连接必须需要底层 TCP/IP 协议来建立 TCP 连接。建立 TCP 连接需要底层 IP 协议来寻址网络中的主机。我们知道网络层使用的 IP 协议可以帮助我们根据 IP 地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过 TCP 或 UPD 的地址也就是端口号来指定。这样就可以通过一个 Socket 实例唯一代表一个主机上的一个应用程序的通信链路了。

而 WebSocket 则不同,它是一个完整的 应用层协议,包含一套标准的 API 。

所以,从使用上来说,WebSocket 更易用,而 Socket 更灵活。

5. HTML5 与 WebSocket

WebSocket API 是 HTML5 标准的一部分, 但这并不代表 WebSocket 一定要用在 HTML 中,或者只能在基于浏览器的应用程序中使用。

实际上,许多语言、框架和服务器都提供了 WebSocket 支持,例如:

MQTT、LCM、Websocket——非ROS环境下的几种通信方式 大家在机器人开发过程中肯定会涉及到进程间或者与web端、客户端的通信,当然,通信双方都在ROS环境下可直接使用ROS的publish和subscribe机制来进行通信,那如果其中一方不在ROS环境下有什么好的实现方式呢? 本文介绍几种之前在开发过程中接触到的通信方式,包括MQTT、LCM和Websocket。前两者使用方式与ROS类似,也是发布/订阅的形式,而Websocket因为有配套的浏览器API,主要应用在web开发领域。 阅读详情

相关推荐

Socket.io 与 WebSocket

背景 工作上需要做一个实时投票系统,因此想到利用 websocket 做数据推送,而后台采用 nodejs 因为需要快速搭建完成该项工作,最终查找到 socket.io 这个 node 库。 而我开发工作一直集中在后台身份验证和前端页面的图表展示,对于 socket.io 本身没有太过关注内部实现,唯一一次关注是在 ios 4.x 系统接收不到 socket.io 的推送是查了一下,后发现 ios...

sorrowkaka的博客 1885

十分钟看懂RabbitMQ

一、什么是RabbitMQ: rabbitmq是一种遵循AMQP协议,由Erlang语言开发的,消息传递的消息队列系统。 二、简单理解  学过websocket的来理解rabbitMQ应该是非常简单的了,websocket是基于服务器和页面之间的通信协议,一次握手,多次通信。 而rabbitMQ就像是服务器之间的socket,一个服务器连上MQ监听,而另一个服务器只要通过MQ发送消息就能被监...

weixin_41674620的博客 1275

JAVA通信socket/websocket

什么是Socket? 什么是WebSocket? java websocket android websocket使用 RabbitMQ Socket,用于描述IP地址和端口,是一个通信链的句柄,在Internet上的主机一遍运行了多个服务软件,同时提供几种服务,每种服务都打开一个Socket,并绑定在一个端口上,不同的端口对应不同的服务。 Socket 连接手机,安卓需设置访问网络权限 端口被占用解决:http://blog.youkuaiyun.com/xiaanming/article/details/

seven的博客 3186

http,websocket和socket详解

一,HTTP 1,概念:http是目前应用最广泛的一个网络传输协议,是属于网络应用层的面向对象的协议. 1.1,HTTP1.1解决TCP3次握手4次挥手耗性能问题: 如果有大量的连接,每次在连接,关闭时都要经历3次握手,4次挥手,这很显然会造成性能低下.因此,HTTP1.1开始,默认采用持久连接,使用了一种叫做keepalive connections...

qq_38859786的博客 2万+

websocket与socket.io比较与分析

大家参与的项目里多少都会有web server与browser需要长连接互联的场景,当然我也是,之前没有进行太多方案的调研(比如深入理解通信协议和通用的一些解决方案),所以websocket就不假思索地直接用了,包括去年写的框架xframe里也是直接嵌入了官方websocket的library来实现的。 两周前遇到个场景,前端大佬提需求说能否支持socket.io,之前写的websocket的se...

xiaojax的博客 7866

3步搞定:java分布式WebSocket与消息队列的奇妙邂逅?

在我们的故事开始之前,先让我们来认识一下消息队列。消息队列是一种应用架构中的模式,它允许系统组件(如应用程序、服务等)异步交换消息。这种模式可以提高系统的响应速度和可扩展性,是实现分布式系统的关键技术之一。

java专栏 2007

webSocket和Socket之间的区别联系

一、webSocket和Socket的概念介绍 1、socket翻译为套接字,socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用以实现进程在网络中通信。 2、WebSocket协议是基于TCP的一种新的网络协议,和http协议一样属于应用层协议,是一种让客户端和服务器之间能进行双向实时通信的技术。 二、webSocket和Socket的区别 1、原理上的区别: Socket是传输控制层协议,WebSocket是应用层协议。 Socket是应用层与TC

忆晨的博客 3万+

ESP32 开发实战:VS Code 头文件波浪线及编译错误的终极解决方案

本文针对ESP32开发者在VS Code中常见的头文件红色波浪线和fatal error编译错误,提供了终极解决方案。通过详细讲解如何配置c_cpp_properties.json文件来修复编辑器智能提示,以及如何修改CMakeLists.txt来修正编译器路径,帮助开发者彻底解决环境配置问题,提升开发效率。

prometheus9mon的博客 294

从Socket到WebSocket

不知道大家在学习网络编程的时候都是怎样的一种方式,我谨以此文章来记录我自己从头开始学习C++网络编程时的经历,中间有许多我自己的一些想法和思考。当然作为一个刚开始学习的新手来说,有些内容也许不那么正确,只是代表了我在写这篇文章时的看法。对错相信看到本篇文章的人也能够通过自己的知识自行判断。

weixin_51803729的博客 1285

PLCopen运动控制避坑指南:单轴功能块常见报错排查(基于SM3_Basic函数库)

本文深入解析PLCopen运动控制中单轴功能块的常见报错问题,基于SM3_Basic函数库提供实用排查指南。从功能块逻辑错误与硬件报错的甄别技巧到高频报错场景的解决方案,帮助工程师快速定位并解决运动控制系统中的稳定性问题,提升工业自动化设备的运行效率。

weixin_33686714的博客 318

关于Arduino中的常用函数

一、I/O函数 二、时间函数 三、数学函数 abs 返回其参数的无符号值 【abs(12)返回12,abs(-12)也返回12】 constrain 限制一个数字以阻止它超出范围。第一个参数是被限制的数字,第二个参数是范围区间的开始,第三个参数是允许的数字范围区间的结尾。 【constrain(8,1,10)返回8,constrain(11,1,10)返回10,constrain(0,1,10)返回1】 map 将一个范围内的数字映射到另一个范围。第一个参数是要映射到数字,第二个和第三个参数是from范围(

TREE的博客 7326

WebSocket和Socket

WebSocket和Socket tags:WebSocket和Socket 引言:好多朋友想知道WebSocket和Socket的联系和区别,下面就是你们想要的 先来一张之前收集的图,我看到这张图真的是笑了,当时还给我朋友门转发了一下,不知道你笑了没有。 联系 看完上面的图应该知道了,他们之间也确实没有什么实质性的联系,当然除了名字有点相同,文章后面有名称的由来可以参考...

vinter_he 1万+

告别龟速计算!用Python的fengwo模块5分钟搞定通达信COST/WINNER函数(附完整代码)

本文介绍如何使用Python的fengwo模块高效复现通达信的COST和WINNER函数,解决量化交易中的计算精度和性能问题。通过C++核心算法和多线程优化,计算速度提升显著,误差低于0.5%,并支持与通达信DLL无缝集成,适用于实盘交易策略开发。

weixin_42533751的博客 600

WebSocket 与 Socket 的区别

WebSocket 与 Socket 的区别 准备:如果不太了解网络的朋友可以先看一下我之前写的文章 需要了解的网络协议 。 想必大家再做即时通讯业务或需要替代轮训的时候,肯定听说过 WebSocket 和 Socket 这两个东西,我们今天就来简单说一下这两者的区别。 WebSocket 是什么 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 使得客户端...

刘国栋的博客 2167

Aurix TC3xx系列MCU DMA模块配置方法(二)

本文主要基于英飞凌Aurix TC3xx系列MCU,通过EB tresos配置工具,介绍DMA驱动模块的配置方法。

m0_38045338的博客 2851

【YOLO系列】YOLOv4详解:模型结构、损失函数、训练方法及代码实现

摘要:YOLOv4在目标检测领域实现了精度与速度的平衡,通过CSPDarknet53骨干网络、SPP+PANet特征融合及CIoU损失函数等创新,在MS COCO数据集达到65.7% AP50,V100显卡实现62FPS实时检测。核心优化包括Mosaic数据增强、自对抗训练和解耦头结构,显著提升小目标检测和遮挡场景鲁棒性。代码实现采用CSP模块和SPP多尺度池化,兼顾计算效率与检测性能,为工业落地提供高效解决方案。(149字)

一碗白开水一 1358

Socket 、WebSocket、Socket.IO详细对比

Socket是一个通用的网络编程接口,用于在网络上实现进程间通信(IPC)。它是操作系统提供的底层 API,支持 TCP、UDP 等协议。Socket 是网络通信的基础,几乎所有网络通信技术(包括 WebSocket)都是基于 Socket 实现的。WebSocket是一种基于 TCP 的应用层协议,提供了全双工通信能力。它是 HTTP 协议的升级版,允许客户端和服务器在建立连接后持续通信。WebSocket 是 HTML5 标准的一部分,主要用于浏览器与服务器之间的实时通信。Socket.IO。

chaixinke的专栏 1580

uniapp - 解决App端报错reportJSException >>>> exception function:createInstanceContext, exception:white sc

uni-app,安卓Android,苹果ios,安卓app端,苹果App端,uniapp苹果安卓app,uniApp报错,reportJSException>>>>exceptionfunction:createInstanceContext,exception:whitescreencausecreateinstanceContextfailed,运行自定义基座时白屏,uniapp项目运行白屏reportJSException,检查没问题依旧报错,第三方库插件,组件,uniapp打包调试

🏆 前端领域优质创作者 1万+

WebSocket 和 Socket 的区别

WebSocket 和 Socket 的区别就像Java和JavaScript,并没有什么太大的关系,但又不能说完全没关系。当我们探讨两件事物的区别和联系时,我们想探讨些什么?对这个问题最直接的解决方法应该是去了解Socket和WebSocket的来源和用法,那么它们的区别和联系就不言自明了。

irainsa的博客 1730

化工设计软件:PDMS二次开发_(7).数据导入与导出技术

在某些复杂场景下,PDMS提供的标准API接口可能无法满足需求。此时,可以通过自定义API接口来实现特定的数据导入与导出功能。自定义设备导入API接口可以处理更复杂的设备数据格式。# 导入必要的库import pdms_api # 假设有一个PDMS API库# 定义自定义设备数据# 自定义设备导入API接口# 调用自定义设备导入API接口# 输出导入成功的消息print("自定义设备数据导入成功")在PDMS二次开发中,数据的导入与导出是关键的技术环节。

kkchenjj的博客 1490

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Socket,ServerSocket,WebSocket

最近在看webSocket,忽然想到以前学的Socket和ServerSocket,那么他们之间有什么不同呢?还有来回忆下Socket,和学习下webSocket 一 区别 首先来说下区别吧, Socket和ServerSocket 指传输层网络接口协议,是基于套接字的服务端和客户端实现。 而WebScoket是应用层协议,是客户端-服务器的异步通信方法,用于双向推送消息。 二

u013123635的博客 4309

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Socket与WebSocket

Socket与WebSocketSocket是什么?[ 中间插入补充 ] TCP/IP协议簇中的TCP UDP IP套接字分类套接字调用流程WebSocket Socket是什么? 套接字(socket)是一个抽象层,建立在传输层和应用层之间。应用程序可通过它发送或接收数据,对其进行像对文件一样的打开、读写和关闭等操作(来自Unix/Linux“一切皆文件”的思想)。套接字允许应用程序将I/O插入...

weixin_42040046的博客 454

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android 面试Socket与WebSocket

网络上的两个程序通过以一个双向通讯的链接来实现数据交换,这是一个双端链路,可以实现android的**跨进程通信,**Socket通常用来实现客户端和服务端的连接,一个Socket由一个IP地址和一个端口号唯一确定。支持TCP/UDP协议栈,是长链接,一旦建立起连接将不会主动断掉,除非网络挂掉。

乐褀的博客 1343

WebSocket与 Socket的区别

Websocket& Socket关于 WebSocket协议连接过程关于 Socket接口(网络编程)简单比较 关于 WebSocket协议 WebSocket是应用层协议, 基于 TCP协议的, 只需完成一次 Http请求, 就能与服务端建立持久性的连接, 进行数据双向传输, 直到关闭请求, 此协议出来之前 Web应用只能通过 ajax轮询或 long poll方式频繁 Http请求, 来获取实时数据, 导致严重浪费资源, 且 Http请求的 Head信息量也多, 并发压力大的情况也无法保证短

Shawn Jeon`s blog 744
上一篇: Tomcat并发数优化,修改service.xml性能调优 增加最大并发连接数
下一篇: lager_error_logger_h dropped ~p messages in the last second that exceeded the limit of ~p messages/s
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值