如何使一个端口同时监听 HTTP 和 WebSocket?

3

你好,我有一个运行在80端口的http服务器。由于我对sockets不太熟悉,所以我了解到我们可以升级同一端口上的连接并使两者都在同一端口上工作。

现在我很困惑其他客户端会发生什么。

请考虑以下情况: 我向服务器发送一个get请求,请求使用相同的TCP / IP将我的连接从http升级到websocket。服务器响应101,它升级了连接。到目前为止一切顺利。

现在,端口80是websocket端口而不是http端口。因此,socket.io将维护连接和请求,而不是express()中的应用程序。

那么当下一个客户端来到同一端口80做一些非socket相关的事情时,http机制将如何工作?因为连接已经是一个socket连接了。

它是如何在此处实现它正在进行的操作的。


下一个连接是不同的连接。你混淆了TCP(传输)连接和应用层连接。_RFC 793_解释道:“为了允许单个主机内的多个进程同时使用TCP通信设施,TCP在每个主机内提供一组地址或端口。这与来自Internet通信层的网络和主机地址连接起来,形成一个套接字。一对套接字唯一标识每个连接。也就是说,一个套接字可以同时用于多个连接。” - Ron Maupin
你的应用程序绑定到TCP端口80以创建套接字。主机TCP将使用自己的套接字连接到你的TCP。连接由套接字对标识。另一个连接的主机将有自己不同的套接字,因此套接字对将定义不同的TCP连接。如果你的TCP套接字是A,使用其套接字B连接的主机将形成连接AB。使用其套接字C连接的另一个主机将创建连接AC。连接AB与连接AC不同。阅读RFC以了解TCP。 - Ron Maupin
好的先生,我稍微学习了一下OSI模型。所以您是告诉我,套接字是会话层中的连接。然后从那里分布到应用层的协议类型?因此,一个端口可以监听任意数量的进程。 - Shobhit Tewari
我给你提供了TCP RFC的链接。它详细解释了TCP的工作原理(请参见第2.7节连接建立和清除)。在尝试使用TCP进行编程之前,你应该熟悉它的工作原理,否则很容易造成漏洞。 - Ron Maupin
每个连接都是完全不同的连接。你可以升级一个,为什么会影响其他连接呢? - user253751
显示剩余5条评论
1个回答

4

现在端口80已经成为了WebSocket端口,而不再是HTTP端口。

TCP监听套接字对应的是协议无关的,它只有建立新的TCP连接这一个作用,监听套接字上甚至没有传输任何应用数据。

使用特定的应用层协议,例如HTTP,或者在不同应用层协议之间切换,例如从HTTP切换到WebSocket,只会影响到新建立的(被接受的)连接,而不会影响监听套接字。这也意味着即使所有这些连接都起源于同一个TCP监听套接字,仍然可以在不同的TCP连接上使用不同的应用层协议。


以下是我的结论:
  1. 在TCP中,套接字是将IP地址和端口绑定在一起创建唯一套接字的方式。
  2. 连接是为了传输数据而从两端设置套接字。
  3. 进程是正在运行的线程,它正在使用连接或者在我的情况下,向我的操作系统中的TCP模块设置一个被动打开请求。
  4. 当我请求升级我的连接时,仍然是同一个TCP,但接下来会发生什么是我无法理解的。
- Shobhit Tewari
好的,只有一个澄清的问题,如果操作系统允许,任意数量的不同进程或程序可以监听相同的端口,并且它们使用连接。 - Shobhit Tewari
@ShobhitTewari:“...任意数量的不同进程或程序可以在同一端口上侦听...”-通常情况下,特定端口只有一个监听套接字。但是,该套接字可能在不同的线程和进程之间共享。然后,accept返回的新连接仅由其中一个进程/线程处理,即所有同时调用accept的线程/进程中的随机一个。 - Steffen Ullrich
好的,现在可能清楚了。我建立了一个套接字连接,当我发出升级请求时,该连接将更新为一个新进程,该进程是在同一端口上侦听socket.io?连接是相同的,只是在上层的进程从应用程序更改为socket.io。 - Shobhit Tewari
1
@ShobhitTewari:没有涉及到不同的流程。这仍然是相同的流程,只是以不同的方式解释数据。这更像是在同一流程中实现不同的功能。 - Steffen Ullrich
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接