【问题标题】:How does a socket change ports from HTTP 80 to another port when we want to communicate over WebSocket using Javascript?当我们想使用 Javascript 通过 WebSocket 进行通信时,套接字如何将端口从 HTTP 80 更改为另一个端口?
【发布时间】:2018-11-05 19:00:31
【问题描述】:

假设我有一个服务器XYZ,它监听 TCP 客户端的端口 50000 和 HTTP 客户端的端口 80。另一方面,我有一个客户端,它使用 WebSocket 建立到端口 50000 的套接字连接,并将使用 HTTP 端口 80 进行握手(当然)。

现在,当客户端启动时,它首先会通过 HTTP 端口 80 向服务器 XYZ 发送请求,服务器将在端口 80 上接收握手请求并发送欢迎响应。所以,在这种情况下,双方都在使用 80 端口(当然)。

现在,当握手完成时,标准文档指出,用于握手目的的 HTTP 请求/响应的同一 TCP 连接随后转换为 TCP 套接字连接。好吧好吧。

但是,但是,如果整个握手过程和 HTTP 请求/响应的 TCP 连接第一次使用端口 80,并且相同的 TCP 连接转换为 TCP 套接字连接,则整个过程是通过端口 80 完成的, 那么同一个 TCP 连接如何转换为双方 TCP 套接字的 50000 端口呢?客户端是否在内部初始化另一个 TCP 连接以更改为端口 50000?

那么,任何人都可以说出端口转换是如何执行的以及如何在WebSocket 中从端口 80 到双方的不同端口?如何在不同的端口上建立完整的单套接字连接?同一个 TCP 连接如何改变/翻转其端口?

【问题讨论】:

  • “标准文档”,无论您是什么意思,都没有说任何这样的事情。套接字仍然是套接字,端口仍然是端口,连接仍然是连接。没有任何东西被转换。端口 5000 是客户端端口。没什么神秘的。

标签: tcp websocket port tcpsocket


【解决方案1】:

TCP 套接字连接根本无法更改端口。建立连接后,其端口将被锁定且无法更改。如果您在端口 80 上有一个 TCP 套接字连接,那么在端口 50000 上建立一个连接的唯一方法是建立一个完全独立的 TCP 套接字连接。

WebSocket 无法连接到端口 80,然后切换到端口 50000。但是,从端口 80 提供给浏览器的 HTML 页面可以包含客户端脚本,允许浏览器创建 WebSocket 对象并将其连接到端口 50000。两个 TCP 连接(HTTP 和 WebSocket)彼此完全分离(事实上,一旦提供 HTML,HTTP 套接字连接甚至不需要保持打开状态,因为 HTTP 是无状态协议)。

【讨论】:

  • 评论第 1 部分: 不,我的问题是我现在做了var ws = new WebSocket("ws://something:50000/something/something"),当我在浏览器中运行此文件时,HTTP 协议将进入开始握手的操作并在端口80 上生成一个常规的HTTP 请求,因此,在这种情况下,HTTPTCP 也将被使用。
  • 评论第 2 部分: 现在在服务器端,服务器还在端口 80 上侦听 HTTP 请求。当服务器收到该请求时,它将在同一端口80 上以欢迎Handshake 响应,对吗?所以,主要问题是,正如您在上面看到的,我为WebSocket 通信设置了端口50000,那么80 的端口如何更改为50000?因为相同的请求是使用端口80 启动的,那么从8050000 的端口如何转换/更改?
  • 你只是在问你已经问过的问题。我已经在我的回答中提到了这一点。 HTML 页面仅通过端口 80 上的 HTTP 传递。然后浏览器运行 Javascript,它创建 WebSocket 对象,该对象仅连接到端口 50000。那是一个完全独立的 TCP 连接。唯一涉及的握手是端口 50000 上的 WebSocket 握手。端口 80 上没有握手。没有端口更改。您需要更多地研究 TCP、HTTP 和 WebSocket 的实际工作原理。尤其是 TCP,您显然缺乏对套接字基础知识的基本了解。
  • @SunnyKhan WebSocket 连接开始时是一个 HTTP 请求,但在初始请求完成后它会迅速从 HTTP 升级。客户端的 WebSocket 对象可以连接到端口 80,但它不能完成它的握手 除非服务器在端口 80 上实现 WebSocket 协议。它是很难知道您的情况是否确实如此。据我们所知,您的服务器在决定是否完成 WebSocket 握手时会忽略端口号。但我已经回答了您关于客户端如何切换端口的问题。要么接受,要么离开。
  • @SunnyKhan 答案在WebSocket protocol spec,建议您阅读。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-21
  • 2023-02-25
  • 1970-01-01
  • 2015-02-16
  • 2017-07-26
  • 2014-09-19
  • 2016-05-05
相关资源
最近更新 更多