文章编号:11732时间:2024-10-01人气:
WebSocket 是一种网络协议,它允许在客户端和服务器之间进行全双工通信。它比HTTP更有效,因为HTTP是一种无状态协议,需要使用轮询或长轮询来实现持续通信。WebSocket是一种有状态协议,它可以在客户端和服务器之间建立持续的连接,从而实现真正的实时通信。
WebSocket 的几个新趋势正在塑造其未来:
以下是一些正在推动 WebSocket 创新的创新:
上篇介绍了HTTP1.1协议的基本内容,这篇文章将继续分析WebSocket协议,然后对这两个进行简单的比较。
WebSocket协议还很年轻,RFC文档相比HTTP的发布时间也很短,它的诞生是为了创建一种「 双向通信 」的协议,来作为HTTP协议的一个替代者。 那么首先看一下它和HTTP(或者HTTP的长连接)的区别。
上一篇中提到WebSocket的目的就是解决网络传输中的双向通信的问题,HTTP1.1默认使用持久连接(persistent connection),在一个TCP连接上也可以传输多个Request/Response消息对,但是HTTP的基本模型还是一个Request对应一个Response。这在双向通信(客户端要向服务器传送数据,同时服务器也需要实时的向客户端传送信息,一个聊天系统就是典型的双向通信)时一般会使用这样几种解决方案:
WebSocket的目的是取代HTTP在双向通信场景下的使用,而且它的实现方式有些也是基于HTTP的(WS的默认端口是 80 和 443 )。 现有的网络环境(客户端、服务器、网络中间人、代理等)对HTTP都有很好的支持,所以这样做可以充分利用现有的HTTP的基础设施,有点向下兼容的意味。
简单来讲,WS协议有两部分组成:握手和数据传输。
出于兼容性的考虑,WS的握手使用HTTP来实现(此文档中提到未来有可能会使用专用的端口和方法来实现握手),客户端的握手消息就是一个「普通的,带有Upgrade头的,HTTP Request消息」。所以这一个小节到内容大部分都来自于RFC2616,这里只是它的一种应用形式,下面是RFC6455文档中给出的一个客户端握手消息示例:
可以看到,前两行跟HTTP的Request的起始行一模一样,而真正在WS的握手过程中起到作用的是下面几个header域。
如果服务器接受了这个请求,可能会发送如下这样的返回信息,这是一个标准的HTTP的Response消息。 101 表示服务器收到了客户端切换协议的请求,并且同意切换到此协议。 RFC2616规定只有切换到的协议「比HTTP1.1更好」的时候才能同意切换。
ws协议默认使用 80 端口,wss协议默认使用 443 端口。
在握手之前,客户端首先要先建立连接,一个客户端对于一个相同的目标地址(通常是域名或者IP地址,不是资源地址)同一时刻只能有一个处于CONNECTING状态(就是正在建立连接)的连接。从建立连接到发送握手消息这个过程大致是这样的:
如果客户端没有处于代理环境中,它就要首先建立一个到达目标地址的直接的TCP连接。
服务端指的是所有参与处理WebSocket消息的基础设施,比如如果某服务器使用Nginx(A)来处理WebSocket,然后把处理后的消息传给响应的服务器(B),那么A和B都是这里要讨论的服务端的范畴。
如果请求是HTTPS,则首先要使用TLS进行握手,如果失败,则关闭连接,如果成功,则之后的数据都通过此通道进行发送。
之后服务端可以进行一些客户端验证步骤(包括对客户端header域的验证),如果需要,则按照RFC2616来进行错误码的返回。
如果一切都成功,则返回成功的Response握手消息。
此握手消息是一个标准的HTTP Response消息,同时它包含了以下几个部分:
一旦这个握手发出去,服务端就认为此WebSocket连接已经建立成功,处于OPEN状态。 它就可以开始发送数据了。
Sec-WebSocket-Version可以被通信双方用来支持更多的协议的扩展,RFC6455中定义的值为 13 ,WebSocket的客户端和服务端可能回自定义更多的版本号来支持更多的功能。 其使用方法如上文所述。
WebSocket中所有发送的数据使用帧的形式发送。 客户端发送的数据帧都要经过掩码处理,服务端发送的所有数据帧都不能经过掩码处理。 否则对方需要发送关闭帧。
一个帧包含一个帧类型的标识码,一个负载长度,和负载。 负载包括扩展内容和应用内容。
帧类型是由一个4位长的叫Opcode的值表示,任何WebSocket的通信方收到一个位置的帧类型,都要以连接失败的方式断开此连接。 RFC6455中定义的帧类型如下所示:
具体的每一项代表什么意思在这里就不做详细的阐述了。
同样作为应用层的协议,WebSocket在现代的软件开发中被越来越多的实践,和HTTP有很多相似的地方,这里将它们简单的做一个纯个人、非权威的比较:
这一篇简单地将WebSocket协议介绍了一遍,篇幅有点长了,数据帧也没有来得及详述。 下篇会继续深扒WebSocket帧传输,另外将通过实例探讨一些WebSocket协议实际使用中的问题。
刨根问底HTTP和WebSocket协议(一) WebSocket和Socket的区别(WebSocket外传) 刨根问底HTTP和WebSocket协议(三)
WebSocket,Socket,Http之间的区别WebSocket协议是HTML5中一种新的通信协议,实现了浏览器与服务器之间的全双工通信。 它通过HTTP请求进行握手,但其后建立的是一条独立的TCP通信通道进行数据传输。 WebSocket的主要目的是为了实现即时通信,替代传统的轮询技术。 相较于HTTP协议,WebSocket协议的非持久化特性意味着每次请求都需要重新建立连接,这在即时通信场景中会带来不必要的流量和服务器资源浪费。 而WebSocket通过建立一个持久的连接,大大减少了不必要的请求,节省了流量和服务器资源。 WebSocket协议是建立在TCP之上的,它和HTTP协议的关系是,握手时通过HTTP传输数据,但建立后不再需要HTTP协议。 Socket则是一种抽象出来的接口,位于应用层和传输控制层之间,它简化了TCP/IP协议族的使用。 WebSocket与Socket的区别在于,Socket是一种接口,而WebSocket是一种协议。 WebSocket是应用层协议,它建立在TCP之上,提供全双工通信,而Socket则是应用层与TCP/IP协议族通信的中间软件抽象层。 WebSocket机制通过握手过程建立连接,然后通过TCP传输数据。 在握手过程中,客户端和服务器通过HTTP协议进行通信,握手成功后,后续数据传输则通过TCP进行。 WebSocket的实现分为客户端和服务端两部分,客户端(通常为浏览器)发出WebSocket连接请求,服务端响应,实现类似TCP握手的动作,从而在浏览器客户端和WebSocket服务端之间形成一条HTTP长连接快速通道。 两者之间后续进行直接的数据互相传送,不再需要发起连接和相应。
WebSocket是一种全双工的通信协议,区别于HTTP的单向通信,它在客户端-服务器间建立持久连接,用于实时数据传输。 HTTP是基于TCP的无状态协议,每次请求都新建连接,而WebSocket通过ws或wss开头的URL建立连接,连接保持活动状态直到主动关闭。 HTTP适用于获取静态或一次性数据,如旧数据或非实时信息,而WebSocket适用于需要双向通信、实时更新的场景,如聊天应用或游戏数据同步。 HTTP是基于每请求新建连接的模式,连接在发送响应后即关闭,每个请求独立于其他请求。 相比之下,WebSocket的长连接使得数据能够持续发送和接收,直到一方主动断开。 HTTP消息包含版本、方法、标头和主体,标头大小有限,不适合频繁的实时通信。 WebSocket则通过101状态码表示连接已转换为WebSocket协议,允许高效的双向数据交换。 在选择使用HTTP还是WebSocket时,关键在于是否需要实时、双向的数据流。 如果只需要一次性或非实时数据,HTTP是更合适的选择,而当实时交互或持续更新是需求时,WebSocket则成为更好的选择。
WebSocket是HTML5出的东西(协议),也就是说HTTP协议没有变化,或者说没关系,但HTTP是不支持持久连接的(长连接,循环连接的不算)
首先HTTP有 1.1 和 1.0 之说,也就是所谓的 keep-alive,把多个HTTP请求合并为一个,但是 Websocket 其实是一个新协议,跟HTTP协议基本没有关系,只是为了兼容现有浏览器的握手规范而已,也就是说它是HTTP协议上的一种补充
他们有交集,但是并不是全部。
另外Html5是指的一系列新的API,或者说新规范,新技术。 Http协议本身只有1.0和1.1,而且跟Html本身没有直接关系。 。 通俗来说,你可以用HTTP协议传输非Html数据,就是这样=。 =
再简单来说,层级不一样。
首先,Websocket是一个持久化的协议,相对于HTTP这种非持久的协议来说。 简单的举个例子吧,用目前应用比较广泛的PHP生命周期来解释。
HTTP的生命周期通过 Request 来界定,也就是一个 Request 一个 Response ,那么在 HTTP1.0 中,这次HTTP请求就结束了。
在HTTP1.1中进行了改进,使得有一个keep-alive,也就是说,在一个HTTP连接中,可以发送多个Request,接收多个Response。 但是请记住 Request = Response , 在HTTP中永远是这样,也就是说一个request只能有一个response。 而且这个response也是被动的,不能主动发起。
教练,你BB了这么多,跟Websocket有什么关系呢? 好吧,我正准备说Websocket呢。。
首先Websocket是基于HTTP协议的,或者说借用了HTTP的协议来完成一部分握手。
首先我们来看个典型的 Websocket 握手(借用Wikipedia的。 。 )
熟悉HTTP的童鞋可能发现了,这段类似HTTP协议的握手请求中,多了几个东西。 我会顺便讲解下作用。
这个就是Websocket的核心了,告诉 Apache 、 Nginx 等服务器:注意啦,我发起的是Websocket协议,快点帮我找到对应的助理处理~不是那个老土的HTTP。
首先, Sec-WebSocket-Key 是一个 Base64 encode 的值,这个是浏览器随机生成的,告诉服务器:泥煤,不要忽悠窝,我要验证尼是不是真的是Websocket助理。
然后, Sec_WebSocket-Protocol 是一个用户定义的字符串,用来区分同URL下,不同的服务所需要的协议。简单理解:今晚我要服务A,别搞错啦~
最后, Sec-WebSocket-Version 是告诉服务器所使用的 Websocket Draft(协议版本),在最初的时候,Websocket协议还在 Draft 阶段,各种奇奇怪怪的协议都有,而且还有很多期奇奇怪怪不同的东西,什么Firefox和Chrome用的不是一个版本之类的,当初Websocket协议太多可是一个大难题。。不过现在还好,已经定下来啦 大家都使用的一个东西 脱水: 服务员,我要的是13岁的噢→_→
然后服务器会返回下列东西,表示已经接受到请求, 成功建立Websocket啦!
这里开始就是HTTP最后负责的区域了,告诉客户,我已经成功切换协议啦~
Upgrade: websocket Connection: Upgrade 依然是固定的,告诉客户端即将升级的是 Websocket 协议,而不是mozillasocket,lurnarsocket或者shitsocket。
然后, Sec-WebSocket-Accept 这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key 。 服务器:好啦好啦,知道啦,给你看我的ID CARD来证明行了吧。 。
后面的, Sec-WebSocket-Protocol 则是表示最终使用的协议。
至此,HTTP已经完成它所有工作了,接下来就是完全按照Websocket协议进行了。 具体的协议就不在这阐述了。
——————技术解析部分完毕——————
你TMD又BBB了这么久,那到底Websocket有什么鬼用, http long poll ,或者ajax轮询 不都可以实现实时信息传递么。
好好好,年轻人,那我们来讲一讲Websocket有什么用。来给你吃点胡(苏)萝(丹)卜(红)
在讲Websocket之前,我就顺带着讲下 long poll 和 ajax轮询 的原理。
ajax轮询
ajax轮询的原理非常简单,让浏览器隔个几秒就发送一次请求,询问服务器是否有新信息。
场景再现:
long poll 其实原理跟 ajax轮询 差不多,都是采用轮询的方式,不过采取的是阻塞模型(一直打电话,没收到就不挂电话),也就是说,客户端发起连接后,如果没消息,就一直不返回Response给客户端。 直到有消息才返回,返回完之后,客户端再次建立连接,周而复始。
场景再现:
从上面可以看出其实这两种方式,都是在不断地建立HTTP连接,然后等待服务端处理,可以体现HTTP协议的另外一个特点,被动性。
何为被动性呢,其实就是,服务端不能主动联系客户端,只能有客户端发起。
简单地说就是,服务器是一个很懒的冰箱(这是个梗)(不会、不能主动发起连接),但是上司有命令,如果有客户来,不管多么累都要好好接待。
说完这个,我们再来说一说上面的缺陷(原谅我废话这么多吧OAQ)
从上面很容易看出来,不管怎么样,上面这两种都是非常消耗资源的。
ajax轮询 需要服务器有很快的处理速度和资源。 (速度)long poll 需要有很高的并发,也就是说同时接待客户的能力。 (场地大小)
所以 ajax轮询 和 long poll 都有可能发生这种情况。
言归正传,我们来说Websocket吧
通过上面这个例子,我们可以看出,这两种方式都不是最好的方式,需要很多资源。
一种需要更快的速度,一种需要更多的’电话’。 这两种都会导致’电话’的需求越来越高。
哦对了,忘记说了HTTP还是一个状态协议。
通俗的说就是,服务器因为每天要接待太多客户了,是个健忘鬼,你一挂电话,他就把你的东西全忘光了,把你的东西全丢掉了。 你第二次还得再告诉服务器一遍。
所以在这种情况下出现了,Websocket出现了。 他解决了HTTP的这几个难题。 首先,被动性,当服务器完成协议升级后(HTTP->Websocket),服务端就可以主动推送信息给客户端啦。 所以上面的情景可以做如下修改。
就变成了这样,只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。(在程序设计中,这种设计叫做回调,即:你有信息了再来通知我,而不是我傻乎乎的每次跑来问你 )
这样的协议解决了上面同步有延迟,而且还非常消耗资源的这种情况。那么为什么他会解决服务器上消耗资源的问题呢?
其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(PHP等)来处理。 简单地说,我们有一个非常快速的 接线员(Nginx) ,他负责把问题转交给相应的 客服(Handler) 。
本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢。 ,导致客服不够。 Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。
这样就可以解决客服处理速度过慢的问题了。
同时,在传统的方式上,要不断的建立,关闭HTTP协议,由于HTTP是非状态性的,每次都要重新传输 identity info (鉴别信息),来告诉服务端你是谁。
虽然接线员很快速,但是每次都要听这么一堆,效率也会有所下降的,同时还得不断把这些信息转交给客服,不但浪费客服的处理时间,而且还会在网路传输中消耗过多的流量/时间。
但是Websocket只需要一次HTTP握手,所以说整个通讯过程是建立在一次连接/状态中,也就避免了HTTP的非状态性,服务端会一直知道你的信息,直到你关闭请求,这样就解决了接线员要反复解析HTTP协议,还要查看identity info的信息。
同时由客户主动询问,转换为服务器(推送)有信息的时候就发送(当然客户端还是等主动发送信息过来的。 。 ),没有信息的时候就交给接线员(Nginx),不需要占用本身速度就慢的客服(Handler)了
至于怎么在不支持Websocket的客户端上使用Websocket。 。 答案是: 不能
但是可以通过上面说的 long poll 和 ajax 轮询 来 模拟出类似的效果
HTTP、HTTPS、TCP、UDP、Websocket是互联网中重要的通信协议,它们在不同场景中发挥着关键作用,确保数据在网络中安全、可靠地传输。 下面,我们将逐一介绍这些协议的概念、通信流程、异同点及应用领域。
HTTP(超文本传输协议)
HTTP是用于通过互联网传输数据(尤其是网页)的基本协议。 它运行在应用层,使用IP协议在客户端(如网络浏览器)和服务器(如网络服务器)之间传输数据。 HTTP请求包括方法(如GET、post)、资源位置的URI以及可选标头和请求主体;响应则包括状态代码、标头和响应主体。 HTTP是无状态的,每次请求被视为独立事件,服务器不保存客户端的请求历史。
HTTPS(安全超文本传输协议)
HTTPS是HTTP的加密版本,用于保护数据的隐私和安全。 当客户端通过HTTPS连接到服务器时,双方使用SSL/TLS加密建立安全会话,保护传输数据不被第三方拦截或修改。 HTTPS请求和响应与HTTP类似,但包括加密。 安全性是HTTPS的关键优势,使其广泛用于需要安全交易的场景,如在线银行和购物。
TCP(传输控制协议)
TCP是一种面向连接的传输层协议,确保可靠有序的数据传输。 它在客户端和服务器之间建立虚拟连接,实现数据的可靠传输。 TCP提供流量控制和拥塞控制,确保传输速度不会超过接收速度,同时将数据分割成更小的段,确保数据以原始顺序到达。 TCP广泛应用于需要可靠传输的应用,如电子邮件、文件传输和Web浏览。
UDP(用户数据报协议)
UDP是一种无连接的传输层协议,提供快速、低延迟的数据传输。 与TCP不同,UDP不建立虚拟连接,每个数据包独立发送,不保证交付或排序。 UDP适用于需要高效传输但允许数据丢失的应用,如视频流、在线游戏和VoIP。
Websocket是一种全双工通信协议,通过单个长连接在客户端和服务器之间实现实时双向通信,解决了传统HTTP请求-响应模型的局限性。 它能够在客户端和服务器之间提供实时更新,无需频繁建立和断开连接,适用于需要实时交互的应用,如在线游戏、股票行情和聊天。
这些协议在互联网中扮演着不同的角色。 HTTP和HTTPS确保数据传输的安全性,TCP提供可靠的数据传输,UDP实现快速数据传输,而Websocket支持实时双向通信。 选择正确的协议对于确保应用程序高效、可靠地运行至关重要。
内容声明:
1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违法信息,如您发现违法内容,请联系我们进行举报处理!
4、本文地址:http://www.jujiwang.com/article/1faf284d3ca2ca077fd7.html,复制请保留版权链接!
在C语言中,字符串通常表示为字符数组,虽然这种表示形式简单实用,但它也存在一些局限性,例如,没有内置方法可以轻松地操纵字符串,例如连接、比较或搜索,字符串数组容易出现缓冲区溢出,这可能会导致安全问题,C,通过提供内置的std,string类来解决这些问题,该类为字符串操纵提供了一组强大的方法,同时还确保内存安全,使用std,st...。
技术教程 2024-09-28 22:43:03
g是一个缩写词,在编程中有多种含义,语法g通常与以下语法一起使用,g,...,含义g的含义包括,组,g经常用于表示一组项目,例如变量、函数或对象,全局,g可以表示全局作用域,这表示变量、函数或对象可以在程序的任何地方访问,生成器,g可以表示一个生成器函数,它会按需生成一个序列的元素,贪婪,g可以表示一个正则表达式模式修饰符,它将贪婪地...。
本站公告 2024-09-28 14:50:01
DWF,设计网络格式,文件是用于共享和查看设计模型的一种流行格式,这些文件有时可能会损坏,导致无法访问数据,以下是如何修复损坏的DWF文件的指南,使用AutodeskDWFRepair工具Autodesk提供了DWFRepair工具,专门用于修复损坏的DWF文件,该工具可以修复文件结构和数据损坏,以下是使用该工具的步骤,下载Autod...。
最新资讯 2024-09-28 01:57:39
简介图例是数据可视化中的重要元素,它提供了有关图表中不同线条、标记或区域含义的信息,在MATLAB中,图例由`legend`函数创建,本文将详细介绍MATLAB图例的功能,并提供一些使用提示和示例,创建图例要创建图例,请使用以下语法,```legend,...,```参数可以是字符串数组、线条句柄或两者结合,字符串数组指定图例项的标...。
互联网资讯 2024-09-26 05:02:57
引言在竞争激烈的数字环境中,提升网站流量至关重要,牛腩,一种强大的数字营销策略,可以有效提高您的在线可见度,带来更多的潜在客户和业务机会,本文将探讨如何使用牛腩来提升网站流量,并提供具体的策略和技巧,什么是牛腩,牛腩,SEO,是搜索引擎优化的一种,旨在提高网站在搜索引擎结果页面,SERP,中的排名,通过优化网站内容、结构和反向链接,牛...。
本站公告 2024-09-25 17:03:01
在线学习平台已经变得越来越普及,因为它们提供了灵活性、经济实惠和广泛的课程选择,但是,对于网上有这么多课程可供选择,有时很难知道从哪里开始,这就是为什么根据你的个人目标和兴趣量身定制的在线学习路径如此有用的原因,你的个人目标在你开始寻找在线课程之前,你需要知道你的个人目标是什么,你想提高你的技能吗,学习新东西吗,还是改变你的职业生涯,...。
互联网资讯 2024-09-15 22:58:20
在互联网高速发展的今天,网络赚钱已经成为许多人谋生的手段,卡盟作为一种常见的网络赚钱方式,为人们提供了低成本创业的机会,本文将提供一份网络赚钱的终极指南,介绍10个卡盟源码,并使用ahrefs工具对其进行分析,帮助你事半功倍地打造自己的卡盟网站,卡盟简介卡盟,全称卡密联盟,是一种电子商务平台,主要销售游戏点卡、Q币、话费充值等虚拟商品...。
本站公告 2024-09-15 07:47:24
什么是正则表达式,正则表达式是一种文本模式匹配语言,用于验证文本字符串是否符合特定语法结构,它提供了一种简洁而强大的方法来轻松验证各种数据格式,正则表达式验证器的优势使用正则表达式验证器验证数据具有以下优势,提高数据准确性,通过验证数据符合预期的模式,正则表达式验证器可以帮助确保数据的准确性和一致性,简化数据处理,正则表达式验证器可以...。
本站公告 2024-09-15 02:42:27
器,编写和编辑代码的程序,集成开发环境,IDE,提供高级功能,例如自动完成、调试和版本控制,在线代码编辑器,无需安装或下载即可在浏览器中编写和运行代码,结论掌握编程基础知识需要时间、努力和奉献精神,通过遵循本指南中概述的步骤,初学者可以设定实现目标所需的基础,记住,编程是一个持续的学习过程,随着技术的不断演进,保持好奇心和探索新概念...。
最新资讯 2024-09-13 09:29:38
引言在JavaScript中,small函数是一个鲜为人知但有用的函数,它可以将数字转换为安全字符串,这对于处理用户输入、防止XSS攻击以及确保数据的完整性非常有用,small函数的语法small函数的语法如下,number.small,其中number是要转换为字符串的数字,small函数的工作原理small函数通过将数字转换为3...。
本站公告 2024-09-13 01:02:20
Windows网络编程正在见证激动人心的变革,而Windows11带来了全新的创新和最佳实践,在文章中,我们将深入探讨Windows网络编程的未来,重点关注创新的技术和最佳实践,这些技术和实践将塑造未来几年应用程序的设计和开发,创新技术异步编程模型,APM,APM使得应用程序能够在不阻塞主线程的情况下处理网络I,O操作,从而提高应用...。
最新资讯 2024-09-10 04:38:30
引言电子商务已经成为现代商业中不可或缺的一部分,越来越多的企业正在创建自己的电子商务网站以触及更广泛的客户群并增加销量,创建一个成功的电子商务网站并不容易,在网站设计、开发和营销方面需要大量的考虑和努力,在本文中,我们将深入研究成功电子商务网站背后的秘密,我们将探索组成电子商务网站源码的关键元素,并讨论这些元素如何在网站的成功中发挥作...。
互联网资讯 2024-09-06 01:11:46