我已经实现了一个具有数据库驱动的sesssion管理的完整节点http服务器,并且能够在顶部使用socket.io来实现文件上载进度条和聊天应用程序。 我还使用了node-http-proxy,并能够代理websockets。反对,这个背景我有以下问题,我认为我需要知道成为一个有效的socket.io开发人员。我没有陷入任何特定的代码,但下面要求的信息必须是一个有效的套接字开发人员,但似乎没有在任何地方解释。
我的理解:
一个。 HTTP使用TCP套接字作为底层传输。 在较旧的HTTP实现中,每个请求使用一个套接字。 在较新的," Keep-alive" header用于使套接字保持活动状态以用于多个请求 - 响应。 TCP在其信令和数据传输中本质上是全双工的,但在多个HTTP请求/响应不能同时加载到同一连接的意义上不是多路复用的。 keep-alive标志有助于对http请求/响应事务按顺序使用相同的连接。
湾"升级" HTTP标头用于将常规http连接升级为websocket连接。 websocket连接实际上是基本的TCP连接,现在在http协议级别抽象。
问题:在websockets握手之后,现在有两个TCP连接还是http用于全双工通信的一个? 我的意思是,有一个TCP连接用于常规的http请求,另一个用于双向传输,像socket.io这样的库使用? 换句话说,标题"升级"真的意味着升级现有的TCP连接而不是新的连接? 一个网页可以打开多个基于ws的TCP连接到同一个服务器吗?例如,同一服务器管理的同一页面中的两个聊天会话? 在这种情况下,打开TCP连接的总数和它们的类型是什么?
我试图用netstat得到一些答案,但我无法得出任何明确的结论。 Wireshark可能会有所帮助,但我并不擅长使用它。 任何澄清都会有所帮助。
答案 0 :(得分: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等。