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