什么是WebSocket,它与HTTP有何不同?

Posted 网管叨bi叨

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么是WebSocket,它与HTTP有何不同?相关的知识,希望对你有一定的参考价值。

今天翻译一篇关于HTTPWebSocket的文章,同时也是为Go Web编程接下来Socket部分的文章做铺垫。

HTTPWebSocket都是客户端-服务器通信中使用的通信协议。文章用几个例子解释了两者的不同以及分别适用在什么应用场景。有些容易混淆的概念(比如说HTTP长连接)和待补充的概念我用斜体字注解到了文章中。

HTTP协议

HTTP是单向的,客户端发送请求,服务器发送响应。举例来说,当客户端向服务器发送请求时,该请求以HTTPHTTPS的形式发送,在接收到请求后,服务器会将响应发送给客户端。每个请求都与一个对应的响应相关联,在发送响应后客户端与服务器的连接会被关闭。每个HTTPHTTPS请求每次都会新建与服务器的连接,并且在获得响应后,连接将自行终止。
HTTP是在TCP之上运行的无状态协议,TCP是一种面向连接的协议,它使用三向握手方法保证数据包传输的传递并重新传输丢失的数据包。

HTTP可以运行在任何可靠的面向连接的协议(例如TCPSCTP)的上层。当客户端将HTTP请求发送到服务器时,客户端和服务器之间将打开TCP连接,并且在收到响应后,TCP连接将终止,每个HTTP请求都会建立单独的TCP连接到服务器,例如如果客户端向服务器发送10个请求,则将打开10个单独的HTTP连接。并在获得响应后关闭。

理解上面这段关于 HTTP的描述时我觉得还要了解一下HTTP长连接的概念,以及HTTPTCP的关系,简单概括一下就是

  • HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

  • 每个HTTP连接完成后,其对应的TCP连接并不是每次都会关闭。从 HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这个头部字段:Connection:keep-alive

  • 在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如ApachenginxNginx中这个默认时间是 75s)中设定这个时间。实现长连接要客户端和服务端都支持长连接。

  • HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在`IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。

  • HTTP消息信息是用ASCII编码的,每个HTTP请求消息均包含HTTP协议版本(HTTP/1.1HTTP/2),HTTP方法(GET/POST等),HTTP标头(Content-TypeContent-Length),主机信息等。以及包含要传输到服务器的实际消息的正文(请求主体)。HTTP标头的大小从200字节到2KB不等,HTTP标头的常见大小是700-800字节。当Web应用程序在客户端使用更多cookie和其他工具扩展代理的存储功能时,它将减少HTTP标头的荷载。

    WebSocket协议

    WebSocket是双向的,在客户端-服务器通信的场景中使用的全双工协议,与HTTP不同,它以ws://wss://开头。它是一个有状态协议,这意味着客户端和服务器之间的连接将保持活动状态,直到被任何一方(客户端或服务器)终止。在通过客户端和服务器中的任何一方关闭连接之后,连接将从两端终止。

    让我们以客户端-服务器通信为例,每当我们启动客户端和服务器之间的连接时,客户端-服务器进行握手随后创建一个新的连接,该连接将保持活动状态,直到被他们中的任何一方终止。建立连接并保持活动状态后,客户端和服务器将使用相同的连接通道进行通信,直到连接终止。

    新建的连接被称为WebSocket。一旦通信链接建立和连接打开后,消息交换将以双向模式进行,客户端-服务器之间的连接会持续存在。如果其中任何一方(客户端服务器)宕掉或主动关闭连接,则双方均将关闭连接。套接字的工作方式与HTTP的工作方式略有不同,状态代码101表示WebSocket中的交换协议。

    使用WebSocket的场景
  • 即时Web应用程序:即时Web应用程序使用一个Web套接字在客户端显示数据,这些数据由后端服务器连续发送。在WebSocket中,数据被连续推送/传输到已经打开的同一连接中,这就是为什么WebSocket更快并提高了应用程序性能的原因。
    例如在交易网站或比特币交易中,这是最不稳定的事情,它用于显示价格波动,数据被后端服务器使用Web套接字通道连续推送到客户端。

  • 游戏应用程序:在游戏应用程序中,你可能会注意到,服务器会持续接收数据,而不会刷新用户界面。屏幕上的用户界面会自动刷新,而且不需要建立新的连接,因此在WebSocket游戏应用程序中非常有帮助。

  • 聊天应用程序:聊天应用程序仅使用WebSocket建立一次连接,便能在订阅户之间交换,发布和广播消息。它重复使用相同的WebSocket连接,用于发送和接收消息以及一对一的消息传输。

  • 不能使用WebSocket的场景

    如果我们需要通过网络传输的任何实时更新或连续数据流,则可以使用WebSocket。如果我们要获取旧数据,或者只想获取一次数据供应用程序使用,则应该使用HTTP协议,不需要很频繁或仅获取一次的数据可以通过简单的HTTP请求查询,因此在这种情况下最好不要使用WebSocket

    注意:如果仅加载一次数据,则RESTful Web服务足以从服务器获取数据。

    总结
    WEBSOCKETHTTP
    WebSocket是一种双向通信协议,可以通过重用已建立的连接通道将数据从客户端发送到服务器,或者从服务器发送到客户端。连接保持活动状态,直到被客户端或服务器终止。HTTP协议是TCP协议之上的单向协议,TCP是面向连接的传输层协议,我们可以在获得响应HTTP连接关闭后再使用HTTP请求方法来创建连接。
    几乎所有的实时应用程序(如(交易,监视,通知)服务)都使用WebSocket在单个通信通道上接收数据。简单的RESTful应用程序使用无状态的HTTP协议。
    所有经常更新的应用程序都应该使用WebSocket,它比HTTP连接更快。当我们不想在特定时间内保留连接或不重复使用单个连接来传输数据时使用HTTPHTTP连接的速度比WebSocket慢。


    来源:GeeksforGeeks

    原文链接:https://www.geeksforgeeks.org/what-is-web-socket-and-how-it-is-different-from-the-http/


    近期文章推荐

    深入学习用Go编写HTTP服务器

    Go Web编程--深入学习解析HTTP请求

    Go Web 编程--超详细的模板库应用指南

    Go Web编程--使用Go语言创建静态文件服务器

    Go Web编程--SecureCookie实现客户端Session管理



    什么是 PyMySQL,它与 MySQLdb 有何不同?它会影响 Django 部署吗?

    【中文标题】什么是 PyMySQL,它与 MySQLdb 有何不同?它会影响 Django 部署吗?【英文标题】:What is PyMySQL and how does it differ from MySQLdb? Can it affect Django deployment? 【发布时间】:2011-11-05 16:35:24 【问题描述】:

    我刚刚通过使用 PyMySQL 而不是 MySQLdb 解决了我的 Django 1.3 应用程序中的一些问题。我按照本教程了解如何进行切换:http://web-eng-help.blogspot.com/2010/09/install-mysql-5-for-python-26-and.html

    现在我想知道 PyMySQL 到底是什么以及它与 MySQLdb 有何不同。

    我在 localhost 上使用它,然后将其上传到某个主机。

    可以在本地主机上使用 PyMySQL 并托管它们提供的任何东西吗?由于我已将base.py和introspection.py中的“MySQLdb”更改为“PyMySQL”,是否需要在更改这些文件后将其上传到服务器?还是因为是Django的文件,既然Django已经上传到那里了,那没关系吗?

    【问题讨论】:

    pymysqlmysqldb (mysql-python) 包的纯python端口。因此,pymysql 可以安装在任何系统上,无需 C 编译器。安装mysqldb 可能需要编译器,如果您没有编译器,在 Windows 中会产生错误(error: Unable to find vcvarsall.bat)。 如果这个问题不那么广泛,它会更有用。你问了几件事:两个库之间的区别,如何将 PyMySQL 部署到某种共享托管环境(你没有告诉我们任何事情,因此我们无法帮助你),以及更广泛地说,在将 PyMySQL 与 Django 结合使用时需要注意哪些问题。这是三个不同的问题,最好这样问。 问题是关于我是否应该使用 PyMySQL,我有两个担心你会提出多个问题。 【参考方案1】:

    PyMySQL 和 MySQLdb 提供相同的功能 - 它们都是数据库连接器。区别在于 MySQLdb 是 C 扩展而 PyMySQL 是纯 Python 的实现。

    尝试 PyMySQL 有几个原因:

    在某些系统上运行可能更容易 它适用于 PyPy 它可以“绿化”并与 gevent 一起使用

    在 Django 中使用它的正确方法是导入它并告诉它在您的***文件中模拟 MySQLdb,通常是 manage.py。将以下代码放在 manage.py(或启动服务器时调用的任何文件)的最顶部:

    try:
        import pymysql
        pymysql.install_as_MySQLdb()
    except ImportError:
        pass
    

    【讨论】:

    我应该补充一点,使用上述方法,PyMySQL 的官方版本(当前)与 Django 1.4 不兼容。如果你想试试的话,github.com/CMGS/PyMySQL 有一个叉子似乎可以工作。 我还要补充一个原因:支持 Python 3 “绿化”是什么意思? 为什么是 try/except?如果您忘记安装 pymysql,您肯定想要一个明显的错误吗? +1 使用 PyMySQL 的理由它是 MIT 许可证,如果您打算分发商业代码则比 MySQLdbs GPL 许可证更好。【参考方案2】:

    PyMySQL 和 MySQLdb 都是 Python 的数据库连接器,是使 Python 程序与 MySQL 服务器通信的库。

    在部署应用程序时,您通常永远不会上传核心 Django 文件。如果 Django 在您的部署服务器上运行良好,那么您绝对不需要在那里进行任何更改。 DB 驱动程序甚至比 ORM 低一两步,当然,您编写的任何代码都不取决于正在使用的代码。

    【讨论】:

    【参考方案3】:

    你的第一点:

    根据pymysql wiki页面:

    MySQLdb,是一个 C 扩展模块,享有盛誉 很难编译,特别是如果你在 Mac 上。此外, 最终用户需要等待为每个新的二进制文件编译 Python 的发布,MySQLdb 将永远不会在 Jython、IronPython、 或 PyPy(没有 cpyext 或 IronClad 之类的东西)。我们也维护 Python 2 和 Python 3 之间 100% 的兼容性,所以所有的进步 在 2.x 主干上制作的内容将立即在 Python 3 上可用。

    你的第二点:

    如果 django 在您的本地主机上运行良好,那么它应该可以正常运行 你的发展。

    【讨论】:

    是的,但我的意思是,虽然我在上面提到的 django 的两个文件中将 MySQLdb 更改为 pymysql,但它会产生问题吗?或者 django 已经存在于虚拟主机上?或者pymysql有吗?【参考方案4】:

    根据我的经验,我在安装“MySQL-python”(MySQLdb)时遇到了困难。 它让我寻找更多的替代品,所以我找到了 pymysql,它也很容易安装,并且在第一次运行时就像一个魅力。 所以我建议只使用 pymysql 而不是 MySQLdb。

    【讨论】:

    【参考方案5】:

    我从这些主题开始,我只想说一个观察:PyMSQL 需要安装 CPYTHON(可能是为了性能https://pypi.org/project/PyMySQL/#requirements 是可选的),而 Cpyhton 依赖于“C”,我测试了 Cpython,我为 C 的版本安装时也遇到了麻烦......那么两个实现都依赖于'C' [如果你想要性能],对我来说是一样的......如果性能没有问题,也许 PyMySQL 没有 Cpython 很好,不含“C”。也许我们可以从 Python 单独使用 PyMySQL 开始,然后将 Python 切换到 Cpython 以获得性能,这可能是一件好事,我们让所有的东西都在运行,然后我们可以尝试切换到 Cpython,,, 我们需要知道功能差异。为什么在 Django PyMySQL 中为你运行得更好或者给你一些问题的解决方案,什么问题?这也许是改变的重要因素。 MySQLdb 可能直接依赖于“C”,但 PyMSQL 通过 Cpython 间接依赖(在类似性能的情况下),我更喜欢直接依赖而没有跳转限制...问候。

    【讨论】:

    以上是关于什么是WebSocket,它与HTTP有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

    什么是 PyMySQL,它与 MySQLdb 有何不同?它会影响 Django 部署吗?

    websocket与标头connection-keep-alive =million的http有何不同

    什么是 yolo_best.weights 文件?它与 yolo_custom.weights 有何不同

    什么是伪多项式时间?它与多项式时间有何不同?

    return 语句的目的是啥?它与印刷有何不同?

    什么是 HSQLDB(Hyper SQL)以及它与其他数据库有何不同?