连接管理

1. TCP连接

HTTP连接实际上就是TCP连接和一些使用连接的规则。
TCP连接是因特网上的可靠连接。TCP为HTTP提供了一条可靠的比特传输管道。从TCP连接一端填入的字节会在另一端以原有的顺序、正确地传送出来。

TCP流是分段的、由IP分组传送的。HTTPS在HTTP层与TCP层之间增加了一个称为TSL或SSL的密码加密层。


HTTP与HTTPS

HTTP要传送一条报文时,会以流的形式将报文数据的内容通过一条打开的TCP连接按序传输。TCP收到数据流之后,会将数据流砍成被称作段的小数据块,并将段封装在IP分组中,通过因特网进行传输。
每个TCP段都是由IP分组承载,从一个IP地址发送到另一个IP地址的。每个IP分组中都包括:

  • 一个IP分组首部(通常为20字节)
  • 一个TCP分组首部(通常为20字节)
  • 一个TCP数据块(0个或多个字节)

IP首部包含了源和目的IP地址、长度和其它一些标记。TCP段的首部包含了TCP端口号、TCP控制标记,以及用于数据排序和完整性检查的一些数值。
在任意时刻,每一个计算机都可以有几条TCP连接处于打开状态。TCP连接是通过4个值来识别的:
<源IP地址、源端口号、目的IP地址、目的端口号>
这4个值一起唯一地定义了一条连接。

2. 影响HTTP性能的因素

  • DNS解析时延
  • TCP握手时延
  • HTTP报文请求、处理与响应时延
  • 延迟确认
    由于因特网自身无法确保可靠的分组传输(因特网路由器超负荷的话,可以随意丢弃分组),所以TCP实现了自己的确认机制来确保数据的成功传输。
    每个TCP段都有一个序列号和数据完整性校验和。每个段的接受者接收到完好的段时,都会向发送者回送小的确认分组。如果发送者没有在指定的窗口时间内收到确认信息,发送者就认为分组已被破坏或损毁,并重发数据。
    由于确认分组很小,为了有效地利用网络,TCP允许在发往相同方向的输出数据分组中对其进行“捎带”。为了增加确认报文找到同向传输数据分组的可能性,很多TCP栈都实现了一种“延迟确认”算法。“延迟确认”算法会在一个特定的窗口时间内(通常是100~200毫秒)将输出确认存放到缓冲区中,以寻找能够捎带它的输出数据分组。如果在那段时间内没有输出数据分组,就将输出确认放在单独的分组中传送。
  • 慢启动拥塞控制
  • Nagle算法
    Nagle鼓励发送全尺寸的段。只有当所有其他分组都被确认之后,Nagle算法才允许发送非全尺寸的分组。
    Nagle算法会引起几种HTTP性能问题。首先,小的HTTP报文可能无法填满一个分组,可能会因为等待那些永远都不会到来的额外数据而产生时延。其次,Nagle算法与延迟确认之间的交互存在交互问题——Nagle算法会阻止数据的发送,直到有确认分组到达为止,但确认分组自身会被“延迟确认”算法延迟100~200毫秒。
  • TIME_WAIT时延和端口耗尽

3. HTTP性能的提升方式

  • 并行连接
    并行连接的速度可能会更快,但不一定总是更快。而且,打开大量连接会消耗很多内存资源,从而引发自身的性能问题。实际上,浏览器确实使用了并行连接,但它们会将并行连接的数量限制在一个较小的值(通常是4个)。服务器可以随意关闭来自特定客户端的超量连接。
    并行连接的缺点:
  • 每个事务都会打开/关闭一条新的连接,会耗费时间和带宽
  • 由于TCP慢启动特性的存在,每条连接的性能都会有所降低
  • 可打开的并行连接的数量实际上是有限的
  • 持久连接
    在事务处理结束之后仍然保持在打开状态的TCP连接被称为持久连接。重用已对目标服务器打开的空闲持久连接,可以避开缓慢的连接建立阶段。而且,已经打开的连接还可以避免慢启动的拥塞适应阶段,以便更快速地进行数据的传输。
    持久连接配合并行连接使用可能是最高效的方式。现在,很对Web应用程序都会打开少量的并行连接,每一条并行连接都是持久连接。
    持久连接有两种类型:比较老的HTTP/1.0+“keep-alive”连接,以及现代的HTTP/1.1“persistent”连接。
  • HTTP/1.0+ “keep-alive”连接
    实现HTTP/1.0 keep-alive连接的客户端可以通过包含Connection: Keep-Alive首部请求将一条连接保持在打开状态。
    如果服务器愿意为下一条请求将连接保持在打开状态,就在响应中包含相同的首部。如果响应中没有Connection: Keep-Alive首部,客户端就认为服务端不支持keep-alive,会在发回响应报文之后将连接关闭。
    Keep-Alive选项
  1. 参数timeout是在Keep-Alive响应首部发送的。它估计了服务器希望将连接保持在活跃状态的时间。这并不是一个承诺值。
  2. 参数max是在Keep-Alive响应首部发送的。它估计了服务器还希望为多少个事务保持此连接的活跃状态。这并不是一个承诺值。
  • HTTP/1.1 “persistent”连接
    与HTTP/1.0+的Keep-Alive连接不同,HTTP/1.1的持久连接在默认情况下是激活的。要在事务处理结束之后将连接关闭,HTTP/1.1应用程序必须向报文中显示地添加一个Connection: close首部。
  • 管道化连接
    HTTP/1.1允许在持久连接上可选地使用请求管道。在响应到达之前,可以将多条请求放入队列。当第一条请求通过网络流向另一端的服务器时,第二条和第三条请求也可以开始发送了。在高时延网络环境下,这样做可以降低网络的环回时间,提高性能。
    使用管道化连接的限制:
  • 如果HTTP客户端无法确认连接是持久的,就不应该使用管道。
  • 必须按照与请求相同的顺序回送HTTP响应。
  • HTTP客户端必须做好连接会在任意时刻关闭的准备,还要准备好重发所有未完成的管道化请求。
  • HTTP客户端不应该用管道化的方式发送会产生副作用的请求(比如POST)。因为出错的时候,客户端无法了解服务端到底执行了请求序列中的哪些请求,而像POST这种非幂等请求是不能随便地重试的,所以出错时,就存在某些方法永远不会被执行的风险。

4. 正确地关闭连接

  • Content-Length及截尾操作
    每条HTTP响应都应该有精确的Content-Length首部,用以描述响应主体的尺寸。一些老的HTTP服务器会省略Content-Length首部或者包含错误的长度指示,这样就要依赖服务器发出的连接关闭来说明数据的真实结尾。
  • 正常关闭连接
    实现正常关闭的应用程序应该首先关闭它们的输出信道,然后等待连接另一端的对等实体关闭它的输出信道。当两端都告诉对方它们不会再发送任何数据之后,连接就会被完全关闭。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,294评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,493评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,790评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,595评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,718评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,906评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,053评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,797评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,250评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,570评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,711评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,388评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,018评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,796评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,023评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,461评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,595评论 2 350

推荐阅读更多精彩内容

  • Http事务的时延:(1)TCP建立连接握手(2)TCP慢启动拥塞控制(3)数据聚集的Nagle算法(4)用于捎带...
    shuixingge阅读 980评论 0 0
  • 套接字流程 相关概念 keep-alive HTTP/1.1 持久连接 管道化连接 连接关闭
    心无君阅读 453评论 0 0
  • 六、夜独 陨阳已唤起 天际的血色, 云层叠叠积积 为光明送行。 黑暗的爪 在草丝的影的纤细中 零碎尖利泛寒, 昏晚...
    石莨阅读 141评论 0 1
  • 惊鸿一瞥吾心倾 心之所慕亦有情 此生无忧尽相拥 黄粱一梦皆是空
    寻常也醉人阅读 178评论 0 0
  • 19日完成情况 1. catia视频2个 get 2.ppt0.5-1h get 3.看书15m fall 4....
    郑艺_22e6阅读 147评论 0 0