http协议进阶(五)连接管理

几乎所有的HTTP通信都是由TCP/IP承载的,TCP/IP是全球计算机网络设备都在使用的一种分组交换网络分层协议集。

它的特点是只要连接建立,客户端与服务器之间的报文交换就永远不会丢失、受损或失序。

一、TCP连接

1、TCP是可靠数据通道

TCP是英特网上的可靠连接,TCP为HTTP提供了一条可靠地比特传输通道,从TCP连接一端填入的字节会从另一端以原有的顺序、正确的传送出来。

TCP会按序、无差错的承载HTTP数据,如下图:

2、TCP流是分段的,由IP分组传送

TCP的数据是通过名为IP分组的小数据块发送的,HTTP就是“HTTP over TCP over IP”这个“协议栈”中的最顶层,其安全版本HTTPS就是在HTTP和TCP之间插入一个(TLS或SSL)密码加密层。

如下图所示:

HTTP在传送一条报文时,会以流的形式将报文数据通过打开的TCP连接按序传输。TCP收到数据流之后,将其划分为被称为段的小数据块,封装在IP分组中,通过英特网进行传输。

每个TCP段都是由IP分组承载,从一个IP地址发送到另一个IP地址,其中包括:

①、一个IP分组首部(通常为20字节):包含源和目的IP地址、长度和其他一些标记;

②、一个TCP 段首部(通常为20字节):包含TCP端口号、TCP控制标记以及用于数据排序和完整性检查的数据值;

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

3、保持TCP连接不断运行

TCP通过端口号来保持连接持续不断的运行。IP地址可以连接到正确的计算机,端口号可以连接到正确的应用程序,TCP连接通过四个值来识别:

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

这四个值唯一的定义了一个连接(两条不同的TCP连接不能拥有4个完全相同的地址组件值,不同连接部分可以拥有同样的值)。

4、TCP套接字

操作系统提供了一些操纵TCP连接的编程接口,即套接字API,这个套接字API隐藏了所有的TCP和IP实现细节,下表是一些套接字API的主要接口:

套接字API调用 描述
s= socket(<sparameters>) 创建一个新的、未命名、未关联的套接字
bind(s,<local IP:port>) 向套接字赋一个本地端口号和接口
connect(s, <remote IP:port>) 创建一条连接本地套接字与远程主机及端口的连接
listen(s,...) 标识一个本地套接字,使其可以合法接受连接
s2 = accept(s) 等待某人建立一条到本地端口的连接
n = read(s, buffer, n) 尝试从套接字向缓冲区读取n个字节
n = write(s, buffer, n) 尝试从缓冲区中向套接字写入n个字节
close(s) 完全关闭TCP连接
shutdown(s,<side>) 只关闭TCP连接的输出或输入端
getsockopt(s,...) 读取某个内部套接字配置选项的值
setsockopt(s,...) 修改某个内部套接字配置选项的值

套接字API允许用户创建TCP的端点数据结构,将其与远程服务器的TCP端点进行连接,并对数据流进行读写。

TCP API隐藏了所有底层网络协议的握手细节,以及TCP数据流与IP分组之间的字段和重装细节。

二、TCP性能

1、HTTP事务的时延

首先来看一个HTTP请求的过程,如下图:

一般来说,相比于建立TCP连接及传输请求和响应报文的时间,事务处理时间可能是很短的(除非客户端或服务端超载或正在处理复杂的动态资源),否则HTTP时延是由TCP网络时延造成的。

http事务时延的原因有以下几点:

①、DNS将服务器域名转换解析为一个IP地址所花费的时间;

②、客户端向服务端发送一个TCP连接请求所造成的时延(一般不会花费很多时间,但如果有很多的HTTP事务的话,时延就会变大);

③、服务端处理请求报文以及回传给客户端,都需要花费一定的时间;

④、服务器回送HTTP响应,也会花费一定的时间;

2、性能聚焦区域

常见的TCP相关时延如下:

①、TCP连接建立握手;

如下图,新建TCP连接时会交换一系列的IP分组,对连接的有关参数进行沟通,如果连接只用来传送少量数据,交换的过程就会严重降低HTTP性能。

②、TCP慢启动拥塞机制;

TCP连接刚建立时为了防止网络突然过载和拥塞,会限制链接的最大速度,如果数据成功传输,会随着时间的推移提高传输速度。

③、数据聚集的Nagle算法;

④、用于捎带确认的TCP延迟确认算法;

⑤、TIME_WAIT时延和端口耗尽;

三、HTTP连接处理

目前现存和常用的连接方法大概有一下四种:

1、串行连接

最早的连接方式,即HTTP事务需要按顺序进行传输,等待服务端完成处理并回传,如下图所示:

这样做有两个缺点:

①、TCP性能时延会不断叠加;

②、在请求处理完成之前,客户端无法对结果进行提前展示,只能被动等待;

2、并行连接

通过多条TCP连接发情并发的HTTP请求,如下图所示:

并行连接有如下几个特点:

①、可能会提高页面加载速度,即连接请求和传输时间重叠,减小了连接时延和传输时延,但每个事务都会打开/关闭一个新的连接,耗费时间和带宽;

②、可以让用户“感觉更快”(与WEB页面渲染的异步展示类似的原理),但实际上,由于TCP慢启动特性的存在,每个新连接的性能都会有所降低,且并行链接数量有限;

③、并行连接不一定比串行连接块(受限于带宽,可能造成资源竞争);

3、持久连接

重用TCP连接,以消除连接及关闭时延,持久连接+并行连接,可能是最高效的连接方式,如下图所示:

持久连接有两种方式,分别为HTTP/1.0+的“Keep-alive”连接,以及HTTP/1.1的“persistent”连接。

Keep-alive:该首部只是请求将连接保持在活跃状态,客户端和服务端可以随时关闭空闲的Keep-alive连接。

限制和规则

①、必须客户端发送一个Connection:Keep-alive请求首部来激活Keep-alive连接;

②、该首部必须随请求的报文一起发送;

③、只有在确定实体主体部分大小的情况下,连接才能保持在打开状态;

④、代理和网关必须执行Connection首部的规则;

Persistent:该首部默认情况下是激活的,除非特别指明,否则HTTP/1.1假定所有连接都是持久的。

限制和规则

①、如果需要在事务处理结束后将连接关闭,则应用程序必须向报文中显式的添加一个Connection-close首部;

②、只有当连接上所有报文都有正确的、自动以报文长度时,连接才能持久保持;

③、每个持戒连接都只适用于一跳传输;

④、应用程序可以在任意时刻关闭连接,但应该能够从异步关闭中恢复,重试这条请求;

⑤、一个客户端对任何服务器或代理最多只能维护2条持久连接;

4、管道化连接

通过共享TCP连接发起并发的HTTP请求,这也是在持久连接的基础上对性能的一种优化。

原理:在响应到达前,将多条请求放入队列,在高延时网络条件下,可以降低网络环回时间,提高性能。

限制和规则

①、如果HTTP客户端无法确认连接是持久的,就不应使用管道连接;

②、必须按照与请求相同的顺序回送HTTP响应;

③、客户端必须做好连接会在任何时刻关闭的准备,以及重发所有未完成的管道化请求;

④、HTTP客户端不应用管道化的方式发送非幂等性请求(比如POST);

四种不同连接方式的区别:

某些关于请求和响应首部的字段详细介绍,可以参考《HTTP权威指南》这本书中的内容。。。

时间: 2024-11-06 20:08:23

http协议进阶(五)连接管理的相关文章

(转)OpenFire源码学习之十:连接管理(上)

转:http://blog.csdn.net/huwenfeng_2011/article/details/43415827 关于连接管理分为上下两部分 连接管理 在大并发环境下,连接资源 需要随着用户并发访问量的增加而增加,所以可伸缩的连接资源就是支持大访问量的关键技术.openfire系统通过增加独立部署的连接管理器程序提高并发的能力,连接管理的前端是一台负载均衡设备,它负责把用户访问分配到指定连接管理器,多台连接管理器在访问服务器.使用连接管理器后,服务器的连接池是提供给连接管理器连 接,

IOS之--UI进阶-- 多控制器管理第一天

 iOS之--UI进阶-- 多控制器管理第一天 01-项目中常见的文件(LaunchScreen) Xcode5 框架是苹果事先已经导入进去的.在项目的结构当中就能够看到导入的框架. Xcode6 会自动导入一些觉见的框架.在项目结构当中,看不到已经导入的框架. LaunchScreen.xib:用来设置启动界面. Xcode7 会自动导入一些觉见的框架.在项目结构当中,看不到已经导入的框架. LaunchScreen.storyBoard LaunchScreen原理: 会自动加载Launch

HttpClient4.3教程 第二章 连接管理

2.1.持久连接 两个主机建立连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间.Http连接需要的三次握手开销很大,这一开销对于比较小的http消息来说更大.但是如果我们直接使用已经建立好的http连接,这样花费就比较小,吞吐率更大. HTTP/1.1默认就支持Http连接复用.兼容HTTP/1.0的终端也可以通过声明来保持连接,实现连接复用.HTTP代理也可以在一定时间内保持连接不释放,方便后续向这个主机发送http请求.这种保持连接不释放的情况实际上是建立的持久连接.Ht

Oracle RAC 环境下的连接管理(转) --- 防止原文连接失效

崔华老师的文章!!! 这篇文章详细介绍了Oracle RAC环境下的连接管理,分别介绍了什么是 Connect Time Load Balancing.Runtime Connection Load Balancing.Connect Time Connection Failover 和 Runtime Connection Failover,以及里面所涉及到的 TAF.ONS.FCF.FAN.LBA 等诸多知识点.本文主要是针对 Oracle RAC 11gR2 环境下的连接管理,但同时也会对

TCP的运输连接管理

TCP的运输连接管理 TCP是面向连接的协议,有三个阶段:连接建立.数据传送 和 连接释放.运输连接的管理就是使运输连接的简历和释放都能正常地进行. 在TCP连接建立过程中要解决一下三个问题: 1.  要使每一方都能够确知对方的存在: 所以需要三次握手. 2.  要允许双方协商一些参数(如最大窗口值.是否使用窗口扩大选项和时间戳选项以及服务质量等). 3.  能够对运输实体资源(如缓存大小.连接表中的项目等)进行分配:建立TCB. TCP连接的建立采用跟客户-服务器模式.主动发起连接建立的应用进

HttpClient 4.3.6教程 第2章 连接管理 【翻译】

第2章 连接管理 2.1 持久连接 一个主机与另一端建立连接是十分复杂的,并且两个终端间要交换多个信息包,这会耗费不少时间.对于低级的HTTP消息来说握手连接是尤其重要的.如果在执行多个请求时重复使用公共的连接,那么就能大大提高数据吞吐率.HTTP/1.1默认允许HTTP连接可以被多个请求复用.HTTP/1.0也兼容终端为了多个请求去使用一个明确的机制来优先保持活跃的连接.HTTP代理也能在一定的同期时间里保持活跃的空闲连接,以免同样的目标主机随后还要请求.这种保持活跃连接的能力通常都会涉及持续

Python爬虫进阶五之多线程的用法

前言 我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 首先声明一点! 多线程和多进程是不一样的!一个是 thread 库,一个是 multiprocessing 库.而多线程 thread 在 Python 里面被称作鸡肋的存在!而没错!本节介绍的是就是这个库 thread. 不建议你用这个,不过还是介绍下了,如果想看可以看看下面,不想浪费时间直接看 multiprocessing 多进程 鸡肋点 名言: "Pyt

Visual Studio2015下连接管理Global Azure Database

说到vistual studio相信大家已经不陌生了,当然对于开发人员来说.同时又说到windows azure的部分服务的部署,我们可以使用Visual Studio2015连接到windows azure,然后创建部分房屋.现在很多人应该用到了vistual studio2013,但是我是微软的粉丝.微软只要更新出新产品都会迫不及待的取尝试.现在微软vistual studio更新到了2015了,功能就不说了,需要大家自己去官网下载使用.在此我下载了vistual studio2015最新版

boost::asio 连接管理11 如何关闭连接

在实际产品运行中,对连接管理有了更新的认识,这里分享一下. shared_ptr管理连接对象的生命周期 shared_ptr的引用计数器决定了连接对象的生命周期.这里我说的连接对象就是在我的前文:http://blog.csdn.net/csfreebird/article/details/8522620 中的Client对象: [cpp] view plaincopyprint? #include "core/connection.h" #include <vector>

Openfire分析之三:ConnectionManager 连接管理(1)

Openfire是怎么实现连接请求的? XMPPServer.start()方法,完成Openfire的启动.但是,XMPPServer.start()方法中,并没有提及如何监听端口,那么Openfire是如何接收客户端的请求? 因为Openfire的核心功能,是通过Module来管理的,那么对应的连接管理应该就在Module中. 查看在XMPPServer.loadModules()方法中,有如下代码: //Load this module always last since we don't