当前位置: 首页 > 知识库问答 >
问题:

使用HTTP keep-alive和websockets(socket.io)时的TCP连接数

欧旻
2023-03-14

我已经实现了一个成熟的节点http服务器,该服务器具有数据库驱动的sesssion管理,并且能够在上面使用Socket.io来实现文件上传进度条和一个聊天应用程序。我还使用了node-http-proxy,并且能够代理WebSockets。在这种背景下,我有以下问题,我认为我需要知道这些问题才能成为一名有效的Socket.io开发人员。我没有被困在任何特定的代码中,但下面所要求的信息是作为一个有效的套接字开发人员所必须的,但似乎没有在任何地方解释。

我的理解是:

HTTP使用TCP套接字作为底层传输。在旧的HTTP实现中,每个请求使用一个套接字。在较新的版本中,“keep-alive”标头用于使套接字处于活动状态,以便与多个请求-响应一起使用。TCP本质上是全双工的,在信令和数据传输方面都是如此,但在同一连接上不能同时加载多个HTTP请求/响应的意义上,TCP并不是复用的。keep-alive标志有助于按顺序为http请求/响应事务使用相同的连接。

b.“upgrade”HTTP头用于将常规HTTP连接升级到websocket连接。websocket连接实际上是基本的TCP连接,现在在http协议级别进行抽象。

问:在websockets握手之后,现在有两个TCP连接还是只有一个http用于全双工通信?我的意思是,是否有一个TCP连接用于常规http请求,而另一个连接用于像socket.io这样的库所使用的双向传输?换句话说,标头“upgrade”真的意味着升级现有的TCP连接而不是打开新的TCP连接吗?一个网页可以打开到同一服务器的多个基于WS的TCP连接吗?例如,同一服务器管理的同一页面中的两个聊天会话?在这种情况下,打开的TCP连接的总数是多少,它们的类型是什么?

我试图用netstat得到一些答案,但我无法得出任何明确的结论。Wireshark可能有帮助,但我不擅长使用它。任何澄清都会有帮助。

共有1个答案

卢志业
2023-03-14

websocket连接实际上是基本的TCP连接,现在在http协议级别进行抽象

HTTP是TCP之上的协议,WebSockets也是TCP之上的协议。虽然从编程方面看,WebSockets与普通的sockets相似,但它并不是纯粹的TCP。相反,有一些框架来获取消息边界,而不是单个数据流,还有一些数据掩蔽,因此在使用WebSockets传输类似HTTP的东西时,愚蠢的代理不会被拒绝。

HTTP升级将底层TCP连接的协议从HTTP切换到Websockets协议。一旦切换完成,就没有回头路了。

 类似资料:
  • 问题内容: 我是React-Redux的新技术,希望在某些实现方面对您有所帮助。 我想用套接字(socket.io)实现一个聊天应用程序。首先,用户必须注册(我在服务器端使用通行证),然后,如果注册成功,则用户必须连接到webSocket。 我认为最好的办法是对所有操作使用管道之类的中间件,并根据获取中间件的操作类型来执行不同的操作。 如果操作类型为,则创建客户端-服务器连接并设置所有将来自服务器

  • 基于此,有人对如何使用spring Integration实现此功能有什么建议吗?

  • 问题内容: 当与socket.io握手时,是否可以轻松地传递身份验证cookie?我目前必须分别进行操作,如下所示: 问题答案: WebSockets确实支持cookie,因为它们是基于HTTP的,但是快速浏览Socket.IO的源代码显示不支持此内置。 因此,在这种情况下,直接使用cookie并不是可行的解决方案,而且,由于您使用的是Socket.IO,因此不能保证用户实际上会通过WebSock

  • 然而我这样做,似乎并不奏效: 您知道如何使DefaultHttpClient使用TCP保持活动策略吗?

  • 我正在使用套接字。io,应用程序由AWS提供。我收到一个浏览器控制台错误: websocket.js:54 WebSocket 连接到 'wss://www.tidee.com/socket.io/?EIO=4 客户代码: 服务器代码: 在 AWS 中,安全组接受端口 443,负载均衡器侦听端口 443。 应用程序在本地运行时工作(状态 101),并使用 协议。

  • 问题内容: 我们正在开发一个Web应用程序,出于各种原因,该应用程序只能在现代浏览器(IE10 +)上运行。 我们实现的功能之一是Socket.io1.x。但是,默认情况下,Socket.io客户端会尝试支持较旧的浏览器,因此它将通过长时间轮询启动连接,然后将其更新为WebSockets。鉴于我们确定浏览器支持WS,因此这是浪费时间和资源。 最终,我找到了engine.io-client的文档(S