《HTTP权威指南》之HTTP连接管理及对TCP性能的考虑
在上一篇博客中(《HTTP权威指南》之HTTP相关概念详解)我们简单对HTTP相关的基本概念做了一些简单的了解,但未对HTTP连接管理的内容做一些详细的介绍。本篇博客我们就一起来看一下HTTP连接管理的相关内容。世界上几乎所有的HTTP通信都是有TCP/IP承载的,它是一种常用的分组交换网络分层协议集,同时它也是一种可靠的数据传输通道。它可以安全无误的把我们想要传输的数据传输到世界各地。也正是因为它的安全无误,HTTP的连接通信才选择采用TCP/IP传输,HTTP连接实际就是TCP连接及其使用规则。web浏览器与服务器通过TCP连接的交互如下图:
'
TCP流是通过分段、由IP分组传送
TCP数据是通过IP分组的小数据块来发送的。这样就形成了“HTTP OVER TCP OVER IP”的数据传输方式。http就是这种传输方式的最顶层。HTTP的安全版本HTTPS就是在HTTP和TCP之间插入了一个密码和加密层(成为TLS或SSL),TCP在传输数据时会以流的形式从一个打开的TCP连接中传输,在传输的过程中TCP流会分成一个个小数据库分不到各个IP分组里面。每个IP分组都包括:
l 一个IP分组收首部(包含源和目的IP地址、长度等)
l 一个TCP段首部((包含TCP端口号、控制标志等)
l 一个TCP数据块
保持TCP连接的正确性
如何保证数据传输过程中的正确性是TCP连接的一个首要任务,世界上那么多的计算机,怎么样才能正确的从源计算机的某个源应用传输到目的计算机的目的应用。TCP就是通过IP和端口号来保证这一连接的正确性的。TCP通过4个值来识别:
<源IP地址 源端口号 目的IP地址 目的端口号>
TCP数据流中的IP分组中小数据块形式:
TCP套接字编程
操作系统提供了一套操作TCP连接的工具,为了简单明了起见,我们来直接看一下TCP的编程接口。主要是Java的一些常用API
1.socket(family,type)
创建套接字对象,family=socket.AF_INET,type=socket.SOCK_STREAM(TCP)/socket.SOCK_DGRAM(UDP)
2.s.bind((host,port))
绑定套接字s以接收来自主机host在端口号port上的连接。host可以是空字符串(''),表示接受来自任何主机的连接。
3.s.listen(maxpending)
监听到该套接字的连接尝试,任何时候允许最多maxpending个排队的连接尝试。
4.s.accept()
s必须是TCP类型,接收一个连接请求并返回一个数据对(s1, (ipaddress, port))。s1是一个新连接的套接字。调用之前必须已经调用了s.bind和s.listen方法。
5.s.recv(bufsize)
从套接字接收最多bufsize个字节的数据,并返回一个由接收的数据组成的字符串。
6.s.sendall(string)
在套接字上按字节发送string字符串,该方法将会阻塞,直到所有的字节都被发送。
7.s.close()
关闭套接字。
8.s.recvfrom(bufsize)
从套接字接收最多bufsize个字节的数据,并返回一个元组(data, (ipaddr, port))。在使用UDP时很有用,可以接收来自多个发送方的数据。
9.s.sendto(string,(host,port))
在套接字上将string字符串按照字节发送到目的host和port上,并返回发送的字节数n。对UDP很有用,可以将数据发送到多个目的地。
10.s.connect((host, port))
将套接字s连接到给定host和port指定的服务器上。
对TCP性能的考虑
HTTP在TCP的上一层,位于应用层,对HTTP性能的考虑无非就是对TCP性能的考虑,在了解了TCP的性能优化之后就可以很好的理解HTTP的连接优化的相关特性了。这样我们在做应用开发的过程中就可以设计实现一些高性能的HTTP应用程序了。
1.HTTP事务时的延时
在一个HTTP事务的整个过程中的延时可以描述出TCP性能瓶颈的问题所在。下面我们从一个图中看一下TCP性能问题所在之处
从上图可以看出整个HTTP事务的延时主要有以下:
1).解析时延 DNS解析与DNS缓存
客户端首先需要根据URL确定Web服务器的IP地址和端口号,如果最近没有对URL中的主机名进行访问,那么DNS将URL中的主机名转换为IP地址可能会花费数十秒的时间。如果是近期访问过的主机名,那么在HTTP客户端的DNS缓存中,就会保存该主机名对应的IP地址。
2).连接时延 TCP连接的建立
接下来,客户端会向服务器发送一条TCP连接请求,并等待服务器回送一个请求接受应答。每条新的TCP连接都会有连接新建时延,这个时间虽然很短,但是如果一次性新建多条TCP连接,那么这个时延叠加起来就很长了。
3).传输时延 HTTP请求发送 HTTP响应返回
一旦连接建立起来之后,客户端就会通过新建的TCP信道来发送HTTP请求,数据到达时,web服务器会从TCP链接中读取请求报文,并处理。因特网传输请求报文以及服务器处理请求报文都需要时间
4).处理时延 HTTP报文处理
服务器会回送HTTP响应,这也需要花费时间。
2.延迟确认机制:保证数据传输的成功
每个TCP段都有一个序列号和一个数据完整性校验和。每个段的接收者收到完好的段时,都会向发送者回送一个小的确认分组。如果发送者没有在指定的窗口时间内收到确认信息,发送者就会认为分组已被破坏或损毁,并重发数据。
由于确认报文很小,所以TCP允许服务器在发往客户端的或者是客户端发往服务器的数据分组中队其进行“捎带”,将返回的确认信息和输出的数据分组结合在一起,更有效地利用网络。
为了增加确认报文找到同向传输数据分组的可能性,很多TCP栈都实现了一种“延迟确认”的算法。延迟确认算法会在一个特定的窗口时间爱你(通常是100~200ms)内将输出确认放在缓冲区中,以寻找能够捎带它的输出分组。如果在时间段内没有输出分数符合条件,那么确认信息就放到单独的分组中进行传送。
3.TCP网络延时分析
①.TCP连接的握手时延
建立一条新的TCP连接时,甚至是在发送任意数据钱,TCP软件之间会交换一系列的IP分组,对连接的有关参数进行沟通。如果连接只用来传送少量的数据,这些交换过程就会严重降低HTTP的性能。
TCP握手需要经过以下几个步骤:
1) 请求新的TCP连接时,客户端要服务器发送一个小的TCP分组,这个分组中设置了一个特殊的SYN标记,说明这是一个连接请求。
2) 如果服务器接收了连接,就会对一些连接参数进行计算,并向客户端回送一个TCP分组,这个分组中的SYN和ACK标记都被置位,说明连接请求已被接受
3) 最后,客户端向服务器回送一条确认信息,通知它连接已成功建立。现代的TCP栈都允许客户端在这个确认分组中发送数据
通常HTTP事务的交换数据量都不会太多,所以SYN/SYN+ACK握手就占用了大部分的时间。一般的小的HTTP事务可能会在TCP建立上花费50%,或更多的时间
改进方法:重用连接
②.TCP慢启动
TCP连接会随着时间进行自我调谐,起初会限制连接的最大速度,如果数据成功传输,会随着时间的推移提高传输的速度。这种调谐被称为TCP慢启动,用于防止因特网的突然过载和拥塞。
TCP慢启动限制了一个TCP端点在任意时刻可以传输的分组数。简单来说,每成功接收一个分组,发送端就有了发送另外两个分组的权限。当一个HTTP事务由大量数据要发送的时候,是不能一次性将所有分组都发送出去的,必须先发送一个分组,等待确认,然后可以发送两个分组,每个分组都必须被确认,这样就可以发送4个分组了,一次类推。这种方法被称为“打开拥塞窗口”。
改进方法:持久连接
③.用于捎带确认的TCP延迟确认
因特网无法确保可靠的分组传输,TCP协议实现自身的确认机制来保值数据的成功传输由于确认报文较小,TCP允许将返回的确认信息与同向的输出数据分组一起进行'捎带',而为了增加捎带概率采用延迟确认算法。 HTTP的双峰特征-请求应答行为降低了捎带信息的可能性,通常,延迟算法会导致一定的时延
④.数据聚集的Nagle算法
TCP发送大量包含数据的分组,会严重影响网络性能。Nagle算法试图在发送分组之前,绑定大量TCP数据,鼓励发送全尺寸的段,将数据缓存直至其他分组都被确认或者缓存中已足够全尺寸的段才会发送。这样就 引入了一些性能问题
1 小的HTTP报文可能无法填满一个分组,可能会因为等待不会到来的数据产生时延
2 与延迟确认算法交互存在问题。Nagle算法阻止数据发送,直到有确认分组抵达,但确认分组自身会被延迟确认算法延迟,因为它在等待捎带它的数据包
⑤.TIME_WAIT累积与端口耗尽
当某个TCP短点关闭TCP连接时,会在内存中维护一个小的控制块,用来记录所关闭的连接的IP地址和端口号。这个数据块通常只能存在一个小时间段。这个算法可以防止在短时间内创建、关闭具有相同IP和端口号的连接。
TIME_WAIT的作用:允许老的重复分组在网络中消失,防止最后ACK的丢失可靠地实现TCP全双工通信的终止
TCP连接四要素<源IP,源端口,目的IP,目的端口>,在一个客户端和一台服务器的情况下,其中三个都是固定的,只有源端口可以改变,客户端每次连接都会获得新的源端口,以实现连接唯一性
由于源端口的数量有限,而且在2MSL时间内连接无法重用,服务器连接率就会受限
解决办法:可以增加客服端负载生成器的数量,或者确保客户端和服务器端在使用几个虚拟IP地址以增加更多的连接组合。
http://blog.csdn.net/csh624366188/article/details/8597056
《HTTP权威指南》之HTTP连接管理及对TCP性能的考虑的更多相关文章
- HTTP权威协议笔记-4.连接管理
4.1 TCP连接 TCP为HTTP提供了一条可靠的比特传输管道,按顺序正确的传输,步骤如下: 浏览器解析主机名. 查询这个主机名的IP地址(DNS) 获得端口号. 浏览器对服务器该端口号发起连接. ...
- 《HTTP权威指南》4-连接管理
TCP连接 TCP/IP是全球计算机及网络设备都在使用的一种常见的分组交换网络分层协议集客户端应用程序可以打开一条TCP/IP连接.连接到可能运行在世界任何地方的服务器应用程序 TCP的可靠数据管道 ...
- TCP系列07—连接管理—6、TCP连接管理的状态机
经过前面对TCP连接管理的介绍,我们本小节通过TCP连接管理的状态机来总结一下看看TCP连接的状态变化 一.TCP状态机整体状态转换图(截取自第二版TCPIP详解) 二.TCP连接建立 ...
- TCP系列05—连接管理—4、TCP连接的ISN、连接建立超时及TCP的长短连接
一.TCP连接的ISN 之前我们说过初始建立TCP连接的时候的系列号(ISN)是随机选择的,那么这个系列号为什么不采用一个固定的值呢?主要有两方面的原因 防止同一个连接的不同实例(di ...
- ElasticSearch权威指南学习(索引管理)
创建索引 当我们需要确保索引被创建在适当数量的分片上,在索引数据之前设置好分析器和类型映射. 手动创建索引,在请求中加入所有设置和类型映射,如下所示: PUT /my_index { "se ...
- TCP系列08—连接管理—7、TCP 常见选项(option)
一.TCP选项概述 在前面介绍TCP头的时候,我们说过tcp基本头下面可以带有tcp选项,其中有些选项只能在连接过程中随着SYN包发送,有些可以延后.下表汇总了一些tcp选项 其中我标记为红色的部分是 ...
- TCP系列09—连接管理—8、TCP Reset
我们在介绍TCP头的时候,提到过其中有个RST标志位.当一个TCP报文中这个标志位打开的时候,我们叫做reset包(严格的说应该叫做reset段,但是很多时候段包帧并不加以区分)或者简单称呼为rese ...
- TCP系列06—连接管理—5、TCP fastopen(TFO)
一.TFO背景 当前web和web-like应用中一般都是在三次握手后开始数据传输,相比于UDP,多了一个RTT的时延,即使当前很多应用使用长连接来处理这种情况,但是仍然由一定比例的短连接,这额外多出 ...
- TCP系列04—连接管理—3、TCP连接的半打开和半关闭
在前面部分我们我们分别介绍了三次握手.四次挥手.同时打开和同时关闭,TCP连接还有两种场景分别是半打开(Half-Open)连接和半关闭(Half-Close)连接.TCP是一个全双工(Full-Du ...
随机推荐
- Oracle 已连接到空闲例程或ORA-01034: ORACLE not available
因为是本地数据库没有重要资料,所以可以随便自己折腾. 出现问题原因:从生产数据库导入一个表到本地库测试,因数据量过大,在导入4-5个小时后,手动中断导入.是否异常关机不能确定. 之后再打开数据库出现一 ...
- sqlServer sa用户登陆失败的解决办法
sqlserver sa用户登陆失败的解决办法 如下图以此模仿: 1.右键-属性 2.找到安全: 3.勾选如图: 4.sa用户密码重置: 5.服务重启:
- js Array操作
JS中数组的操作 1.数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长 ...
- 【题解】 UVa11292 The Dragon of Loowater
题目大意: 你的王国里有一条n个头的恶龙,你希望雇佣一些骑士把它杀死(即砍掉所有头).村里有m个骑士可以雇佣,一个能力值为x的骑士可以砍掉恶龙一个直径不超过x的头,且需要支付x个金币.如何雇佣骑士才能 ...
- ubuntu14.10,解决按照最新版Gnome 15.10后,经典Gnome桌面字体问题!
ubuntu14.10刚安装完毕,我首先按照了经典Gnome桌面,随后我发现ubuntu软件中心里面能找到的软件明显不如先前我安装过的ubuntu了,我觉得有可能是因为我以前安装的ubuntu14.1 ...
- xcode9 上传app后iTues 构建版本不显示
1.问题原因 苹果公司更新了ios10系统和xcode9以后,做了许多调整,如果开发者没有注意就会遇到这样那样的问题.作者在更新以后就遇到了上传app到appstore成功后,没有显示的问题.下面就介 ...
- virtueBox实现虚拟机的复制和粘贴
1.在设备--共享粘贴板--勾选双向. 2.在设备--拖放--勾选双向. 3.在设备--安装增强功能,然后进入虚拟机安装增强功能即可.
- request对象常用方法
String getParameter(String name)根据表单组件名称获取提交数据 Sring[] getParameterValues(String name)获取表单组件对应多个值时的请 ...
- 深度学习TensorFlow常用函数
tensorflow常用函数 TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU.一般你不需要显式指定使用 CPU 还是 GPU, Tensor ...
- 1.1、Logistics Regression模型
1.线性可分VS线性不可分 对于一个分类问题,通常可以分为线性可分与线性不可分两种 .如果一个分类问题可以使用线性判别函数正确的分类,则称该问题为线性可分.如图所示为线性可分,否则为线性不可分: 下图 ...