为什么WebSocket“握手后”可以与HTTP共享80端口?

2023-11-21

我认为:

  • 端口指定服务器上的程序。
  • 当我们说to share a port,实际上意味着to have the requests processed by the same program listening on that port.

WebSocket 握手resemblesHTTP 格式,所以can可以被处理 HTTP 协议的服务器程序理解。所以发送握手请求就可以了port 80.

But after the handshake,WebSocket数据格式和HTTP格式完全不同,怎么还能发送到80端口呢?例如通过如下 URL:

ws://somehost:80/chat

结果如何?

我猜:

HTTP 程序是否看到端口 80 上的传入请求cannot be handled as HTTP,然后将其传递给WebSocket程序进行处理。如果是这样,如果有其他协议想要共享端口 80,比如 WebSocket2,如果没有办法识别正在使用的协议,HTTP 程序如何知道要传递到哪个协议。

ADD 1

基于jfriend00回复了,我画下图:

所以WebSocket和HTTP流量在同一个浏览器中实际上是通过different套接字连接。尽管它们都是通过连接到服务器的端口 80 开始的。

我想如果这个词WebSocket不包含socket在其中,会更容易理解它只是 TCP 协议之上的另一个应用程序级协议。

enter image description here

ADD 2

我根据以下内容将上图细化为下图jfriend00的进一步评论。 我想展示的是如何WebSocket通信和HTTP通信到同一台服务器coexist在浏览器中。

enter image description here

ADD 3

读完这个帖子后,我记得当服务器接受连接时,服务器端口不会改变:当服务器接受 TCP 连接时端口是否会更改?

所以图应该是这样的:

HTTP 的 TCP 连接和 WebSocket 的 TCP 连接应该使用不同的client ports.

enter image description here


当服务器侦听给定端口时,它正在侦听传入连接。当新的传入连接到达时,它会获得自己的套接字来运行。该套接字提供两个端点之间的连接。从那时起,该套接字完全独立于可能连接的所有其他套接字运行。

因此,一个传入的 http 请求可以指定“升级”标头并升级到 webSocket,然后两端都同意从此开始使用 webSocket 协议。同时,没有该升级标头的其他传入 http 请求仅被视为普通 http 请求。

如果您不太了解 webSocket 协议的工作原理,您可以全面了解它的连接方式here.

以下是主要步骤:

  1. 请求 webSocket 连接的客户端通过端口 80 向服务器发送 HTTP 请求。
  2. 该 HTTP 请求是一个完全合法的 HTTP 请求,但它包含一个标头Upgrade: websocket.
  3. 如果服务器支持 webSocket 协议,那么它会使用合法的 HTTP 响应进行响应,其中包含 101 状态代码,其中包含标头Connection: Upgrade.
  4. 此时,双方都将协议切换到 webSocket 协议,并且该套接字上的所有未来通信都使用 webSocket 帧的数据格式完成。

任何其他不包含以下内容的传入 HTTP 请求upgrade请求标头被视为正常的 HTTP 请求。

HTTP程序是否看到端口80上传入的请求不能 作为HTTP处理,然后将其传递给WebSocket程序 处理它。

不,第一个请求是合法的 HTTP 请求(只是其中有一个特殊的标头),并且发送回的响应是合法的 HTTP 响应。但是,在该响应之后,双方都将协议切换到 webSocket。因此,自定义标头用于告诉 Web 服务器此传入 HTTP 请求是建立 webSocket 连接的第一步。

如果是这样,如果有其他协议想要共享端口怎么办 80、比如说WebSocket2,HTTP程序怎么知道要传递哪个协议 如果没有办法识别正在使用的协议。

This upgrade只需指定不同的协议名称,该机制也可用于支持其他协议Upgrade: someOtherProtocol虽然我不知道有任何其他已经标准化的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么WebSocket“握手后”可以与HTTP共享80端口? 的相关文章

  • 在导航栏下方添加背景图片

    我想在导航栏下方添加背景图像 具有完整窗口大小的宽度 它不应覆盖整个页面长度 而是从导航栏菜单下方开始 一直向下直到特定的指定高度 但宽度是满的 我参考了以下内容 但仍然没有结果 在 Twitter Bootstrap 中的导航栏下方启动背
  • 在 Javascript 中动态添加事件处理程序

    我在使用 Javascript 时遇到了一个奇怪的问题 我得到的是一个特定格式的字符串 我将尝试用它创建一个表 该表每行只有一个单元格 字符串的格式为 每个单元格 行 需要显示内容 将传递给的参数onmouseover当用户将鼠标移动到显示
  • 使用 javascript 将 html 文本渲染为位图,无需服务器端代码

    我需要使用 javascript 代码来转换 html 中的文章 帖子 以便最终用户以位图的形式查看 有没有办法在没有服务器端代码的情况下做到这一点 example p testing text here p 您可以使用例如html2can
  • 通过 Javascript 将图像切割成碎片

    我正在创建一个简单的拼图游戏 为了做到这一点 我需要将我正在使用的图片切成 20 块 Javascript 有没有办法将一张图片切成 20 个相等的部分 并将它们保存为网页中的 20 个不同的对象 或者我只需要进入 Photoshop 自己
  • 使用php表单更改href链接

    我正在制作一个带有搜索栏的网站 我想让搜索栏在 搜索 并显示结果后具有交互性 所以我希望 href 根据正在使用的 Id 进行更改 例如 有人搜索 Pinecones 如果它在数据库中 它将有一个 ID 在本例中是 4 一旦他们搜索它 它就
  • 显示表中的记录

    我的第一个 PHP 项目遇到了一些麻烦 我试图从 MySQL 数据库 有 3 条记录 获取数据并将其显示在表格中 问题是它似乎只显示记录 2 和 3 它跳过了第 1 条记录 请参阅我的代码并在下面显示 if mysqli connect e
  • 以 RESTful 方式增加资源计数器:PUT 与 POST

    我有一个带有计数器的资源 为了举例 我们将该资源称为profile 计数器是数量views对于该配置文件 Per the 休息维基 http rest blueoxen net cgi bin wiki pl HttpMethods PUT
  • div Hello div div Howdy dere pardner div div div 我明白它的作用 但为什么叫这个名字both 什么是both mean 两者的意思是 一组两件事中的每一项 左 和 右 两件事
  • 自定义 WP 主题时,我应该将导航栏放在“”标签之前还是之后?

    我正在通过制作子主题来自定义 WP 主题 我将 Bootstrap 中的导航栏放入子主题目录中的 header php 文件中 但是 我不确定在哪里放置导航栏代码 我可以把它都放在前面and之后标记成功 例如 无论我选择哪一个 导航栏都显示
  • 如何销毁角度工厂实例

    一方面 我有几个工厂 每个工厂都控制一个 websocket 另一方面 其中一个工厂应该在客户端登录时启动 因此 if user isLogged injector get NotificationsWebsocket 这就是我动态初始化工
  • 理解 z-index:该元素如何出现在其父级同级元素的前面?

    为什么当我删除时红色 div 位于绿色 div 前面z index from wrapperRed 感觉像z index是沿着链条向上继承的 如果我改变z index将绿色 div 更改为 6 即使删除第一句中描述的行后 它仍保留在红色 d
  • createHTMLNotification() 替换

    我创建了一个 Chrome 扩展程序 其中使用createHTMLNotification 在所有内容之上显示一个窗口 然而 从 Chrome 28 开始 谷歌决定放弃createHTMLNotification 完全 为什么 谷歌 为什么
  • Django 响应总是用 text/html 分块无法设置内容长度

    在我的Django应用程序的views py中 我在尝试设置以下HTTP标头字段后返回一个HttpResponse对象 Create a Response Object with the content to return response
  • 导航栏下拉菜单(折叠)在 Bootstrap 5 中不起作用

    我在尝试使用以下命令创建响应式菜单或下拉按钮时遇到问题Bootstrap 5一切似乎都正常 导航图标和下拉图标出现 但它不起作用 当我单击nav图标或dropdown按钮 无dropdown menu apears 我想特别提到的是 我还包
  • 按下回车键时不刷新页面

    我遇到了一些问题 只要表单中有输入 回车键就会触发页面刷新 下面的代码 如果按下回车并且文本区域 input 中没有输入任何文本 则不会刷新页面 但是如果按下回车并且 input中有输入或者光标位于文本区域 我不确定是什么触发了它 因为 s
  • 如何在模态打开时防止主体滚动

    我在用着W3schools 模态脚本 https www w3schools com howto tryit asp filename tryhow css modal我想添加一个功能 防止模型打开时整个主体滚动 我根据我的需要对原始脚本做
  • 如何始终将焦点保持在文本框中

    我创建了一个包含两个 div 的 HTML 页面 左侧的 div 页面的 90 是 ajax 结果的目标 右侧的 div 页面的 10 包含一个文本框 该页面的想法是在文本框中输入零件编号 通过条形码扫描仪 并显示与该零件编号匹配的绘图 显
  • 多个客户端如何同时连接到服务器上的一个端口(例如 80)? [复制]

    这个问题在这里已经有答案了 我了解端口工作原理的基础知识 但是 我不明白的是多个客户端如何同时连接到端口 80 我知道每个客户端都有一个唯一的 对于他们的机器 端口 服务器是否从可用端口回复客户端 并简单地声明回复来自 80 这是如何运作的
  • 使用 CSS 折叠和展开元素

    我正在尝试构建一个页面 加载时仅可见标题 并且 当用户单击标题时 每个标题下方的表格会在隐藏和显示状态之间切换 我的限制是只能在 CSS 中执行此操作 这是我到目前为止想到的 https jsfiddle net Argoron c1ypx
  • 禁用允许文本选择的

    残疾人可以吗

随机推荐

  • django-auth-ldap 安装不起作用

    我试图在我的 Windows 系统中安装 django auth ldap 它显示以下错误 pip build 3x6rkxb4 pyldap modules errors h 8 致命错误 C1083 无法打开包含文件 lber h 没有
  • python - 如何使用popen管道输出?

    我想要pipe我的文件的输出使用popen 我怎样才能做到这一点 test py while True print hello a py import os os popen python test py 我想使用管道输出os popen
  • 为什么在主机上执行“ps aux”时可以看到 docker 容器进程?

    来自主持人 ps aux grep java me my host elastic search group ps aux grep java smmsp 20473 106 6 3 4664740 257368 Ssl 17 48 0 0
  • 缓存 AJAX 请求

    我正在向 PHP 应用程序发送 AJAX GET 请求 并希望缓存请求返回以供以后使用 由于我使用 GET 这应该是可能的 因为不同的请求请求不同的 URL 例如 getHTML php page 2 和 getHTML php page
  • numpy 中唯一元素的分组索引

    我有许多大型 gt 100 000 000 整数列表 其中包含许多重复项 我想获取每个元素出现的索引 目前我正在做这样的事情 import numpy as np from collections import defaultdict a
  • iFrame onload JavaScript 事件

    我有一个 iFrame 我想在加载后向其中发送 JavaScript 命令 我当前的代码如下所示 但使用此代码时 命令不会执行 我必须改变什么才能让它发挥作用 仅需要支持 Chrome 和 Firefox 使用 iFrame 的 onloa
  • 为什么 MQTT 无法与 NodeJS 连接?

    我在尝试连接时遇到一个奇怪的问题MQTT服务器与NODEJS 如果我连接到MQTT服务器和我没有连接它只是挂起 如果我使用命令行执行此操作 我会看到数据 因此网络 服务器等都很好 如果我使用错误的端口 那么命令行会给我一条有效的拒绝消息 但
  • 为什么 django-lint 告诉我 `auto_now_add` 已被弃用?

    各位 Djangonauts 朋友们大家好 我检查了我的项目Django lint 它产生 W 211 16 MyModel timestamp Uses superceded auto now or auto now add The 提交
  • 使用 Oracle PL/SQL Developer 生成测试数据

    我想测试一些模式和索引 并且想知道 PL SQL Developer 中是否有可以生成测试数据的功能 这样我就不必创建序列和循环来在表中插入数据 循环和 PL SQL 并不总是必要的 这个技巧可能会有所帮助 insert into emp
  • Discord window.localStorage 未定义。如何访问 Discord 页面上的 localStorage?

    当我跑步时window localStorage on https stackoverflow com它返回localStorage但是当我在 Discord 页面上使用相同的命令时它会返回undefined每次 Discord 是否正在采
  • Phonegap Cordova - 全屏后底部黑色状态栏

    从我记事起我就一直遇到这个问题 我认为这可能只是来自我的手机或仿真 但在发布我的应用程序后 我仍然在屏幕底部看到这个黑色矩形 它看起来像状态栏 在我的 config xml 中有此内容后会发生这种情况
  • 有没有更简单快速的方法来检测(Windows Phone 7)设备是否有互联网连接

    是否有更简单快速的方法来检测 Windows Phone 7 设备是否有互联网连接 我当前正在发送网络请求 等待超时时间并处理异常 希望有一种快速简单的方法来查询设备 在发送任何请求之前查看它是否有连接 提前致谢 如果没有连接 此方法将返回
  • PHP 获取图像高度和宽度

    您好 我需要动态获取上传图像的高度和宽度 这是我正在使用的 PHP 函数 但它不会返回任何宽度和高度 请你帮助我好吗 list width height type attr getimagesize FILES Artwork min wi
  • 实体框架+存储库+单元或工作问题

    我正在考虑使用 EF 4 启动一个新项目并浏览一些文章 我发现了一篇关于 EF 以及存储库模式和工作单元的文章 http blogs msdn com b adonet archive 2009 06 16 using repository
  • 为什么“uniq”将相同的单词视为不同的单词?

    我想计算文件中单词的频率 其中单词是一行一行的 该文件非常大 因此这可能是问题所在 在本例中共有 300k 行 我执行这个命令 cat temp occ uniq c sort k1 1nr k2 gt distribution txt 问
  • Symfony 2:控制器的依赖注入(DI)

    是否有机会使控制器依赖于其服务 而不是通过使用其中的服务容器 而是通过纯粹的构造函数依赖注入 我想用这种方式编写控制器
  • Python lambda函数计算数字的阶乘

    我刚刚开始学习Python 我遇到了 lambda 函数 在其中一个问题上 作者要求编写一个用于数字阶乘的单线性 lambda 函数 这是给出的解决方案 num 5 print lambda b lambda a b a a b lambd
  • bash:如何评估 PS1、PS2……? [复制]

    这个问题在这里已经有答案了 可能的重复 Echo 扩展 PS1 有什么办法可以 评估 吗 PS1 PS2等来自 bash 脚本中的内容 虽然 我可以使用替代方法来获取当前的所有元素PS1 我真的希望能够重用它的定义 而不是使用这些替代方法
  • PyQT QTreeWidget迭代

    我有两列QTreeWidget 一列代表一个网址列表第二个代表results 我已加载第一列中的网址列表 现在我想迭代此列表 并在迭代期间更改第二列中的文本 如何实现这一目标 您可以致电QTreeWidget invisibleRootIt
  • 为什么WebSocket“握手后”可以与HTTP共享80端口?

    我认为 端口指定服务器上的程序 当我们说to share a port 实际上意味着to have the requests processed by the same program listening on that port WebS