一,持久连接

什么是持久连接?对于HTTP协议而言,它是基于请求响应模型,Client向Server发请求时,先建立一条HTTP连接,Server给Client响应数据后,连接关闭。

当Client发送下一个请求时,需要重新再建立HTTP连接,这种方式就是:一个请求响应需要占用一条HTTP连接。而持久连接就是:只需要建立一条连接,然后在这条连接上 传输多个请求和响应。

与持久连接相关的字段

HTTP1.0中有一个Connection首部字段,它是一个逐跳首部字段。Connection:Keep-Alive,表示希望将此条连接作为持久连接。

HTTP1.1中,建立的HTTP请求默认是持久连接的。当Client确定不再需要向Server发送数据时,它可以关闭连接,即在发送首部中添加Connection:Closed字段。

二,如何提高HTTP请求的处理速度

①并行连接

Client一次向Server请求建立多个HTTP连接,每个HTTP连接上发一个请求,这样就可以并行地发多个请求获取响应数据。

比如,访问某个web页面,它上面有4幅图片,这些图片存储在不同的服务器上。那可以同时向服务器发4个HTTP请求去获取这四幅图片,而不是串行地依次发HTTP请求先获得第一幅图片,然后再发第二个HTTP请求获得第二幅图片....

并行连接,显然增加了服务器端的压力,要求服务器能够承载大量的HTTP请求。

②持久连接

持久连接的一个最大的好处是:大大减少了连接的建立以及关闭时延。

HTTP连接是建立在TCP协议之上的,建立一条TCP连接需要三次握手,TCP连接关闭时需要四次挥手。这些都是需要时间的。

而在第一点中提到:持久连接就是:只需要建立一条连接,然后在这条连接上 传输多个请求和响应。那么,就不需要频繁地建立连接,当前也就消除了连接建立以及关闭的时延了。

如图:多个请求响应在一条连接内完成了。但是,这里也看出一个“缺点”,请求响应是顺序执行的。只有在请求1的响应收到之后,才会发送请求2,这就是持久连接与管道化连接不同的地方。

③管道化连接

什么是管道化连接?

显然,管道化连接是需要持久连接支持的。管道化连接是在持久连接的基础上,以“流水线”的方式发送请求:不需要等到请求1的响应到达Client,就可以发送请求2....

HTTP连接如何正确地关闭?

HTTP连接的关闭需要注意这两个问题:HTTP连接是双向的;HTTP请求的幂等性。

连接是双向的

TCP连接是双向的,TCP连接的发送端和接收端都分别有:发送缓冲区和接收缓冲区,它们对应着输出信道和输入信道。

在JAVA中,JDK类库  java.net.Socket 类的 close()方法会关闭整个TCP连接,即输入信道和输出信道都被关闭了。

另外,Socket类还提供了两个方法:shutdownInput() 和 shutdownOutput(),前者用来关闭输入信道,后者用来关闭输出信道。

若只关闭其中TCP连接中的一条信道,则称之为半关闭。

一般而言,关闭连接的输出信道总是安全的。当你确定 以后都没有数据要发送到对方时,你可以把你的输出信道关闭了。

关闭输入信道有风险,可能会导致:连接被对端重置。

比如,在 服务器刚好把输入信道关闭时,客户端向服务器发起了请求,那此时客户端就会收到一条“连接被重置”的报文。在这种情况下,客户端的操作系统就会把客户端中的接收缓冲区里面的数据都清空。如果,此时客户端的应用程序还未来得及从接收缓冲区中取走数据,那么以前发送请求获得的数据也都被清空了!

因此, 正确的关闭HTTP连接的方式是:(以Client的视角来描述)

Client先关闭自己的输出信道(Client不能把自己的输入信道关闭了)。

然后Client周期性地轮询自己的输入信道的状态(比如,读取数据时,是不是 已经读到的 流的结尾了),如果读到了 流的结束标识符,那意味着Server发过来的数据都已经收到了。

总之,对于HTTP连接的双方而言,当不再需要传输数据时,双方都先把自己的输出信道关闭了,然后读取输入信道中的流,如果读到了末尾(比如流结束符返回-1),那么就可以正常关闭HTTP连接了。

参考资料:

《HTTP权威指南》第四章

《图解HTTP》

HTTP协议学习笔记---HTTP持久连接和如何正确地关闭HTTP连接的更多相关文章

  1. HTTP协议学习笔记(一)

    HTTP协议学习笔记(一) 1.HTTP协议用于客户端和服务端之间的通信 客户端:请求访问文本或图像等资源的一端服务端:提供资源响应的一端 在两台计算机之间使用HTTP协议通信时,在一条通信线路上必定 ...

  2. HTTP协议学习笔记(四)

    HTTP协议学习笔记(四) 与 HTTP 协作的 Web 服务器 一台 Web 服务器可搭建多个独立域名的 Web 网站,也可作为通信路径上的中转服务器提升传输效率. 1.用单台虚拟主机实现多个域名 ...

  3. HTTP协议学习笔记(三)

    HTTP协议学习笔记(三) 1.状态码告知从服务器端返回的请求结果 状态码的职责是当客户端向服务端向服务端发送请求时,描述返回的请求结果.借助状态码,用户可以知道服务端是正常处理了请求,还是出现了错误 ...

  4. HTTP协议学习笔记(二)

    HTTP协议学习笔记(二) 1.HTTP报文 HTTP报文:用于HTTP协议交互的信息.请求报文:请求端(客户端)的HTTP报文叫做请求报文.响应报文:响应端(服务端)的HTTP报文叫做响应报文. H ...

  5. TCP/IP协议学习笔记

    计算机网络基础知识复习汇总:计算机网络基础知识复习 HTTP协议的解析:剖析 HTTP 协议 一个系列的解析文章: TCP/IP详解学习笔记(1)-- 概述 TCP/IP详解学习笔记(2)-- 数据链 ...

  6. RSA算法、SSL协议学习笔记

    最近学习计算机网络,涉及到SSL协议,我想起了去年密码学课程讲过的非对称加密RSA算法,结合阮老师的博客,写写学习笔记,这里再回忆一下. RSA算法 RSA算法是一种非对称密码算法,所谓非对称,就是指 ...

  7. 网络协议学习笔记(二)物理层到MAC层,交换机和VLAN,ICMP与ping原理

    概述 之前网络学习笔记主要讲解了IP的诞生,或者说整个操作系统的诞生,一旦有了IP,就可以在网络的环境里和其他的机器展开沟通了.现在开始给大家讲解关于网络底层的相关知识. 从物理层到MAC层:如何在宿 ...

  8. 网络协议学习笔记(六)http和https

    概述 之前讲解了传输层的相关知识,现在讲解一下关于应用层的知识,主要是大家所熟悉的http和https,这2中是咱们最熟悉的协议了,但是也是最不熟悉的协议. HTTP协议:看个新闻原来这么麻烦 HTT ...

  9. 网络协议学习笔记(五)套接字Socket

    概述 前面学习网络知识的时候写过一篇关于套接字的随笔见<JAVA SOCKET 详解>,现在本人正在系统的学习网络知识,现在除了温故知新之外,在详细的学习记录一下套接字的知识. Socke ...

随机推荐

  1. delphi简单单向字符串加密函数

    delphi用久了有的时候得给密码加密一下,简单点就行了,这个函数还是不错的. const XorKey:array[0..7] of Byte=($B2,$09,$AA,$55,$93,$6D,$8 ...

  2. codeforces659B

    Qualifying Contest CodeForces - 659B Very soon Berland will hold a School Team Programming Olympiad. ...

  3. HTML5-Web SQL数据库

    Web SQL数据库API并不是HTML5规范的一部分,但是它是一个独立的规范,引入了一组使用SQL操作客户端数据库的API. 核心方法 openDatabase-使用现有的数据库或者新建的数据库创建 ...

  4. BZOJ1901Zju2112 Dynamic Rankings——树状数组套主席树

    题目描述 给定一个含有n个数的序列a[1],a[2],a[3]……a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1 ],a[i+2]……a[j]中第k小的数是多少(1≤k ...

  5. HDU5387-模拟水题

    模拟钟表的时分秒针的走动,给出时间求出夹角.注意每组输出要有一个空格 以后要想好再写代码,这样一个水题做了50分钟,太弱了... #include<cstdio> #include< ...

  6. P3760 [TJOI2017]异或和

    题目描述 在加里敦中学的小明最近爱上了数学竞赛,很多数学竞赛的题都是与序列的连续和相关的.所以对于一个序列,求出它们所有的连续和来说,小明觉得十分的简单.但今天小明遇到了一个序列和的难题,这个题目不仅 ...

  7. Catenyms POJ - 2337(单词+字典序输出路径)

    题意: 就是给出几个单词 看能否组成欧拉回路或路径  当然还是让输出组成的最小字典序的路 解析: 还是把首尾字母看成点   把单词看成边 记录边就好了 这题让我对fleury输出最小字典序又加深了一些 ...

  8. hdu 1025

    Problem Description JGShining's kingdom consists of 2n(n is no more than 500,000) small cities which ...

  9. 修改 wordpress 后台管理员登录地址

    拷贝根目录下的 wp-login.php文件命名为wp-login.php.backup,把原文件重命名为managewp.phpsed -i "s/wp-login.php/managew ...

  10. 数据挖掘(二)用python实现数据探索:汇总统计和可视化

    今天我们来讲一讲有关数据探索的问题.其实这个概念还蛮容易理解的,就是我们刚拿到数据之后对数据进行的一个探索的过程,旨在了解数据的属性与分布,发现数据一些明显的规律,这样的话一方面有助于我们进行数据预处 ...