首页 > 手机 > 配件 > 看完让你彻底搞懂Websocket原理,websocket和http的区别

看完让你彻底搞懂Websocket原理,websocket和http的区别

来源:整理 时间:2022-04-07 19:20:37 编辑:华为40 手机版

WebSocket是什么原理?为什么可以实现持久连接?

WebSocket是什么原理为什么可以实现持久连接

首先需要明白:基于TCP的应用层协议,只要设计者愿意,都是可以实现持久连接的。你问的方式,大概是在和HTTP做比较。HTTPhttp协议是请求应答式的文本协议,协议设计就是Client-Server模式,出发点是服务端为客户端提供资源。http服务端只能监听和响应来自客户端的请求,http客户端只能发起请求接受响应,这个是HTTP协议本身的设计,双向通信不在设计的考虑之内。

关于Http协议,额外说点: HTTP1.0/0.9不支持keep-alive,要完成一次HTTP请求,需要建立一个新的TCP连接,然后发送http请求,待接收响应后关闭连接。 HTTP1.1默认使用keep-alive,一次HTTP请求完成后不会关闭TCP连接,会继续为下一个HTTP请求服务(可以类比数据库连接池和线程池的设计),减小建立和关闭TCP连接的开销(三次握手四次挥手)。

当然闲置超时后也会关闭。并非楼下所说的“把多个HTTP请求合并为一个”。HTTP协议的设计无法实现对TCP通道的分用和复用。因为HTTP协议没有请求的唯一标记(仅仅是URL是不行的,原因大家想)用来从同一TCP通道分离不同的HTTP消息,所以一个完整的HTTP请求在发送请求到响应回来之间是独占一个TCP通道的!是不是觉得HTTP对TCP的利用率太低了?而关于pipeline模式,不管在服务端还是客户端排队,HTTP响应依然要通过进入服务端队列的顺序返回,这样才能和客户端HTTP请求队列用顺序做对应!所以pipeline模式某个请求被服务端因为某些原因阻塞了的情况下,后续请求都会阻塞,会引起很大的问题,实际上很少用。

浏览器或者一般HTTP客户端组件为某一个服务器端点(域名 端口)保留4-6条活跃TCP连接。你可以F12观察浏览器,看看同时是几个请求阻塞了就知道你的浏览器设置的多少。比较大的门户网站,比如京东,首页请求非常多,但是大量都需要排队等TCP空闲。限制客户端的连接数量的出发点主要是性能,否则会占用服务器太多Socket资源(考虑socket预留的读写缓冲区,windows的内核对象或者linux的文件句柄)或者变相地造成DoS攻击。

Tips:HTTP客户端组件一般会提供诸如ConnectionLimit的选项让你控制最大TCP连接数。如果你是桌面客户端,或者请求远程服务,不宜设置过大。如果你是内部服务之间调用,可以根据需求合理设置以增加并发性能。 HTTP2.0针对以上的问题(主要是性能)做了很多改进,这个也会提高很多人在后端不同服务器之间做通信时选择HTTP(我在HTTP2.0出来之前就是自己设计RPC方案)。

详细的HTTP2.0的东西,这里不展开了,详细参考官方文档。HTTP相关知识推荐《HTTP权威指南》以及相关的RFC文档,尽量少去看博客上面支离破碎的小知识,体系化的认知结构对你帮助更大。WebSocketWebSocket的出现,就是为了解决http协议不支持双向通信的缺口。所以WebSocket的握手协议就是使用的HTTP消息来Upgrade。

现代的Web场景,服务端推送的需求非常大,这个发展过程中使用的Ajax轮询,Comet等都只是临时解决方案,从设计上看,只为满足需求,一点都不优雅。Html5规范将WebSocket纳入后,得到了现代几乎所有浏览器的支持,当然IE(10 才支持)仍然是一个巨坑,在乎用户覆盖面的产品依然要通过浏览器是否支持ws来做出降级处理(轮询、长连接)。

websocket协议实现独占一条tcp通道,它负责从tcp流确定消息边界,解析出每个独立的消息包。可进行全双工的双向通信。题主所谓的WebSocket可以实现持久连接,只是的一个服务端WebSocket会话和对应的客户端WebSocket会话在使用一个固定的保持连接的TCP通信而已。一般需要将服务端WebSocket会话和某位用户关联起来(客户单连接后,可以再单独发送凭证验证),实现给某个用户推送消息,只需根据关联找到对应的WebSocket会话调用发送API即可。

应用使用单独实现websocket协议的服务客户端组件,可以更加轻松地实现自定义协议:在websocket的二进制或者文本消息体内或者直接使用websocket的自协议定义机制封装自己定义的协议。 推荐大家如果有些需要自建IM服务器,推送服务器的场合尝试先用WebSocket来实现。负载高(协议头消耗小),协议简洁,几乎所有客户端(减少了大量的工作)都有对应的开源项目可用,同时还是唯一可以在浏览器上用的双向通信协议(flash和silverlight等插件方式除外)。

如果你要用websocket实现请求应答式的子协议,要点是你要设计唯一的请求标志,响应也将请求标志带回来,然后你就可以从客户端的请求队列中查找响应对应的请求将响应交给上层处理!特别注意:关于webcket持久连接,本质上是下层tcp连接的保持,核心问题同样是如何保活。需要考虑Nat失效(基站最突出,一般有效期只有3分钟)或者其它网络原因导致大量半连接存在。

解决方案就是合理的心跳时间,一般我设置为2分50秒的样子。其它不论是否从事网络编程,都应该花时间学习下TCP/IP协议簇方面的知识,着重理解分层原理,各层的功能和为上层提供了哪些功能。就像这个问题,如果不对TCP有所了解,回答的内容就没多大意义了。阅读一个你比较熟悉的语言的的一种协议(比如http)实现项目的源码,帮助应该很大。

和网络IO密切相关的就是线程,要设计高可用的TCP服务器,必须要熟悉多线程。网络IO和多线程是我认为最重要的两个核心知识点。关于协议的设计,你可以多学习其他优秀的基于TCP实现的应用层协议,简单的就有Redis的通信协议,里面有阻塞式的消费者队列,那个就需要一条单独的tcp通道。协议设计是很有意思的一件事情,就是mysql和mongodb的通信协议我也不会放过,去看看,会给自己设计协议带来不少的参考价值。

如果时间允许,有标准的协议最好看看RFC文档,现在Chrome的翻译已经很好了,如果英文不太好,问题也不大。关于TCP/IP相关的书籍《计算机网络:自顶向下方法》和谢希仁的《计算机网络》都是不错的入门书籍。《TCP/IP详解》是经典,虽然出版已久,内容是没过时的。网络应用脱离不了操作系统,所以可以再看看操作系统关于网络IO这一块的设计。

如果是先建立TCP,再进行的HTTP通信,那为何会说TCP是在HTTP报文外面包了一层TCP的信息?

如果是先建立TCP,再进行的HTTP通信,那为何会说TCP是在HTTP报文外面包了一层TCP的信息

这得从网络的OSI七层协议说起。TCP协议属于传输层,工作在第4层。而HTTP协议属于应用层,工作在第7层。所有网络传输最后都必须有第1层物理层来完成,也就是0101的物理电信号。上层数据都是被层层封装,最后再转化为物理信号传输的。1、OSI七层网络模型的来源早在互联网起源的时代,网络通讯并不是统一标准的,而是各家有各家的通讯方法。

而OSI七层模型最早是由Honeywell Information System公司的一个小组完成设计的。他们的目的只是在设计数据库系统通讯时,需要一个结构化的分布式通讯体系结构。于是在1977年六提出了分布式系统体系结构(DSA)。它就是7层模型的主题,1978年OSI专家委员会召开会议,达成了共识,认为这个分层结构能满足开放系统的大多数要求,1979年稍做修改就成了最终版本。

2、OSI七层模型的分层结构在OSI七层模型中,将网络通讯分为应用层、表示层、会话层、传输层、网络层、数据链路层、物理层共7个层次。1-4层属于偏机器侧的下层,5-7层属于偏人类侧的上层。每个层次的功能如下:应用层:它是用户的一个交互接口,通常是采用人类最容易懂的语言展示的。HTTP协议就是我们最常见的应用层协议。

这里通过HTTP报文头对应用过程进行控制,比如,定义HTTP版本、缓存、连接状态、传输加密等等表示层:这里是对应用层的一个很好扩展,它主要是将应用层数据进行适当转换格式,以达到最优的通讯效果。比如:对数据进行压缩以减少网络带宽的压力;对数据进行加密方便安全传输。常用的格式有:JPEG、ASCII、EBCDIC等。

会话层:这里负责控制会话的建立、管理和终止。它依然属于上层应用。一个会话就类似于两台机器的一次沟通。一个会话可以有很多下层连接。传输层:这里主要定义数输数据的协议端口号,以及流控和差错校验。其实也就是为了每个协议不冲突,他们用不同端口来区分不同协议。同时,流控和差错校验是为了保障传输不出错和优先级。TCP和UDP就是工作在这里。

这里是可以理解为对上3层的数据进行多通道传输。比如:我们一次HTTP请求,可能需要获取文字、图片、视频三类资源。文字图片可能就走TCP 80端口,优先级一般,视频则可能走RTSP协议,优先级高。网络层:主要是进行逻辑寻址和不同网络之间的选路。可以理解为网络世界的导航、也可以理解为网络世界的路牌。它可以帮助数据包找到最优的路径去传输。

数据链路层:这里主要是进行硬件寻址和建立逻辑连接,也有差错校验功能。如果把网络层的寻址比喻为找到每个人唯一名字(IP),那这里就是找到名字对应的身份证号码(MAC地址)。MAC地址就是硬件地址,每一个网口都有一个全球唯一MAC地址。物理层:这里最容易理解,就是定义网络线路的电气特性,并控制通讯的建立、传输、断开三种物理状态。

我们常常用到的RJ45网线就是这里定义的。3、计算机网络通讯是如何完成了解了OSI七层模型,我们来看看计算机网络通讯到底如何完成的。假设电脑A要用网页访问网站B。那么网络会如何来通讯呢?当电脑A输入网址敲回车,计算机会先找你配置的DNS服务器,去找它将网址中的域名翻译成IP地址。得到IP地址后开始进行通讯。

①、电脑A处一直在层层封装在应用层:A把“自己想要什么东西”这段信息用HTTP报文进行封装,HTTP报文头写明:自己能希望的HTTP协议、传输缓存等等。可以理解为在封装上贴了一个备注。在表示层:如果需要加密,则在表示层把自己的HTTP信息进行加密。到了会话层:A会对上面这个数据报文贴上会话ID、超时信息等等会话控制的关键信息。

到了传输层:A会对上3层处理好的数据报文进行再次封装。并加上传输层的控制信息,如TCP协议、80端口、传输窗口等等。到了网络层:A会在传输层封装好的基础上,再次封装上IP报文头。加上控制信息主要有:源IP、目的IP、TTL生存时间、校验和之类的。到了数据链路层:它会在IP报文的基础上,再次封装成数据帧。

加上控制信息主要有:物理地址、MTU最大传输单元、校验和等。到了物理层:A把数据帧直接用0101的脉冲电信号发送给对方。②、网络中间传输电脑A出来的电信号不是直接到网站B。而是和A直连的二层交换机。二层交换机网卡收到后,会将脉冲重新合成数据帧。然后对数据帧的物理地址进行查看,如果本交换机内没有该物理地址。

那就转交给网关的三层交换机。三层交换机如果发现数据帧并不是本地的,就需要拆开数据帧查看IP报文头里的IP地址,通过比对自己的路由表,然后找到该发给的下一个路由设备。就这样一跳接一跳,重复着拆包查看地址,然后封包继续传输的动作,直到来到网站B的公网IP。然后由二层交换机查看数据帧的物理地址转交给网站B网口。

③、网站B收到信号就是层层解封装在物理层:B的网口收到电信号后,立即合成数据帧,然后比对MAC地址是否和自己网卡相同,如果相同则继续,不同则丢弃。在数据链路层:B会除了前面比对地址,还会比自己计算校验和和帧控制信息的校验和是否相同,如果相同表示数据无误,则解封装数据帧。如果有误则丢弃。在网络层:B比对IP报文头,IP地址信息和校验信息如果正确则继续解封装IP报文。

不正确则丢弃在传输层:B比对TCP报文控制信息,正确无误则将数据转交给相应应用程序的端口。在会话层:B比对会话层的控制信息,同样需要正确才会将数据转交给表示层。在表示层:如果有加密,这里就进行解密并转交给上层应用。没有则跳过了。在应用层:将收到的HTTP信息传给网站后台程序。(如果是B向A传输资源,A就是可以在浏览器上看到信息了)。

★当B收到A的请求后,B回应A则以相反的过程再走一遍。这个过程看起来很啰嗦很复杂,但其实计算机的电信号处理非常快,我们实际应用感觉不到慢。总结从OSI七层模型来看,TCP只是在传输层进行的控制协议,HTTP是在应用层控制的协议。而计算机要在网络中传输信息,发送方就必须层层往下封装,而接收方则层层往上解封装。

文章TAG:搞懂Websocketwebsockethttp原理

最近更新