一、为什么需要 WebSocket?

初次接触 WebSocket 的人,都会问同样的问题:我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处?

答案很简单,因为 HTTP 协议有一个缺陷:通信只能由客户端发起

举例来说,我们想了解今天的天气,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP协议做不到服务器主动向客户端推送信息。

这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用"轮询":每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。

轮询的效率低,非常浪费资源(因为必须不停连接,或者HTTP连接始终打开)。因此,工程师们一直在思考,有没有更好的方法。WebSocket就是这样发明的

WebSocket协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

其他特点包括:

1)建立在 TCP 协议之上,服务器端的实现比较容易。

(2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。

(3)数据格式比较轻量,性能开销小,通信高效。

(4)可以发送文本,也可以发送二进制数据。

(5)没有同源限制,客户端可以与任意服务器通信。

(6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。

websocket协议格式

Browser已经支持http协议,为什么还要开发一种新的WebSocket协议呢?我们知道http协议是一种单向的网络协议,在建立连接后,它只允许Browser/UA(UserAgent)向WebServer发出请求资源后,WebServer才能返回相应的数据。而WebServer不能主动的推送数据给Browser/UA,当初这么设计http协议也是有原因的,假设WebServer能主动的推送数据给Browser/UA,那Browser/UA就太容易受到攻击,一些广告商也会主动的把一些广告信息在不经意间强行的传输给客户端,这不能不说是一个灾难。那么单向的http协议给现在的网站或Web应用程序开发带来了哪些问题呢?

  • 一条连接上只可以发送一个请求

  • 请求只能从客户端开始。客户端不可以接收除了响应以外的指令。

  • 请求 / 响应首部未经过压缩就直接进行传输。首部的信息越多,那么延迟就越大。

  • 发送冗长的首部。每次互相发送相同的首部造成的浪费越多

  • 可以任意选择数据压缩格式。非强制压缩发送

Ajax轮询

ajax(异步的javascript与xml技术)是一种有效利用javascript和dom的操作,以达到局部web页面的提花和加载的异步通信手段。和以前的同步通信相比,他只更新一部分页面,相应中传输饿数据量会因此的减少。

ajax轮询的原理是,让浏览器每隔一段时间就发送一次请求,询问服务器是否有新消息。
而利用ajax实时的从服务器获取内容,有可能导致大量的请求产生。

长轮询

原理和ajax轮询差不多,都是采用轮询的方式,不过采用的是阻塞模型。也就是说,当客户端发起连接后,如果服务器端内容没有更新,将响应至于挂起状态,一直不回复response给客户端,知道有内容更新,再返回响应。

虽然可以做到实时更新,但是为了保留响应,一次连接饿持续时间也变长了。期间,为了维持连接会消费更多的资源。

从上面两种方式中,其实可以看出是再不断的建立http连接,然后等待服务器处理,可以体现出了http的特点:被动性,即:请求只能由客户端发起。服务器端不能主动联系客户端。
不管怎么样,上面这两种都是非常消耗资源的。ajax轮询 需要服务器有很快的处理速度和资源。(速度)长轮询 需要有很高的并发,也就是说同时接待客户的能力。(场地大小)

除了以上这些,HTTP还是一个无状态协议。
通俗的说就是,服务器因为每天要接待太多浏览器了,是个健忘鬼,你一断连接,他就把你的东西全忘光了,把你的东西全丢掉了。你第二次还得再告诉服务器一遍。

WebSocket

WebSocket其实是HTTP协议上的一种补充,他们有交集但并不是全部。

一旦web服务器和客户端建立起websocket协议的通信连接,之后所有的通信都依靠这个专用连接进行。只需要经过一次HTTP请求,就可以做到源源不断的信息传送了。

websocket是基于HTTP协议的,或者说借用了http的协议来完成一部分握手。为了实现websocket通信,在http建立连接后,还需要进行一次“握手”的步骤。

握手 · 请求

GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: http://example.com

为了实现websocket通信,需要用到http的Upgrade首部字段,告知服务器通信协议已发生改变:我要发起的是websocket协议。以达到握手的目的。
Sec-WebSocket-Key字段记录着握手必不可少的键值,用于验证服务器是否支持websocket通信。Sec-WebSocket-Protocol字段记录的是所需要使用的协议。

握手 · 响应

HTTP/1.1 101 Switching Protocols Upgrade: websocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= Sec-WebSocket-Protocol: chat

对于客户端的请求,服务器返回状态码 101 Switching Protocols的响应。
返回Upgrate告诉客户端即将升级的协议是Websocket协议。Sec-WebSocket-Accept字段值是由握手请求中的Sec-WebSocket-Key字段值加密过后生成的。Sec-WebSocket-Protocol 则是表明最总使用的协议。

到这里,http已经完成所有他的工作了,接下来通信时不再使用HTTP的数据帧,而是使用websocket独立的数据帧。

因此,websocket协议具有以下的特点:

  • 推送功能
    支持服务器端向客户端推送功能。服务器可以直接发送数据而不用等待客户端的请求。

  • 减少通信量
    只要建立起websocket连接,就一直保持连接,在此期间可以源源不断的传送消息,直到关闭请求。也就避免了HTTP的非状态性。

  • 减少资源消耗
    那么为什么他会解决服务器上消耗资源的问题呢?其实我们所用的程序是要经过两层代理的,即HTTP协议在Nginx等服务器的解析下,然后再传送给相应的Handler(PHP等)来处理。简单地说,我们有一个非常快速的接线员(Nginx),他负责把问题转交给相应的客服(Handler)。本身接线员基本上速度是足够的,但是每次都卡在客服(Handler)了,老有客服处理速度太慢。导致客服不够。Websocket就解决了这样一个难题,建立后,可以直接跟接线员建立持久连接,有信息的时候客服想办法通知接线员,然后接线员在统一转交给客户。这样就可以解决客服处理速度过慢的问题了。

IT技术分享社区

个人博客网站:https://programmerblog.xyz

文章推荐程序员效率:画流程图常用的工具程序员效率:整理常用的在线笔记软件远程办公:常用的远程协助软件,你都知道吗?51单片机程序下载、ISP及串口基础知识硬件:断路器、接触器、继电器基础知识

websocket传输数据大小限制_WebSocket基础知识笔记相关推荐

  1. websocket传输数据大小限制_websocket设置传输大小

    tomcat中有提到: If the application does not define a MessageHandler.Partial for incoming text messages, ...

  2. websocket传输数据大小限制_websocket 发送字符串数据上限是多少

    匿名用户 1级 2017-06-07 回答 网上很多关于websocket发送数据大于大于0xFFFF(65535)的处理都是一句话"暂不处理"!!!!!所以特写此文. int W ...

  3. Java基础知识笔记-11_2-Swing用户界面组件

    Java基础知识笔记-11_2-Swing用户界面组件 这章教程两个版本,一个语法是非lambda表达式版本,另一个是lambda表达式版本 非lambda表达式版本 1 Java Swing概述 J ...

  4. 6-DoF问题相关基础知识笔记

    6-DoF问题相关基础知识笔记 一.什么是6-DoF,即6个自由度是什么? 二.PnP算法 三.BOP挑战与官方数据集简介 BOP数据集 BOP toolkit BOP挑战的介绍页面 四.相关论文 C ...

  5. b站唐老师人工智能基础知识笔记

    b站唐老师人工智能基础知识笔记 0.机器学习(常用科学计算库的使用)基础定位.目标定位 1.机器学习概述 1.1.人工智能概述 1.2.人工智能发展历程 1.3.人工智能主要分支 1.4.机器学习工作 ...

  6. python详细基础知识笔记

    详细基础知识笔记 注: ·第一章 学习准备 1.1高级语言.机器语言.汇编语言 1.2 汇编.解释 1.3 静态语言.脚本语言 1.4 Python的历史 1.5 Python语言的优点.缺点 1.6 ...

  7. HTML基础知识笔记(0基础入门)

    HTML&CSS基础知识笔记 HTML 一.HTML介绍 二.实体 三.meta标签 四.语义化标签(一) 五.语义化标签(二) 六.语义化标签(三) 七.列表 八.超链接 九.图片标签 十. ...

  8. access2013数据库实验笔记_医学科研实验基础知识笔记(十):甲基化

    往期回顾 医学科研实验基础知识笔记(一):细胞增殖 医学科研实验基础知识笔记(二):细胞凋亡检测 医学科研实验基础知识笔记(三):细胞周期检测 医学科研实验基础知识笔记(四):细胞自噬研究策略 医学科 ...

  9. 二代测序之SNV基础知识笔记总结

    二代测序之SNV基础知识笔记总结 文章目录 二代测序之SNV基础知识笔记总结 SNV基础知识 SNVs Mutation vs. Variant[变异和突变] 不同层次的突变 DNA: 1.编码DNA ...

最新文章

  1. php png jpg,php如何将png转换成jpg-PHP问题
  2. MyEclipse使用总结——在MyEclipse中设置jsp页面为默认utf-8编码
  3. IDEA第一个mybatis程序 mybatis增删查改操作 mybatis的map模糊查询
  4. 使用redis实现5万人同服的“相位技术”
  5. git 解决远程和本地冲突
  6. RandomAccessFile类解析
  7. 编写程序,随机产生20个0到1之间的数,将这20个数写入文本文件中,要求每行5个数
  8. Unity Lighting - Choosing a Color Space 选择色彩空间(四)
  9. UCF101和HMDB51数据集的处理 for Human Action Recognition
  10. 印度人为什么立刀切菜_印度人的刀功有多厉害?看到一刀刮掉的鱼鳞和碎洋葱,我彻底服了...
  11. 安装k8s时,报CA证书加载失败的错误
  12. ubuntu安装软件失败无法安装其他软件的解决办法
  13. 单页应用 多页应用的区别
  14. 如何学习编程(编程如何学习呢)
  15. 【webrtc】web端打开日志及调试
  16. Shell中获取脚本的绝对路径$( cd $( dirname ${BASH_SOURCE[0]} ) pwd)
  17. minecraft服务器搭建教程_我的世界服务器创建教程
  18. JTextField的部分常用使用方法
  19. 爬虫篇-如何下载selenium及其适配谷歌浏览器插件chromedriver
  20. 影响力--经典语句摘录

热门文章

  1. 解决crlf 和 lf不同带来的冲突问题
  2. 「模拟赛20180306」回忆树 memory LCA+KMP+AC自动机+树状数组
  3. Chrome浏览器快速获取静态控件的XPATH
  4. Python数据分析与展示[第二周]
  5. 25款.NET开发工具
  6. MySQL 5.6 主从报错一例
  7. sftp配置导致ssh连接闪断
  8. postgres常用命令
  9. 营口(熊岳)温泉旅游归来!
  10. 【PostgreSQL-9.6.3】函数(3)--日期和时间函数