RT,现在网页跟服务器通信,有频繁的数据请求,服务器的配置connection:keep-alive,也就是一直在复用一个TCP通道,但是偶尔会出现通信情况极差,不能早要求的时间内返回数据,有没有可能让它保持两个TCP通道让我轮换使用,一个超时可以用另外一个保证传输?(这是一种猜测的尝试,就想问有没有可能实现,不要分析猜测可信度大不大)
RT,现在网页跟服务器通信,有频繁的数据请求,服务器的配置connection:keep-alive,也就是一直在复用一个TCP通道,但是偶尔会出现通信情况极差,不能早要求的时间内返回数据,有没有可能让它保持两个TCP通道让我轮换使用,一个超时可以用另外一个保证传输?(这是一种猜测的尝试,就想问有没有可能实现,不要分析猜测可信度大不大)
网页内没有这个层面的直接控制: 浏览器也许有很大的tcp连接池,也许连keep-alive都不管,对网页来说无法区分。
不过: 一个 (还没结束的) 请求下面应该总有一个TCP通道,一个websocket连接下面也有,所以保持连接应该是可以间接做到的。这个方法对解决你的问题可能没帮助。
概念混淆:一个网页可以跟服务器保持多个TCP连接通道么?
这里应该没有叫:一个网页
的概念,应从浏览器层面去考虑:
浏览器开起一个窗口,来接收和处理http响应的html,而浏览器在处理(解析)HTML过程中,网络模块在处理HTTP请求时,本身就就是使用多个tcp来处理的(也有可能是复用同一个)。(使用file协议另论);
你的问题从本质考虑:TCP本身具备非常多的容错机制,具体可以去了解下,你描述的场景在TCP中本身存在超时机制。
从问题描述的场景上看,一个TCP响应超时,自然另外一个从理论上也好不到哪儿去,解决不了啥问题,而且关键问题在于:你必须等这一个判定为超时了,再发另外一个,对于实际场景来说没啥意义了。
楼上回答非常赞.
再则,ecma 和 w3c 都没有对这块有所定义(因为是其他组织在干)。实在没必要加入下层的规范。
10 回答11.1k 阅读
7 回答3.2k 阅读✓ 已解决
5 回答4.8k 阅读✓ 已解决
4 回答3.1k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
3 回答5.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
浏览器的实现层面,目前无法使用JavaScript面向TCP编程,针对这个问题,从几个角度回答一下:
keep-alive
是存在timeout的(通常在1分钟内),此后的HTTP请求会通过建立新的TCP链接,进行通信。因此不是高频的通信,keep-alive未必能发挥真正的作用。即使是在timeout内的通信,每次HTTP请求的Header都会反复传输,因为
HTTP/1.1
协议是无状态的。这会导致在高频通信的过程,流量中信息的有效传输率是较低的。如何避免这个影响请看第4条。偶尔出现的通信极差情况,如果根本原因在于网络的波动,那么多加几条TCP通道是无益的。客观地说,网络波动带来的通信失败,是不太可能再通过技术手段提升的,因为TCP协议已经保证了数据的有效传输,但因波动而导致的TCP丢包、重传是必须经历的时间,躲不过去。
如果有条件,可以使用
HTTP/2
协议,其二进制分帧、首部压缩、多路复用的特性,能够解决因协议导致的链路问题。但是,由网络波动、信号差情况导致的通信效果不理想,已经不在技术能够解决的范畴内了。