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权威指南》这本书中的内容。。。
http协议进阶(五)连接管理的更多相关文章
- HTTP权威协议笔记-4.连接管理
4.1 TCP连接 TCP为HTTP提供了一条可靠的比特传输管道,按顺序正确的传输,步骤如下: 浏览器解析主机名. 查询这个主机名的IP地址(DNS) 获得端口号. 浏览器对服务器该端口号发起连接. ...
- TCP系列02—连接管理—1、三次握手与四次挥手
一.TCP连接管理概述 正如我们在之前所说TCP是一个面向连接的通信协议,因此在进行数据传输前一般需要先建立连接(TFO除外),因此我们首先来介绍TCP的连接管理. 通常一次完整的TCP数据传输一般包 ...
- (转)OpenFire源码学习之十:连接管理(上)
转:http://blog.csdn.net/huwenfeng_2011/article/details/43415827 关于连接管理分为上下两部分 连接管理 在大并发环境下,连接资源 需要随着用 ...
- 图解 HTTP 连接管理
熟悉我的小伙伴都知道,我之前肝了本<HTTP 核心总结>的 PDF,这本 PDF 是取自我 HTTP 系列文章的汇总,然而我写的 HTTP 相关内容都是一年前了,我回头看了一下这本 PDF ...
- 转-HttpClient4.3 连接管理
转 http://www.yeetrack.com/?p=782 2.1.持久连接 两个主机建立连接的过程是很复杂的一个过程,涉及到多个数据包的交换,并且也很耗时间.Http连接需要的三次握手开销很大 ...
- 【转】Oracle RAC 环境下的连接管理
文章转自:http://www.oracle.com/technetwork/cn/articles/database-performance/oracle-rac-connection-mgmt-1 ...
- SOFA 源码分析 — 连接管理器
前言 RPC 框架需要维护客户端和服务端的连接,通常是一个客户端对应多个服务端,而客户端看到的是接口,并不是服务端的地址,服务端地址对于客户端来讲是透明的. 那么,如何实现这样一个 RPC 框架的网络 ...
- Netty中的连接管理
连接管理是我们首先需要关注的,检测空闲连接以及超时对于及时释放资源来说是至关重要的.由于这是一项常见的任务,Netty特地为它提供了几个ChannelHandler实现. 用于空闲连接以及超时的Cha ...
- http协议及长连接和短连接
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...
- Oracle RAC 环境下的连接管理(转) --- 防止原文连接失效
崔华老师的文章!!! 这篇文章详细介绍了Oracle RAC环境下的连接管理,分别介绍了什么是 Connect Time Load Balancing.Runtime Connection Load ...
随机推荐
- 简单的SQL注入之3
Topic Link http://ctf5.shiyanbar.com/web/index_3.php 1)测试正确值submit:1 测试目标和对象要明确: 2)单引号测试(判断存在字符型注入&a ...
- JDK源码分析(4)之 LinkedList 相关
LinkedList的源码大致分三个部分,双向循环链表的实现.List的API和Deque的API. 一.定义 public class LinkedList<E> extends Abs ...
- Java多线程概念简介 多线程中篇(一)
Java的线程与操作系统的线程 在线程的相关介绍中,有讲到“线程的实现”分为三种:内核支持,用户级以及两者混合.(这只是一种简要的分类) Java线程在JDK1.2之前,是用户线程实现的 而在JD ...
- [十]基础数据类型之Unicode编码简介
编码含义 关于编码的含义,之前也说过,计算机只能存储二进制序列 所以对于字符,保存的时候,需要进行编码为二进制,进行存储 呈现的时候,需要将二进制进行解码,转换成字符的形式 有很多种编码方式,比如 ...
- grafana使用详解--技术流ken
grafana简介 Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知.它主要有以下六大特点: 1.展示方式:快速灵活的客户端图表,面板插件有 ...
- SpringCloud系列——Feign 服务调用
前言 前面我们已经实现了服务的注册与发现(请戳:SpringCloud系列——Eureka 服务注册与发现),并且在注册中心注册了一个服务myspringboot,本文记录多个服务之间使用Feign调 ...
- vs2017安装pygame,vs2017安装python第三方包
vs2017有独立的python环境:所以想在vs2017开发python并使用第三方包,需要在vs2017中操作,完成第三方包的安装. 一,查看vs2017有哪些版本的python,当前使用的是哪个 ...
- 6.JAVA-链表实例
1.实现链表的步骤 1).实现Node节点类(用来保存链表中每个节点的数据,以及下一个节点成员) 2).实现LinkList链表类(用来封装Node节点类,和用户实现交互) 3).在LinkList类 ...
- Java开发笔记(七十)Java8新增的几种泛型接口
由于泛型存在某种不确定的类型,因此很少直接运用于拿来即用的泛型类,它更经常以泛型接口的面目出现.例如几种基本的容器类型Set.Map.List都被定义为接口interface,像HashSet.Tre ...
- 开源前端脚本错误监控及跟踪解决项目BadJS试用
摘要: 试用BadJS. 原文:开源前端脚本错误监控及跟踪解决项目-BadJS 试用 作者:过错 Fundebug经授权转载,版权归原作者所有. BadJS 是 一个web 前端脚本错误监控及跟踪项目 ...