我们知道Http协议是基于TCP/IP连接的,也就是说客户端浏览器向服务器发出一个Http请求并得到响应是要建立一条TCP/IP连接的,但是如果每发出一个Http请求客户端就要向服务器端建立一条TCP/IP连接的话,这样效率会非常低,所以在Http协议中有一个叫做Keep-Alive的机制,如果在服务器端(IIS或Apache等Web服务器)启动Keep-Alive后,客户端浏览器向Web服务器发出的Http请求被响应后建立的TCP/IP连接并不会被立刻释放掉,而是会存在一段时间,这个时间叫Keep-Alive

Timeout,如果在Keep-Alive

Timeout时间内没有新的Http请求从客户端发送到服务器端,那么建立的TCP/IP连接就会被服务器端释放掉,如果在Keep-Alive

Timeout时间内又有Http请求从客户端浏览器发送到了服务器端,那么服务器端又会等待Keep-Alive

Timeout时间后才会释放TCP/IP连接,这样大大提高了TCP/IP连接在Http协议中的复用率提高系统性能。这个过程可以用下面这张图来解释,左边是没有启用Keep-Alive时Http请求的状况,可以看到客户端每发出一次Http请求,都会和服务器端建立(open)一个TCP/IP连接然后释放(close)链接,右边是启用Keep-Alive后Http请求的状况,客户端发出的3个Http请求都复用同一个TCP/IP连接。

清楚了Keep-Alive是什么东西我们再来说说Keep-Alive中的另一个概念叫max,启用了Keep-Alive的Http连接,在Http响应头中一般会包含两个参数timeout和max,timeout就是我们在上面提到的Keep-Alive

Timeout时间,在这个时间内如果没有新的Http请求发送到服务器端那么TCP/IP连接就会被服务器端释放掉,而max是表示TCP/IP连接还可以复用的次数,每当TCP/IP连接被Keep-Alive机制复用一次max的值就会减1,如果max等于0了,表示该TCP/IP连接不允许再被复用了,服务器端就会释放TCP/IP连接,如果客户端后面又有Http请求发送到服务器端,客户端和服务器端就必须重新建立一个TCP/IP连接。下图就是服务器端启用Keep-Alive机制后,客户端浏览器收到的Http响应头,里面包含timeout和max两个字段值。

从上面我们知道了如果服务器端启用了Keep-Alive机制,那么有两种情况建立的TCP/IP连接会被正常释放(非正常释放就不提了,比如关机了,断网了等。。。),一是在Keep-Alive

Timeout时间内没有新的Http请求复用TCP/IP连接,那么TCP/IP连接就会被服务器端释放,二是当建立的TCP/IP连接被复用了max次后,max的值已经为0,服务器端也会释放TCP/IP连接。

当服务器端启用Keep-Alive机制后,会向客户端浏览器发送两个参数timeout和max,所以客户端浏览器就会知道Keep-Alive机制下建立的TCP/IP连接多久后会被服务器端释放掉,TCP/IP连接还能复用多少次,如果浏览器发现TCP/IP连接已经被服务器端释放掉了,那么浏览器就会和服务器端建立一个新的TCP/IP连接来发送后续的Http请求。但是有一种情况会导致IE浏览器不知道服务器端释放了TCP/IP连接,而去复用TCP/IP连接导致:“SCRIPT7002:

XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 而导致此项操作无法完成”

错误发生。

我们来举个例子,还是下面这个截图,当IE浏览器收到这个Http响应标头之后就知道服务器端启用了Keep-Alive机制,并且Keep-Alive机制的timeout时间是5秒,最大复用次数为100次。

现在假如我们有个页面使用javascript的setInterval函数每过5秒钟就向服务器端发送一个Ajax请求,那么IE浏览器在向服务器端发送Ajax请求的时候就有可能会去复用服务器端已经被释放掉的TCP/IP连接。因为IE浏览器发送Ajax请求的时间间隔是5秒,而服务器端Keep-Alive机制timeout时间也是5秒,那么IE浏览器发出Ajax请求和服务器端释放TCP/IP连接这两个事情就很有可能在同一个时间点上发生。我们设想一下当IE浏览器发出第一次Ajax请求时和服务器端建立了一个TCP/IP连接,由于服务器端启用了Keep-Alive机制,该TCP/IP连接在5秒后才会被服务器端释放掉,而在5秒后IE浏览器开始发送第二次Ajax请求的时候认为5秒时间还没到还可以复用第一次Ajax请求建立的TCP/IP连接,所以当IE浏览器发出第二次Ajax请求的时候就沿用了第一次Ajax请求建立的TCP/IP连接,但是当第二次发出的Ajax请求到达服务器端的时候已经是第一次Ajax请求到达服务器端的时间的5秒后了(我们假定Ajax请求会在网络上传输1秒到达服务器端,那么当第二次Ajax请求到达服务器端的时候距离第一次Ajax请求已经有6秒的时间了),所以TCP/IP连接已经被服务器端释放掉了,那么IE浏览器发出的第二次Ajax请求就会被服务器端抛弃,服务器端不会对IE浏览器发出的第二次Ajax请求作出任何响应,所以IE浏览器就会抛出:“SCRIPT7002:

XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 而导致此项操作无法完成”

错误。我们可以用下面一个时序图来描述这个过程:

经测试这个问题只会在IE(测试环境为IE11)浏览器上发生,在Firefox和Chrome上并无此问题,说明Firefox和Chrome在发出Http请求之前会去检测Keep-Alive机制建立的TCP/IP连接是否已经被释放掉了,如果释放掉了Firefox和Chrome不会报错而是向服务器端开启一个新的TCP/IP连接,避免复用已释放的TCP/IP连接这种情况发生,而IE浏览器就比较笨了,一旦复用了已释放的TCP/IP连接就报错了。。。

说了这么多那么怎样避免IE浏览器因为复用已释放的TCP/IP连接而报错呢?最保险的方法是关闭服务器端的Keep-Alive机制,尽管这样系统效率会有所下降但是这样IE浏览器肯定不会因为复用被释放的连接而报错了。。。另外也可以建议用户不要使用IE浏览器,这肯定是不现实的。。。。最后如果把Keep-Alive机制的timeout时间设置长一点而不是像本例一样只设置到5秒,也可以大大降低IE浏览器复用被释放连接的风险,但是不能够保证肯定是安全的。

下面介绍下怎样在IIS7中关闭Keep-Alive机制,另外设置Keep-Alive机制的timeout时间

IIS7关闭Keep-Alive机制,进入站点设置,然后选择HTTP Response Headers设置,点击Set

Common Headers,将Enable HTTP keep-alive复选框取消选中即可。

IIS7设置Keep-Alive机制的timeout时间,在站点设置中点击高级设置(Advanced

Settings),然后在弹出的窗口中设置Connection Time-out的值即可,默认是120秒即2分钟。

网络错误7002_SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3nbsp...相关推荐

  1. 网络错误7002_jquery - SCRIPT7002:XMLHttpRequest:网络错误0x2ef3,由于错误00002ef3无法完成操作...

    jquery - SCRIPT7002:XMLHttpRequest:网络错误0x2ef3,由于错误00002ef3无法完成操作 当我做一些Ajax调用时,我一直收到这个错误... 它甚至可能与地理编 ...

  2. net::ERR_CONNECTION_REST与XMLHttpRequest:网络错误 0x2ee2, 由于出现错误 00002ee2 而导致此项操作无法完成。

    服务器:centOs7:4台 场景1:接到现场项目反馈附件上传有两台服务器超过1M的文件上传不了. 排查: 1.通过拨vpn,访问项目上传超过1M的文件确实会出现上传失败的问题.查看异常日志: org ...

  3. ie浏览器跨域报错问题;Access-Control-Allow-Headers 列表不存在请求表头 content-type;XMLHTTPRequest:网络错误 0x80070005,拒绝访问。

    问题: 这段是我在main.js下设置的,为了在请求头上添加后端需要的参数sessionId 和xrequestedwith ,在谷歌下是正常的, ie报Access-Control-Allow-He ...

  4. 记录ie下报XMLHttpRequest: 网络错误 0x80070005, 拒绝访问。

    问题: 同样的调用接口,在谷歌是没有问题的,但是在ie下报错XMLHttpRequest: 网络错误 0x80070005, 拒绝访问. 1.分析: 对比了一下,相同的是接口传递参数错误导致报错, 传 ...

  5. IE出现“XMLHttpRequest: 网络错误 0x80070005, 拒绝访问”的解决方案

    最近使用Vue开发的项目,本地开发, 使用IE浏览器访问出现了问题 提示: "Access-Control-Allow-Headers 列表中不存在请求标头 content-type&quo ...

  6. 关于IE浏览器出现“XMLHttpRequest: 网络错误 0x80070005, 拒绝访问”的解决方案

    前言 最近使用Vue开发的项目,部署在nginx容器中,使用IE浏览器访问出现了问题,提示"Access-Control-Allow-Headers 列表中不存在请求标头 content-t ...

  7. 一般性网络错误 请检查网络文档_如何编写好的软件设计文档

    原文链接 作为一名软件工程师,我花了很多时间阅读和编写设计文档.在研究了数百篇这样的文档之后,我发现好的文档与项目成功之间有很强的关联性. 在本文中,我尝试去说明如何才能编写好的设计文档. 本文分为4 ...

  8. 不论报任何错误 都是网络源有问题,安装spacemacs报错的解决方式

    不论报任何错误 都是网络源有问题 打开.spacemacs ### 这是原头部 (defun dotspacemacs/layers () "Configuration Layers dec ...

  9. python网络通信传输的数据类型_Python网络编程中的网络数据和网络错误。

    上一个章节我们说的是套接字名和DNS.这篇文章我们主要解决下面问题. 我们在两台主机之间建立与关闭TCP流连接以及UDP数据报连接后.我们应该怎么准备我们需要传输的数据,该怎么对数据进行编码与格式化. ...

最新文章

  1. android 版本更新原理,Android系统Recovery工作原理之使用update.zip升级过程分析(二)...
  2. 下载安装tomcat6.0
  3. Redis-15Redis基础配置文件
  4. mysql的length函数和char_length中文字符长度计算函数
  5. 组策略中Run logon scripts synchronously和Run startup scripts asynchronously的区别
  6. 函数函数sigaction、signal
  7. 将结构体数据存储到一段字符串string中
  8. Excel单元格“删除线”的添加与删除
  9. 简要安装FreeBSD 6.2及配置桌面环境[zz]
  10. 【java】java Parallel GC 该怎么看?
  11. 【新手向】阿里云上ubuntu+flask+gunicorn+nginx服务器部署(二)项目部署
  12. .NET Enterprise 4.1.5的工作流引擎
  13. java word 添加图片_java – 在word文档中插入图片
  14. 毕业设计写作基本步骤
  15. 【刷题】LOJ 6008 「网络流 24 题」餐巾计划
  16. PostgreSQL - 如何杀死被锁死的进程
  17. 在祝贺提拔的饭局上当众敬酒,别说“感谢领导”,高手都懂这4点
  18. 机器人是如何实现控制的,它的控制器有哪些组成?
  19. 开关电源和普通电源有什么区别?
  20. 基于逻辑回归(Logistic Regression)的糖尿病视网膜病变(Diabetic Retinopathy)检测

热门文章

  1. 2023系统分析师论文范文模板
  2. python编程入门(适合初学者)
  3. python 黑盒测试_处理Python导入黑盒
  4. mysql的decode函数_Mysql实现oracle decode()函数
  5. 详细讲解如何用爬虫工具批量采集阿里巴巴商品数据
  6. storm1.1.1安装
  7. c#常用编程方法 (一)
  8. Windows下批量下载rpm安装文件
  9. meshgrid用法
  10. 10亿补贴以旧换新 苏宁全民焕新节开年大手笔