跳转到内容

LGPL:修订间差异

轻之舟百科,让知识轻装启航
TeodoroSeccombe​(留言 | 贡献)
小 创建页面,内容为“。”
IdleTap-bot​(留言 | 贡献)
由旧格式Infobox转换为新参数格式(label/data),修复空信息框(由IdleTap-bot执行)
 
第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 />

2026年8月11日 (二) 10:21的最新版本

GNU宽通用公共许可证
英文名GNU Lesser General Public License(GNU LGPL)[1]
发布者自由软件基金会(Free Software Foundation)[2]
首次发布1991年(版本2.0)[3]
最新版本版本3(2007年6月29日)[4]
许可证类型Copyleft、自由软件许可证[2]
与GPL兼容性是[5]
网站www.gnu.org/licenses/lgpl-3.0.html

GNU宽通用公共许可证(英语:GNU Lesser General Public License,简称:LGPL)是由自由软件基金会(FSF)公布的自由软件许可证[3][2]。它允许企业与软件开发者使用或集成LGPL授权的软件(即使该软件是私有软件也被允许),同时不会受到Copyleft特性许可证强制开源的限制[3][6]。该许可证常被用于一些(但不是全部)GNU程序库[2]。LGPL最初被称为GNU库通用公共许可证(GNU Library General Public License),后更名为“宽通用公共许可证”(Lesser General Public License)以体现其立场[3][6]。该许可证的出现,是为了在GPL与许可式许可证(如MIT许可证及BSD许可证)之间取得折衷[3][7]。

LGPL最初被称为GNU Library General Public License,于1991年首次发布,为与GPLv2保持一致而采用2.0版的编号[3][6]。许可证的2.1版于1999年在修订后发布,同时更名为GNU Lesser General Public License,以显示FSF认为并不是所有程序库都应当采用该许可证的态度[3][6]。LGPL的第3版于2007年6月29日发布,它以在GPL第3版之上附加应用一系列许可的方式表现[3][4]。

与GPL的差异

[编辑 | 编辑源代码]

LGPL与GNU通用公共许可证(GPL)的主要区别在于Copyleft的“传染性”强度[8]。

  • GPL是“强Copyleft”许可证,要求任何使用、修改或衍生自GPL代码的软件必须以GPL许可证发布,即必须开源[8]。
  • LGPL是“弱Copyleft”许可证。它要求对LGPL代码本身的修改必须以LGPL发布,但对于仅通过链接(link)方式使用LGPL库的软件,不要求其开源[8][3]。这使得商业软件可以通过调用LGPL库的方式使用开源代码,而无需公开自身源代码[8]。

此外,LGPL有一特点:LGPL授权的软件可以被转换为GPL授权(参见Section 3),这一特性对于在GPL程序库或应用程序中直接使用LGPL程序有一定程度的帮助[3][5]。

核心条款

[编辑 | 编辑源代码]

LGPL的核心条款包括[3][6]:

  • 允许修改与再发布:允许用户修改LGPL授权的代码,并将修改后的版本在相同的LGPL许可证下发布。
  • 允许链接:允许私有软件通过动态或静态链接的方式使用LGPL库,而无需开源私有部分。
  • 反锁定条款:要求任何作为私有或非Copyleft软件一部分的LGPL代码都必须能够与修改后的库再次链接,或允许重新安装修改后的库[9]。
  • 转换为GPL:允许将LGPL代码作为GPL许可证下的作品进行分发。

LGPL主要适用于软件函数库(Software Libraries),但亦可使用于独立存在的应用程序[3][5]。比较著名的采用LGPL的项目包括:

参考文献

[编辑 | 编辑源代码]