|
|
| 第1行: |
第1行: |
| {{Infobox
| | {{Infobox |
| | 标题 = [[Web]]Socket | | | title = GNU宽通用公共许可证 |
| | 内容 =
| |
| {{!}}-
| |
| ! 类型
| |
| {{!}} 网络通信协议
| |
| {{!}}-
| |
| ! 标准
| |
| {{!}} RFC 6455(IETF)
| |
| {{!}}-
| |
| ! 首次提出
| |
| {{!}} 2008年
| |
| {{!}}-
| |
| ! 标准化时间
| |
| {{!}} 2011年12月
| |
| {{!}}-
| |
| ! 传输层
| |
| {{!}} [[TCP]]
| |
| {{!}}-
| |
| ! 设计目标
| |
| {{!}} 全双工、低延迟实时通信
| |
| {{!}}-
| |
| ! 相关标准
| |
| {{!}} RFC 7692、RFC 8441、RFC 9220
| |
| }}
| |
|
| |
|
| '''WebSocket'''是一种标准化的网络通信协议,由IETF于2011年12月以RFC 6455正式发布为[[互联网]]标准(STD 34)。<ref name=":0">[https://websocket.org/standards/ WebSocket Standards: RFC 6455, Extensions & Browser Support - WebSocket.org]</ref> 该协议在单个TCP连接上提供全双工通信通道,允许客户端与[[服务器]]之间建立持久连接并进行双向、低延迟的[[数据]]交换。<ref name=":1">[https://piehost.com/websocket/websocket-vs-http-polling WebSocket vs HTTP Polling - PieHost]</ref> 与[[HTTP]]的请求-响应模型不同,WebSocket在初始握手完成后,连接保持打开状态,任何一方均可随时发送消息,无需重复建立连接。<ref name=":2">[https://blog.postman.com/websockets-vs-http-key-differences-explained/ WebSockets vs HTTP: Key Differences Explained - Postman]</ref>
| | | label1 = 英文名 |
| | | data1 = GNU Lesser General Public License(GNU LGPL)<ref name=":1" /> |
|
| |
|
| == 历史 ==
| | | label2 = 发布者 |
| | | data2 = [[自由软件基金会]](Free Software Foundation)<ref name=":2" /> |
|
| |
|
| WebSocket的概念诞生于2008年,由Michael Carter牵头发起技术讨论,旨在解决当时[[浏览器]]端实时通信依赖Comet技术(轮询与长轮询)所带来的效率低下与实现复杂等问题。<ref name=":3">[https://yocharge.com/blog/websockets-real-time-nervous-system-connecting-ev-chargers-in-modern-charging-infrastructure/ WebSockets: Real-Time Nervous System - YoCharge]</ref> 随后,Ian Hickson与Michael Carter合作确定了"WebSocket"这一名称,并将其纳入[[HTML]]5规范草案中。<ref name=":3" /> 协议最初以"TCPConnection"为名,作为基于TCP的套接字API占位方案出现。<ref name=":4">[https://www.cnblogs.com/FreakEmbedded/p/19865128 你不知道的 WebSocket - CSDN]</ref>
| | | label3 = 首次发布 |
| | | data3 = 1991年(版本2.0)<ref name=":0" /> |
|
| |
|
| 2009年,[[Google]] [[Chrome]] 4成为首个完整支持WebSocket协议的浏览器。<ref name=":3" /> 2010年,该协议获得主流浏览器的广泛采纳。2011年12月,IETF正式发布RFC 6455,将WebSocket协议标准化,定义了握手过程、数据帧格式、关闭握手及安全考量等内容。<ref name=":0" /> 此后,WebSocket扩展标准陆续出台:RFC 7692定义了基于deflate算法的逐消息压缩机制;RFC 8441增加了通过HTTP/2引导WebSocket的能力;RFC 9220进一步将其扩展至HTTP/3。<ref name=":0" /> WebSocket API现由WHATWG HTML Living Standard定义,[[全球]]主流浏览器支持率超过99%。<ref name=":0" />
| | | label4 = 最新版本 |
| | | data4 = 版本3(2007年6月29日)<ref name=":4" /> |
|
| |
|
| == 技术特性 ==
| | | label5 = 许可证类型 |
| | | data5 = [[Copyleft]]、[[自由软件许可证]]<ref name=":2" /> |
|
| |
|
| === 握手与连接升级 === | | | label6 = 与GPL兼容性 |
| | | data6 = 是<ref name=":5" /> |
|
| |
|
| WebSocket连接始于一个HTTP升级请求。客户端发送包含Upgrade: websocket及Connection: Upgrade头部的HTTP请求,服务器返回101 Switching Protocols状态码后,TCP连接即从HTTP协议切换至WebSocket协议。<ref name=":5">[https://www.cnblogs.com/imust2008/p/19561979 websocket协议和http协议有何依赖关系 - 博客园]</ref> 握手过程中包含Sec-WebSocket-Key与Sec-WebSocket-Accept字段,用于防止跨协议攻击与缓存投毒。<ref name=":5" /> 此设计使WebSocket能够复用80与443端口,兼容现有HTTP基础设施如防火墙、代理与负载均衡器。<ref name=":1" />
| | | label7 = 网站 |
| | | data7 = [https://www.gnu.org/licenses/lgpl-3.0.html www.gnu.org/licenses/lgpl-3.0.html] |
| | }} |
| | '''GNU宽通用公共许可证'''([[英语]]:GNU Lesser General Public License,简称:'''L[[GPL]]''')是由[[自由软件基金会]](FSF)公布的[[自由软件许可证]]<ref name=":0">[https://zh.wikipedia.org/wiki/LGPL GNU宽通用公共许可证 — 维基百科]</ref><ref name=":2">[https://www.gnu.org/licenses/licenses.html 许可证 — GNU工程]</ref>。它允许企业与[[软件]]开发者使用或集成LGPL授权的软件(即使该软件是私有软件也被允许),同时不会受到[[Copyleft]]特性许可证强制开源的限制<ref name=":0" /><ref name=":3">[https://en.wikipedia.org/wiki/GNU_Lesser_General_Public_Licence GNU Lesser General Public License — Wikipedia]</ref>。该许可证常被用于一些(但不是全部)[[GNU]]程序库<ref name=":2" />。LGPL最初被称为GNU库通用公共许可证(GNU Library General Public License),后更名为“宽通用公共许可证”(Lesser General Public License)以体现其立场<ref name=":0" /><ref name=":3" />。该许可证的出现,是为了在[[GNU通用公共许可证|GPL]]与许可式许可证(如[[MIT许可证]]及[[BSD许可证]])之间取得折衷<ref name=":0" /><ref name=":6">[https://zh.m.wikipedia.org/zh-hant/GNU宽通用公共许可证 GNU較寬鬆通用公眾授權條款 — 维基百科(繁体中文)]</ref>。 |
|
| |
|
| === 数据帧与传输效率 ===
| | == 历史 == |
|
| |
|
| 握手完成后,通信转为轻量级的WebSocket帧格式,而非完整的HTTP消息。<ref name=":1" /> 帧头部开销极小,支持[[文本]](UTF-8)与[[二进制]]数据载荷,并可通过分片机制处理大消息。<ref name=":2" /> 控制帧用于ping、pong及连接关闭操作,使应用层可实现心跳检测与断连感知。<ref name=":1" /> 相比HTTP轮询每次请求均附带完整头部,WebSocket在持续通信场景下显著降低了带宽消耗与协议开销。<ref name=":2" />
| | LGPL最初被称为GNU Library General Public License,于1991年首次发布,为与GPLv2保持一致而采用2.0版的编号<ref name=":0" /><ref name=":3" />。许可证的2.1版于1999年在修订后发布,同时更名为GNU Lesser General Public License,以显示FSF认为并不是所有程序库都应当采用该许可证的态度<ref name=":0" /><ref name=":3" />。LGPL的第3版于2007年6月29日发布,它以在GPL第3版之上附加应用一系列许可的方式表现<ref name=":0" /><ref name=":4">[https://www.gnu.org/licenses/lgpl-3.0.html GNU Lesser General Public License v3.0 — GNU Project]</ref>。 |
|
| |
|
| === 全双工与服务器推送 ===
| | == 与GPL的差异 == |
|
| |
|
| WebSocket的核心优势在于全双工通信能力。连接建立后,客户端与服务器均可独立发送消息,无需等待对方请求。<ref name=":2" /> 服务器可在事件发生的瞬间主动向客户端推送数据,消除了轮询模式下的固有延迟。<ref name=":1" /> 这一特性使WebSocket成为实时应用的基础设施,涵盖即时通讯、在线协作、实时数据仪表盘及多人游戏等场景。<ref name=":6">[https://codelit.io/blog/websocket-vs-polling-vs-sse WebSocket vs Polling vs SSE — Choosing the Right Real-Time Strategy - Codelit]</ref>
| | LGPL与[[GNU通用公共许可证]](GPL)的主要区别在于Copyleft的“传染性”强度<ref name=":7">[https://developer.baidu.com/article/details/3334567 开源软件的许可证大阅兵:理解并选择合适的许可证 — 百度开发者中心]</ref>。 |
|
| |
|
| == 与HTTP轮询的比较 == | | * GPL是“强Copyleft”许可证,要求任何使用、修改或衍生自GPL代码的软件必须以GPL许可证发布,即必须开源<ref name=":7" />。 |
| | * LGPL是“弱Copyleft”许可证。它要求对LGPL代码本身的修改必须以LGPL发布,但对于仅通过链接(link)方式使用LGPL库的软件,不要求其开源<ref name=":7" /><ref name=":0" />。这使得商业软件可以通过调用LGPL库的方式使用开源代码,而无需公开自身源代码<ref name=":7" />。 |
|
| |
|
| 在WebSocket出现之前,浏览器端实时通信主要依赖HTTP轮询(Polling)与长轮询(Long Polling)。<ref name=":1" /> 轮询模式下,客户端以固定间隔重复发送HTTP请求检查更新,即使无新数据也会产生大量冗余请求与带宽浪费。<ref name=":2" /> 长轮询通过保持请求打开直至数据可用略有改善,但仍需反复建立连接,并受代理超时限制。<ref name=":6" />
| | 此外,LGPL有一特点:LGPL授权的软件可以被转换为GPL授权(参见Section 3),这一特性对于在GPL程序库或应用程序中直接使用LGPL程序有一定程度的帮助<ref name=":0" /><ref name=":5">[https://wapbaike.baidu.com/item/GNU宽通用公共许可证 GNU宽通用公共许可证 — 百度百科]</ref>。 |
|
| |
|
| WebSocket通过持久化单一连接解决了上述问题:无需重复TCP握手与[[TLS]]协商,消息仅在数据实际产生时传输,服务器负载与实际使用量而非轮询频率成正比。<ref name=":1" /> 在延迟方面,轮询的平均延迟约为轮询间隔的一半,而WebSocket可将延迟降至网络传播与处理时间决定的亚百毫秒级别。<ref name=":2" /> 在扩展性方面,大规模轮询系统因空请求泛滥而难以承受高并发;WebSocket虽需维护长连接状态,但消息驱动的负载模式使其在同等[[用户]]规模下资源利用更为高效。<ref name=":6" />
| | == 核心条款 == |
|
| |
|
| == 扩展标准 == | | LGPL的核心条款包括<ref name=":0" /><ref name=":3" />: |
|
| |
|
| === 压缩扩展 === | | * 允许修改与再发布:允许[[用户]]修改LGPL授权的代码,并将修改后的版本在相同的LGPL许可证下发布。 |
| | * 允许链接:允许私有软件通过动态或静态链接的方式使用LGPL库,而无需开源私有部分。 |
| | * 反锁定条款:要求任何作为私有或非Copyleft软件一部分的LGPL代码都必须能够与修改后的库再次链接,或允许重新安装修改后的库<ref name=":8">[https://doc.yonyoucloud.com/doc/LGPL.html LGPL — 简介]</ref>。 |
| | * 转换为GPL:允许将LGPL代码作为GPL许可证下的作品进行分发。 |
|
| |
|
| RFC 7692定义了WebSocket的per-message deflate扩展,允许对单个消息应用deflate压缩算法,减少文本类数据的传输体积。<ref name=":0" /> 该扩展在握手阶段通过Sec-WebSocket-Extensions头部协商启用。
| | == 应用 == |
|
| |
|
| === HTTP/2与HTTP/3引导 === | | LGPL主要适用于软件函数库(Software Libraries),但亦可使用于独立存在的应用程序<ref name=":0" /><ref name=":5" />。比较著名的采用LGPL的项目包括: |
|
| |
|
| 传统WebSocket通过HTTP/1.1升级握手建立。RFC 8441引入了通过HTTP/2流引导WebSocket连接的机制,使WebSocket可在HTTP/2多路复用环境中运行。<ref name=":0" /> RFC 9220进一步将该机制扩展至基于QUIC的HTTP/3,为WebSocket在现代化传输协议上的部署提供了标准化路径。<ref name=":0" />
| | * [[Mozilla]](部分组件)<ref name=":0" /><ref name=":5" /> |
| | | * [[OpenOffice.org]]<ref name=":0" /><ref name=":5" /> |
| == 应用领域 ==
| | * [[Qt]](开源版本采用LGPLv3)<ref name=":9">[https://doc.qt.io/qt-6/licensing.html Qt Licensing — Qt Documentation]</ref> |
| | | * [[VLC多媒体播放器]](关键引擎采用LGPL-2.1)<ref name=":10">[https://raw.githubusercontent.com/... 電子報總覽]</ref> |
| WebSocket已成为实时Web应用的基础协议。在金融领域,它被用于股票行情推送与交易平台;在协作[[软件]]中,支持文档协同编辑与光标同步;在物联网与车联网场景中,为设备状态监控与充电基础设施提供低延迟通信通道。<ref name=":3" /> 此外,在线游戏、社交媒体动态流、直播弹幕系统及客户服务聊天窗口等均广泛采用WebSocket实现即时交互。<ref name=":6" />
| |
|
| |
|
| == 参考文献 == | | == 参考文献 == |
|
| |
| <references /> | | <references /> |