我已经实现了一个具有数据库驱动的会话管理的完整节点http服务器,并且能够使用socket.io来实现文件上传进度条和聊天应用程序。我还使用了节点http代理,并且能够代理websocket。在这种背景下,我有以下问题,我相信我需要知道,才能成为一个有效的socket.io开发人员。我没有陷入任何特定的代码中,但下面要求的信息是成为一名有效的套接字开发人员的必备信息,但似乎没有在任何地方进行解释。
我的理解:
a。HTTP使用TCP套接字作为底层传输。在较旧的HTTP实现中,每个请求使用一个套接字。在较新的版本中,"Keep-alive"标头用于保持套接字的活动状态,以便与多个请求响应一起使用。TCP在信令和数据传输方面本质上是完全双工的,但在不能同时在同一连接上加载多个HTTP请求/响应的意义上,它不是多路复用的。keep-alive标志有助于按顺序为http请求/响应事务使用相同的连接。
b。"upgrade"HTTP头用于将常规HTTP连接升级为websocket连接。websocket连接实际上是基本的TCP连接,它现在在http协议级别被抽象。
问题:在websockets握手之后,现在有两个TCP连接,还是只有一个被http用于全双工通信?我的意思是,像socket.io这样的库现在是否有一个用于常规http请求的TCP连接和另一个用于双向传输的TCP连接?换句话说,标题"升级"真的意味着升级现有的TCP连接,而不是打开新的TCP连接吗?一个网页可以打开多个到同一服务器的基于ws的TCP连接吗?例如,同一服务器管理的同一页面中的两个聊天会话?在这种情况下,打开的TCP连接的总数是多少?它们的类型是什么?
我试着用netstat得到一些答案,但我没有得出任何确切的结论。Wireshark可能有帮助,但我不擅长使用它。任何澄清都会有所帮助。
websocket连接实际上是基本的TCP连接,它现在在http协议级别被抽象。
HTTP是TCP之上的协议,WebSockets也是TCP之上的一个协议。虽然WebSocket在编程方面看起来大多像普通的套接字,但它并不是纯粹的TCP。相反,有一些框架来获得消息边界,而不是单个数据流,还有一些数据屏蔽,这样在使用WebSockets传输类似HTTP的东西时,愚蠢的代理就不会被拒绝。
HTTP升级将底层TCP连接的协议从HTTP切换到Websockets协议。一旦转换完成,就没有回头路了。
一个网页可以打开多个到同一服务器的基于ws的TCP连接吗?
一个网页可以打开到同一服务器的多个HTTP连接,每个连接都可以升级到WebSockets。Websockets RFC的唯一限制是浏览器不应同时创建到同一主机的多个Websockets连接,但它们是在彼此之后创建并并行运行的,这一点没有限制。
在这种情况下,打开的TCP连接的总数是多少?它们的类型是什么?
这取决于您的应用程序。每个WebSockets连接都将有一个TCP连接。此外,还会有其他TCP连接来获取HTTP资源。它们的确切类型(HTTP与HTTP/2)以及数量取决于浏览器和服务器,即如果使用保活,则使用HTTP/2等。