优化TCP,提高HTTP效率

1.一次网络访问的流程

http://www.taobao.com:80/market/66/meizhuang.php?spm=1.7274553.1997517397.2.WtZPYg&acm=20140506001.1003.2.72323&uuid=1LmYAFs6&scm=1003.2.20140506001.OTHER_1400654077067_72323&pos=0

第一、浏览器解析主机名;http://www.taobao.com

第二、根据主机名获得IP地址,方法:先本地缓存在再DNS,  http://www.taobao.com-》202.12.23.3

第三、浏览器获得端口号,如80,或者是默认端口号

第四、浏览器发起到IP地址为:202.12.23.3,端口号为80的TCP连接

第五、浏览器发送http://www.taobao.com:80/market/66/meizhuang.php?spm=1.7274553.1997517397.2.WtZPYg&acm=20140506001.1003.2.72323&uuid=1LmYAFs6&scm=1003.2.20140506001.OTHER_1400654077067_72323&pos=0 HTTP请求

第六、浏览器获得响应

第七、浏览器关闭TCP连接

2、综述

HTTP要传送报文时,会以流的形式将报文数据内容通过一条打开的TCP链接按序传输,TCP收到数据流之后,会将数据流砍成段的小数据块,并将段封装在IP数据包里传输

IP分组的组成部分:

一个IP分组首部(通常为20字节)

一个TCP段首部(通常为20字节)

一个TCP数据块(0个或多个字节)

TCP连接是通过4个值来识别的

<源IP地址,源端口号,目的IP地址,目的端口号>

socket编程中,socketAPI允许用户创建TCP的端点数据结构,将这些端点与远程服务器的TCP端点连接,并对数据流进行读写,TCP API隐藏了所有底层网络协议的握手细节,以及TCP数据流和IP分组之间的分段和重装细节

3.影响http时延的主要原因

第一:确定IP地址和端口号,如果最近访问,就会有网络cache缓存,否则DNS解析时间较长

第二:TCP建立的时延

HTTP是在TCP协议的上层,HTTP性能很大程度上取决于TCP通道的性能

第三:TCP连接建立好后,发送HTTP请求或从TCP连接读取报文

第四:回送HTTP响应

4. 优化TCP相关时延,提高HTTP效率

第一:并行连接

HTTP 允许客户端打开多条连接,并行地执行多个HTTP事务。

存在的隐患:

打开连接会消耗更多的内存资源,从而引发自身的性能问题,为此浏览器对并发数做了限制,一半最多为4个

第二:持久连接

通常一些图片资源来自于同一个web站点,TCP连接在事务处理结束后仍然处于打开状态,这样就可以避免缓慢的连接阶段和慢启动的拥塞适应阶段,以便快速地进行数据的传输。

潜在的问题:

持久连接的管理,如果太多的持久连接会造成很多空闲,这样耗费本地和服务器的资源,解决方法:持久连接和并行连接相结合

(i)HTTP 1.0 keep-alive连接

客户端:connection:keep-alive,服务器响应:connection:keep-alive,这样客户端就知道服务器支持持久连接,连接不关闭

客户端发出keep-alive后,服务器并不一定会同意进行keep-alive,他们可以在任意时刻关闭或者限制HTTP连接的数量

connection:keep-alive

keep-alive: max=5,timeout=120

表示最多有5个http请求保持此tcp连接处于打开状态,打开状态保持到连接空闲2分钟之后

(ii)哑代理

connection首部可以承载3中不同类型的标签:

  • HTTP首部字段名
  • 任意标签值
  • close:说明操作完成后必须关闭此连接

如果connnection包含的是HTTP首部字段,那么这个首部字段就包含了与连接有关的信息,在转发时,就应该先删除connecton首部字段

如果不删除,就会发生哑代理,导致客户端和服务器端都会保持连接,但是在传输数据时,代理并不认为同一条TCP连接会有其他请求,于是浏览器处于挂起状态。

(iii)HTTP 1.1持久连接

http1.1默认持久连接是激活的,要结束持久连接必须发送connection:close

第三:管道化连接

HTTP 1.1允许在持久连接上可选地使用请求管道,就是有个队列,将HTTP事务请求放到队列中,一条一条发送,而无需等待前面的响应结果。

限制:

  • 如果无法确认连接是持久的,就不应该使用管道
  • HTTP客户端必须做好连接会在任意时刻关闭的准备,并且准备好重发所有未完成的管道化请求

5.关闭连接

所有的客户端、服务器和代理可以在任意时刻关闭TCP连接,通常会在一条报文传输结束后关闭连接,

优化TCP,提高HTTP效率

时间: 2024-10-14 21:43:11

优化TCP,提高HTTP效率的相关文章

使用 Django-debug-toolbar 优化Query 提高代码效率

一段程序执行效率慢,除了cpu计算耗时外,还有一个很重要的原因是SQL的Duplicated过多,使用Django-debug-toolbar能够快速找出哪些地方的SQL可以优化,提高程序执行效率 1. 安装 Django-debug-toolbar: pip install django-debug-toolbar 2. 在Django项目中创建APP用于toolbar测试: toolbar_test - __init__.py - templates - toolbar.html views

SQL Server SQL性能优化之--通过拆分SQL提高执行效率,以及性能高低背后的原因

复杂SQL拆分优化 拆分SQL是性能优化一种非常有效的方法之一, 具体就是将复杂的SQL按照一定的逻辑逐步分解成简单的SQL,借助临时表,最后执行一个等价的逻辑,已达到高效执行的目的 一直想写一遍通过拆分SQL来优化的博文,最近刚好遇到一个实际案例,比较有代表性,现分享出来, 我们来通过一个案例来分析,为什么拆分语句可以提高SQL执行效率,更重要的是弄清楚,拆分前为什么慢,拆分后为什么快了? 幼稚的话,各位看官莫笑 先看一下相关表的数据量,大表也有5900多万,小表有160多万 (声明:我从来没

程序员提高工作效率的15个技巧【Facebook】

程序员提高工作效率的15个技巧[Facebook] 作者: habadog 日期: 2015 年 02 月 13 日发表评论 (0)查看评论 1,Days always fill up. Only plan for 4-5 hours of real work per day.其实每天只有4-5个小时能专心编码,充分利用这些时间. 2,Work more when you’re in the zone. Relax when you’re not.在状态的时候多干一些,不在状态时可以就去做个大保

变通实现微服务的per request以提高IO效率(二)

*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* BLOCKS =============================================================================*/ p, blockquote, ul, ol, dl, table, pre { margin: 15px 0; } /* HEAD

手工测试 测试框架?如何提高测试效率?

百度了一下“测试框架”,搜索结果大部分都是“自动化测试框架”.“单元测试框架”,没有手工测试框架.但是所谓框架不就是把“共性部分形成的体系”提高效率和质量吗? 做测试3年,现在想的更多的是如何提高测试效率和保证测试用例的覆盖率.目前所在的是公司是互联网公司(之前一直在传统软件公司工作),节奏很快,测试周期很短.产品需求文档的完善程度也是参差不齐,然后测试时间又比较紧急,除了个别庞大的项目外,领导不会专门预留编写测试用例的时间. 事件一,2015/12/8,领导安排我和另外一个同事测试一个新增节点

如何测试sql语句性能,提高执行效率

有时候我们经常为我们的sql语句执行效率低下发愁,反复优化后,可还是得不到提高 那么你就用这条语句找出你sql到底是在哪里慢了 示例: SET STATISTICS io ON        SET STATISTICS time ON        go         ---你要测试的sql语句         select top 100 * from TBL_Cot_RecStaticList        go        SET STATISTICS profile OFF    

在一个千万级的数据库查寻中,如何提高查询效率?

在一个千万级的数据库查寻中,如何提高查询效率? 1)数据库设计方面:  a.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. b.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0

[MySQL优化] -- 如何查找SQL效率地下的原因

[MySQL优化] -- 如何查找SQL效率地下的原因   来源: ChinaUnix博客 日期: 2009.07.20 16:12 (共有条评论) 我要评论       查询到效率低的 SQL 语句 后,可以通过 EXPLAIN 或者 DESC 命令获取 MySQL 如何执行 SELECT 语句的信息,包括在 SELECT 语句执行过程中表如何连接和连接的顺序,比如我们想计算 2006 年所有公司的销售额,需要关联 sales 表和 company 表,并且对 profit 字段做求和( su

ORACLE使用WITH AS和HINT MATERIALIZE优化SQL解决FILTER效率低下

 在做项目的过程中,一个页面使用类似如下的SQL查询数据,为了保密和使用方便,我把项目中有关的表名和字段替换使用ORACLE数据库中的系统表和字段. 在我所做的项目中,类似ALL_TABLES的表中大概有8W多条数据,下面这个查询SQL很慢. WITH PARAMS AS (SELECT '' USER_ID, '' SDATE, '%' || '' || '%' SNAME FROM DUAL) SELECT AU.USERNAME, AU.USER_ID FROM ALL_USERS A