首页 > 代码库 > 优化TCP,提高HTTP效率
优化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连接,通常会在一条报文传输结束后关闭连接,