• 原文链接:http://zengrong.net/post/2199.htm
  • 1. 概述¶

    选择了 WebSocket 技术之后,不可避免的,我要将它和其他协议以及技术做一下比较。最常见的,就是需要比较 WebSocket 与 HTTP、Socket 技术的异同。

    WebSocket 是为了满足基于 Web 的日益增长的实时通信需求而产生的。在传统的 Web 中,要实现实时通信,通用的方式是采用 HTTP 协议不断发送请求。但这种方式即浪费带宽(HTTP HEAD 是比较大的),又消耗服务器 CPU 占用(没有信息也要接受请求)。(下图来自 WebSocket.org)

    而是用 WebSocket 技术,则会大幅降低上面提到的消耗:(下图来自websocket.org)

    关于更详细的描述,尹立的这篇文章讲得非常好:WebSocket(2)–为什么引入WebSocket协议 。

    那么,WebSocket 到底与 HTTP 协议到底是一个什么样的关系呢?它和 Socket 又有什么联系?这就要讲到 OSI 模型和 TCP/IP 协议族。

    2. OSI 模型与 TCP/IP¶

    以下是 维基百科 中关于OSI 模型的说明:

    开放式系统互联通信参考模型(英语:Open System Interconnection Reference Model,ISO/IEC 7498-1),简称为OSI模型(OSI model),一种概念模型,由国际标准化组织(ISO)提出,一个试图使各种计算机在世界范围内互连为网络的标准框架。

    而 TCP/IP 协议可以看做是对 OSI 模型的一种简化(以下内容来自 维基百科):

    它将软件通信过程抽象化为四个抽象层,采取协议堆叠的方式,分别实作出不同通信协议。协议套组下的各种协议,依其功能不同,被分别归属到这四个阶层之中7,常被视为是简化的七层OSI模型。

    这里有一张图详细介绍了 TCP/IP 协议族中的各个协议在 OSI模型 中的分布,一图胜千言(下图来自 科来):

    这里是 PDF 版:

      科来网络通讯协议图2016版 (585.6 KiB, 14 hits)

    TCP/IP 协议和 OSI 模型的内容,在互联网上有很多。我没有必要再次介绍它们。在这里,我们只需要知道,HTTP、WebSocket 等协议都是处于 OSI 模型的最高层: 应用层 。而 IP 协议工作在网络层(第3层),TCP 协议工作在传输层(第4层)。

    至于 OSI 模型的各个层次都有什么系统和它们对应,这里有篇很好的文章可以满足大家的求知欲:OSI七层模型详解 。

    3. WebSocket、HTTP 与 TCP¶

    从上面的图中可以看出,HTTP、WebSocket 等应用层协议,都是基于 TCP 协议来传输数据的。我们可以把这些高级协议理解成对 TCP 的封装。

    既然大家都使用 TCP 协议,那么大家的连接和断开,都要遵循 TCP 协议中的三次握手和四次握手 ,只是在连接之后发送的内容不同,或者是断开的时间不同。

    更详细内容可阅读:wireshark抓包图解 TCP三次握手/四次挥手详解

    对于 WebSocket 来说,它必须依赖 HTTP 协议进行一次握手 ,握手成功后,数据就直接从 TCP 通道传输,与 HTTP 无关了。

    4. Socket 与 WebScoket¶

    Socket 其实并不是一个协议。它工作在 OSI 模型会话层(第5层),是为了方便大家直接使用更底层协议(一般是 TCP 或 UDP )而存在的一个抽象层。

    最早的一套 Socket API 是 Berkeley sockets ,采用 C 语言实现。它是 Socket 的事实标准,POSIX sockets 是基于它构建的,多种编程语言都遵循这套 API,在 JAVA、Python 中都能看到这套 API 的影子。

    下面摘录一段更容易理解的文字(来自 http和socket之长连接和短连接区别):

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

    主机 A 的应用程序要能和主机 B 的应用程序通信,必须通过 Socket 建立连接,而建立 Socket 连接必须需要底层 TCP/IP 协议来建立 TCP 连接。建立 TCP 连接需要底层 IP 协议来寻址网络中的主机。我们知道网络层使用的 IP 协议可以帮助我们根据 IP 地址来找到目标主机,但是一台主机上可能运行着多个应用程序,如何才能与指定的应用程序通信就要通过 TCP 或 UPD 的地址也就是端口号来指定。这样就可以通过一个 Socket 实例唯一代表一个主机上的一个应用程序的通信链路了。

    而 WebSocket 则不同,它是一个完整的 应用层协议,包含一套标准的 API 。

    所以,从使用上来说,WebSocket 更易用,而 Socket 更灵活。

    5. HTML5 与 WebSocket¶

    WebSocket API 是 HTML5 标准的一部分, 但这并不代表 WebSocket 一定要用在 HTML 中,或者只能在基于浏览器的应用程序中使用。

    实际上,许多语言、框架和服务器都提供了 WebSocket 支持,例如:

    • 基于 C 的 libwebsocket.org
    • 基于 Node.js 的 Socket.io
    • 基于 Python 的 ws4py
    • 基于 C++ 的 WebSocket++
    • Apache 对 WebSocket 的支持: Apache Module mod_proxy_wstunnel
    • Nginx 对 WebSockets 的支持: NGINX as a WebSockets Proxy 、 NGINX Announces Support for WebSocket Protocol 、WebSocket proxying
    • lighttpd 对 WebSocket 的支持:mod_websocket

    关联文章

    1. quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket
    2. 一个LuaSocket封装
    3. 【转】Java socket – 套接字基础
    4. 基于quick-cocos2d-x的LuaSocket范例
    5. HTML5入门指南

一篇 介绍 Socket 和 WebSocket 的很好的帖子相关推荐

  1. Socket.IO介绍:支持WebSocket、用于WEB端的即时通讯的框架

    一.基本介绍 WebSocket是HTML5的一种新通信协议,它实现了浏览器与服务器之间的双向通讯.而Socket.IO是一个完全由JavaScript实现.基于Node.js.支持WebSocket ...

  2. 【小白入门】Socket和webSocket入门 这一篇就够了!用php的Socket自己实现简单webSocket服务器!

     这几天研究了下php实现webSocket的方法,网上查了不少博文,涉及到的知识点不少.但却非常值得学,因为这方面典型的应用场景非常的多,消息推送,聊天室,所有需要长连接的地方都会用到它.     ...

  3. Socket 与 WebSocket

    本文原创版权归 zrong 所有,转载请于篇头位置标明原创作者及出处,以示尊重! 本文标题:Socket 与 WebSocket 本文链接:http://zengrong.net/post/2199. ...

  4. 使用 Nginx 代理 Socket.io/WebSocket 及 负载均衡配置

    2019独角兽企业重金招聘Python工程师标准>>> 转自:http://naux.me/using-nginx-with-socketio/ 0,介绍 Socket.io 一套是 ...

  5. 【socket】socket介绍-socket与http服务通信

    之前几篇文章都是介绍了socket的基础知识,包括socket的TCP/IP协议栈,socket的服务端集中常见的实现模式,还有对于socket在内核中都是如何支持和实现的.这篇文章就讲解socket ...

  6. Http、Socket、WebSocket之间联系与区别

    一.WebSocket和Socket区别 可以把WebSocket想象成HTTP(应用层),HTTP和Socket什么关系,WebSocket和Socket就是什么关系.HTTP 协议有一个缺陷:通信 ...

  7. 负载均衡原理剖析与实践:负载均衡第一篇-介绍篇

    负载均衡第一篇-介绍篇   系列文章索引: 负载均衡第一篇-介绍篇 负载均衡第二篇-负载均衡基础知识普及   前言:相信朋友们对负载均衡应该不陌生了!特别是对搞运维的朋友!可能很多的技术人员认为,负载 ...

  8. 国内首篇介绍JanOS物联网操作系统的文章 - 如何把你的手机主板打造成物联网

    天地会珠海分舵注:如无意外,您现在正在看的将是国内首篇且是唯一一篇介绍炙手可热的物联网的操作系统JanOS的文章!不信你去百度!希望大家能喜欢.但本文只是引言,更多信息请还是访问JanOS的官网:ht ...

  9. zephir-开篇介绍

    zephir-开篇介绍 前言 先在这里感谢各位zephir开源技术提供者 笔者在学习phalcon的过程中了解到,phalcon2.x版本通过了zephir重写,第一感觉是zephir这么牛逼?笔者赶 ...

最新文章

  1. PyTorch 笔记(03)— Tensor 数据类型分类(默认数据类型、CPU tensor、GPU tensor、CPU 和 GPU 之间的转换、数据类型之间转换)
  2. mysql 写入400_MySQL5.7运行CPU达百分之400处理方案
  3. java中的各种流(老师的有道云笔记)
  4. LeetCode Weekly Contest 27
  5. mongodb实现对某列求和SUM
  6. Excel多条件求和 SUMPRODUCT函数用法详解
  7. 网络与IO知识扫盲(六):多路复用器
  8. php artisan快捷命令
  9. JVM虚拟机-Class文件之属性表集合
  10. SpringBoot:ApplicationEvent与ApplicationListener
  11. 接口测试工具--Apipost不同脚本的作用
  12. 小乐乐与二段数(2019哈理工新生赛第20题)
  13. Python中stack(),vstack(),hstack()的用法和区别
  14. python 删除第三方库_python中通过pip安装的第三方库在哪里
  15. vue.js 多页 php,vue-cli创建的项目,配置多页面的实现方法
  16. 太阳直射点纬度计算公式_地理小常识:买房小技巧,房屋朝向、楼层和太阳高度角的关系...
  17. VMware15 Pro激活密钥
  18. Java获取 [a,b] 范围的随机数公式
  19. java tcr,运动入门 通勤健身良伴 2019款 Giant TCR SL2 评测
  20. 防范网络黑产:黑账号威胁互联网业务安全

热门文章

  1. TensorFlow2 大幅提高模型准确率的神奇操作
  2. Python简单实现双色球功能
  3. 9、如何安装 ubuntu 光盘镜像里面的安装包
  4. 撤下杨笠:英特尔丢了市场后,再失“体面”
  5. 从理论到实践,全方位认识DNS(实践篇)
  6. C++Win7杀手病毒
  7. 融云 CDN 播放器 2.0 版本正式上线
  8. 锁仓怎么解_锁仓是什么意思?锁仓后如何解锁?
  9. 百度大脑和腾讯云的OCR图片文字识别接口
  10. Microsoft Windows 8.1 使用记录