zoukankan      html  css  js  c++  java
  • Http权威指南(TCP连接)

    1.HTTP请求的过程

    世界上几乎所有的HTTP通信都是由TCP/IP承载的,当发生HTTP请求时,实际上经过了以下几个步骤:

    ①浏览器从请求的URL中解析主机名

    ②浏览器查询这个主机名的IP地址

    ③浏览器获得端口号

    ④浏览器发起到IP:端口的连接(TCP连接)

    ⑤浏览器向服务器发送一条请求报文

    ⑥浏览器从服务器读取响应报文

    ⑦浏览器关闭连接(TCP连接)

    图解:

    2.TCP性能聚焦点

    2.1TCP连接的握手时延

    建立TCP连接甚至是发送任意数据之前,TCP软件之间都会交换一系列的IP分组,对连接参数进行沟通

    所以,如果每次都只传输少量的数据,导致最终建立连接的次数增加,那么这些交换过程就会严重降低HTTP性能

    2.2TCP段中的标记和首部

    每个TCP段中都会至少装载40个字节的标记和首部,那么举个例子:

    1000个字节的数据传输量,用10个TCP段装载,那么至少在原数据量的基础上增加40X10=400个字节的数据量;

    如果用100个TCP段装载,那么至少在原数据量的基础上增加40X100=4000个字节的数据量;

    如此一来,平白无故多了3600个字节的传输量,自然性能就严重下降了。

    2.3TCP慢启动

    TCP慢启动限制了每一个TCP端点在任意时刻可以传输的分组数,每成功接收一个分组,就会拥有发送另外两个分组

    的权限,接收了两个分组,就会有发送另外四个分组的权限,以此类推。如果一个HTTP事务有大量数据要发送,必

    须要依据以上的规则,此种方式被称为“打开拥塞窗口”。

    由于这种特性,新连接的传输速度会比已经交换过一定数据量的“已调谐”的连接慢一点,因为后来的TCP连接单次能发

    送的分组数比前者少,所以HTTP中有一些可以重用现存TCP连接(旧连接)的工具,这就是“持久连接”。

    3.TCP连接性能提升解决方案

    3.1Nagle算法

    这个算法是为了解决2.2中TCP段多导致多出的标记和首部数据问题;

    该算法鼓励发送全尺寸的TCP段(LAN上最大分组大约是1500字节,在因特网上是几百字节),只有当所有其他分组

    都被确认之后,该算法才允许发送非全尺寸的分组;如果其他分组仍在传输,那就将数据缓存起来,只有当挂起分组

    被确认或者缓存中积累了足够发送一个全尺寸分组的数据时,才会将缓存数据发送出去。

    3.2串行事务时延问题(该栏目下每个灰框表示一个TCP连接,黑线表示HTTP事务)

    所谓串行事务,打个比方,如果一个web页面有三张图片,那么浏览器就需要发起4个HTTP事务来显示此页面(HTML

    +3张嵌入的图片),倘若每个事务都需要一条新的TCP连接,那么每条连接的连接时延和慢启动时延就会叠加起来,造

    成最终加载页面的总时间增加,为此,有几种现存或者新兴的方法可以针对此问题进行处理从而提高HTTP连接性能。

    3.2.1并行连接

    所谓并行连接呢,顾名思义了,就是同时打开多条TCP连接,并行地执行多个HTTP事务,就上面的例子来讲,同时打开

    4条TCP连接,相比串行事务而言,性能上有一定提升。

    为什么说只是有一定的提升呢,因为并行连接的速度受限于网络带宽,先后打开了4条TCP连接,因为是并行地,他们会去

    竞争这有限的带宽,可能之前串行的时候事务1只要花费100ms完成,因为此时没有其他的事务与之竞争带宽,并行之后,

    可能需要300ms才能执行完这个事务,因为争夺到的带宽不足以使事务1的速度最大化。

    那么,可能有人就会说了,我家的网是200M光纤的,为什么访问百度的时候和别人20M的网速差不多呢,首先,网页数据

    量小差异不容易体现,其次服务器不会任由某个客户端并行地发起任意数量个TCP连接,倘若一个浏览器并行地打开100个

    连接,那100个浏览器就是并行地打开10000个连接啊,服务器可吃不消,实际上呢,浏览器确实使用了并行连接,但不是

    100个,通常是4个,并且服务器可以随意关闭来自特定客户端的超量连接(这或许就是之前我数据采集的时候下载10000+

    数据之后访问网站受限的原因了)

    但总的来说,并行连接,给人感觉还是比串行事务的处理方式快一点,4张图同时慢速地加载,和4张图分先后一次加载给人

    感觉上是不同的。

    3.2.2 持久连接

    我们知道,TCP连接的连接建立阶段以及慢启动是很耗时的,那么我为什么一次又一次地在这个阶段反复花时间呢,于是持

    久连接就出现了,打开TCP连接后,不关闭连接,等待下一个事务的进入,还是就之前的例子来说,建立第一次TCP连接之

    后,不关闭连接,事务2、3、4陆续进入这个连接直到事务结束才关闭连接,于是:

    相较之前的4个事务4次连接来说,这里少了3次TCP连接的步骤,自然时间上也就减少了,性能也就提升了。

     3.2.3持久连接+并行连接

    现在,很多web应用程序都会打开少量的并行连接,其中的每一个都是持久连接。

    持久连接有两种类型:HTTP/1.0+ "keep-alive"连接、HTTP/1.1 "persistent"

  • 相关阅读:
    Android消息队列模型——Thread,Handler,Looper,Massage Queue
    源代码管理十诫
    他们怎样读书和选书(汇总篇)
    Android消息处理机制
    互联网上的免费服务都是怎么赚钱的
    编程是一种对你的身体健康十分有害的工作
    ERROR/AndroidRuntime(716): java.lang.SecurityException: Binder invocation to an incorrect interface
    什么是 MIME Type?
    TCP/IP:网络因此互联
    Eclipse上GIT插件EGIT使用手册
  • 原文地址:https://www.cnblogs.com/eco-just/p/9375278.html
Copyright © 2011-2022 走看看