首页 文章

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

提问于
浏览
2

我已经实现了一个具有数据库驱动的sesssion管理的完整节点http服务器,并且能够在顶部使用socket.io来实现文件上载进度条和聊天应用程序 . 我还使用了node-http-proxy,并能够代理websockets . 反对,这个背景我有以下问题,我认为我需要知道成为一个有效的socket.io开发人员 . 我没有陷入任何特定的代码,但下面要求的信息必须是一个有效的套接字开发人员,但似乎没有在任何地方解释 .

我的理解:

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

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

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

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

1 回答

  • 4

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

    HTTP是TCP之上的协议,WebSockets也是TCP之上的协议 . 虽然WebSockets从编程方面看起来大多像普通套接字,但它不是纯TCP . 相反,有一些框架来获取消息边界而不是单个数据流和一些数据屏蔽,因此在使用WebSockets传输HTTP之类的情况下,不会拒绝愚蠢的代理 .

    HTTP升级将底层TCP连接的协议从HTTP切换到Websockets协议 . 一旦完成切换,就无法回头 .

    一个网页可以打开多个基于ws的TCP连接到同一台服务器吗?

    网页可以打开到同一服务器的多个HTTP连接,并且每个网关都可以升级到WebSockets . Websockets RFC的唯一限制是浏览器不应同时创建多个Websockets连接到同一主机,但没有限制它们是在彼此之后创建并且并行运行 .

    在这种情况下,打开TCP连接的总数和它们的类型是什么?

    这取决于您的应用程序 . 每个WebSockets连接都有一个TCP连接 . 此外,还有其他TCP连接来获取HTTP资源 . 这些的确切类型(HTTP与HTTP / 2)及其数量取决于浏览器和服务器,即如果使用keep-alive,则使用HTTP / 2等 .

相关问题