我已经实现了一个完整的Node HTTP服务器,并带有基于数据库的会话管理,还能够在其上使用Socket.io来实现文件上传进度条和聊天应用程序。
我还使用了node-http-proxy,并且能够代理WebSockets。在这个背景下,我有以下问题,我相信我需要知道这些才能成为一个有效的socket.io开发人员。我没有被困在任何具体的代码中,但是下面请求的信息对于成为有效的套接字开发人员是必须了解的,但似乎没有任何地方解释过。
我的理解: a. HTTP使用TCP套接字作为底层传输。在旧版HTTP实现中,每个请求使用一个套接字。在新版中,“Keep-alive”标头用于保持套接字活动以供多次请求-响应使用。TCP在其信令和数据传输方面本质上是全双工的,但在多个HTTP请求/响应不能同时加载到同一连接上的意义上不是复用的。keep-alive标志有助于在序列中使用相同的连接进行http请求/响应事务。
b. “upgrade” HTTP标头用于将常规http连接升级为websocket连接。 websocket连接实际上是在http协议级别抽象化的基本TCP连接。
问题:在WebSockets握手之后,现在是否有两个TCP连接还是只有一个TCP连接用于全双工通信? 我的意思是,是否有一个TCP连接用于常规http请求,现在有另一个用于双向传输,像socket.io这样的库使用? 换句话说,“升级”标头是否真正意味着升级现有的TCP连接而不是打开新连接? 一个网页可以打开多个基于ws的TCP连接到同一服务器吗?例如,在同一页中由同一服务器管理的两个聊天会话? 在这种情况下,将打开多少个TCP连接以及它们的类型是什么?
我尝试使用netstat获取一些答案,但我无法得出任何明确的结论。 Wireshark可能有所帮助,但我不擅长使用它。 任何澄清都将有所帮助。
我的理解: a. HTTP使用TCP套接字作为底层传输。在旧版HTTP实现中,每个请求使用一个套接字。在新版中,“Keep-alive”标头用于保持套接字活动以供多次请求-响应使用。TCP在其信令和数据传输方面本质上是全双工的,但在多个HTTP请求/响应不能同时加载到同一连接上的意义上不是复用的。keep-alive标志有助于在序列中使用相同的连接进行http请求/响应事务。
b. “upgrade” HTTP标头用于将常规http连接升级为websocket连接。 websocket连接实际上是在http协议级别抽象化的基本TCP连接。
问题:在WebSockets握手之后,现在是否有两个TCP连接还是只有一个TCP连接用于全双工通信? 我的意思是,是否有一个TCP连接用于常规http请求,现在有另一个用于双向传输,像socket.io这样的库使用? 换句话说,“升级”标头是否真正意味着升级现有的TCP连接而不是打开新连接? 一个网页可以打开多个基于ws的TCP连接到同一服务器吗?例如,在同一页中由同一服务器管理的两个聊天会话? 在这种情况下,将打开多少个TCP连接以及它们的类型是什么?
我尝试使用netstat获取一些答案,但我无法得出任何明确的结论。 Wireshark可能有所帮助,但我不擅长使用它。 任何澄清都将有所帮助。
keep-alive
不能保证单个HTTP连接(新版本的浏览器会使用2-4个连接以避免大型响应阻塞信息流,而旧版本则会使用更多)。2.upgrade
之后,连接是基于TCP/IP的Websocket协议,而不是HTTP(我认为你在第一段末尾写错了HTTP)。3.除非打开一个新连接,否则无法返回HTTP。4.无法保证每个客户端将利用多少连接,特别是考虑到socket.io的行为。 - Myst