005_关于HTTP协议中的保持连接
缘起
中午在群里讨论,用ab测试 一台只提供静态文件服务, 不与其他任何系统交互的时候,为什么也会产生大量的TIME WAIT状态的。
首先,我们可以简单的理解,在TCP连接的两端,谁主动断开连接(先发送FIN包),谁进入TIME WAIT,谁被动断开连接(后发送FIN包),谁进入CLOSE WAIT状态。
那么,由此可以推断,在这个场景中,server是主动断开连接的一方,那么server为什么会主动断开呢, 这就涉及到HTTP里关于keepalive的内容了。
我们常常听说keepalive能提高webserver的性能, 但是为什么呢? 这里暂且不解释,说完下面的内容,就清楚了。
分析
在HTTP协议中, 除了需要服务器支持并打开keepalive之外, 还有一个重要的请求头Connection需要注意。
我们来看下面一个请求:
GET /? HTTP/1.1
Accept: */*
Cache-Control: no-cache
Connection: close
Host: 127.0.0.1
User-Agent: Apache-HttpClient/4.3.2 (java 1.5)
Accept-Encoding: gzip,deflate
这是我通过Idea 的REST Client 插件发送的一个请求, 我们看到 Connection头的值是close,抓包看一下请求过程
可以看到, 在server响应完成后, 发送了FIN 包, 主动断开连接, 这很好理解。
在来看一个请求:
GET /? HTTP/1.1
Accept: */*
Cache-Control: no-cache
Connection: keep-alive
Keep-Alive: 5
Host: 127.0.0.1
User-Agent: Apache-HttpClient/4.3.2 (java 1.5)
Accept-Encoding: gzip,deflate
可以看到, 这个请求里, Connection的值变成了keep-alive, 并且多了一个Keep-Alive头,值为5。再抓包看看这次请求:

可以看到, server在响应完成后,并没有发送FIN包关闭连接, 而是一段时间后,客户端发送FIN包,关闭连接, 如果你看第二列, time会发现,正好是大约5秒后,客户端发送了FIN包, 这个数值正好是 Keep-Alive头的值。事实上,Keep-Alive头的语义就是客户端保持连接多少秒。
以上的测试, server配的keepalive都是65s, 我们来把它0, 再来测试一遍看看。
客户端Connection头为close的情况:

客户端Connection为keep-alive, Keep-Alive为5的情况

可以看到,server主动断开连接。
最后一个场景, server配置keepalive为3, client Connection为keep-alive, Keep-Alive为5的情况

可以看到,请求结束大约3秒后(主要时间戳),server发送FIN主动断开连接。
结论
说了这么多,是时候总结一下了,关于keepalive主要有一下几点:
Connection头控制客户端是否开启,close不开启,keep-alive开启Keep-Alive头控制客户端保持连接的时间- 在开启
keepalive的时候, 谁先到保持连接的时间,谁先发FIN包,主动关闭连接。
005_关于HTTP协议中的保持连接的更多相关文章
- HTTP协议中的长连接和短连接(keep-alive状态)
什么是长连接 HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包.不四次握手),等待在同 ...
- HTTP协议中的长连接、短连接、长轮询、短轮询
长连接.短连接,指的是TCP连接.长连接是为了复用TCP连接. 长轮询中,服务器如果检测到库存量没有变化的话,将会把当前请求挂起一段时间(这个时间也叫作超时时间,一般是几十秒).在这个时间里,服务器会 ...
- http协议中客户端8种请求方法
http请求中的8种请求方法 1.opions 返回服务器针对特定资源所支持的HTML请求方法 或web服务器发送*测试服务器功能(允许客户端查看服务器性能) 2.Get 向特定资源发出请 ...
- 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...
- HTTP协议中的短轮询、长轮询、长连接和短连接
HTTP协议中的短轮询.长轮询.长连接和短连接 引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接 ...
- 转---谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
作者:伯乐在线专栏作者 - 左潇龙 http://web.jobbole.com/85541/ 如有好文章投稿,请点击 → 这里了解详情 引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此 ...
- 谈谈HTTP协议中的短轮询、长轮询、长连接和短连接
引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...
- 蓝牙协议分析(7)_BLE连接有关的技术分析
转自:http://www.wowotech.net/bluetooth/ble_connection.html#comments 1. 前言 了解蓝牙的人都知道,在经典蓝牙中,保持连接(Connec ...
- http协议中用于上传多个文件的 multipart 字段
大家好,我是许飞,微软拼音的开发实习生.在网络编程中,经常用到从服务器上“下载”一些数据,有时却要向服务器“上传”数据.曾在一个原型中使用了“multipart/form-data”格式向Web服务器 ...
随机推荐
- ZABBIX 3.4 监控服务器TCP连接状态(六)
TCP的连接状态对于我们web服务器来说是至关重要的,尤其是并发量ESTAB:或者是syn_recv值,假如这个值比较大的话我们可以认为是不是受到了攻击,或是是time_wait值比较高的话,我们要考 ...
- 总结那些有默认margin,padding值的html标签
一.h1~h6标签:有默认margin(top,bottom且相同)值,没有默认padding值. 在chrome中:16,15,14,16,17,19; 在firefox中:16,15,14,16, ...
- php 防止sql注入的简单方法
您可以使用PHP的功能,如函数stripslashes()和addslashes(),mysql_real_escape_string()等,使安全的SQL查询. 以下是安全的SQL语句,使用PHP ...
- selenium_采集药品数据2_采集所有表格
Python爬虫视频教程零基础小白到scrapy爬虫高手-轻松入门 https://item.taobao.com/item.htm?spm=a1z38n.10677092.0.0.482434a6E ...
- 20190320 Dojo常用方法总结
0. 使用环境 Dojo版本:1.14.2 此次总结以dojo的base为主,即不需要手动引入组件 1. 常用不归类方法 1.1. dojo.addOnLoad 在页面加载完成并且dojo.requi ...
- HashMap按照value排序的实现
一.实现的思想 将HashMap中的元素按照Entry<Key,Value>类型存入到LinkedList集合中. 实现自定义排序,对LinkedList集合排序. LinkedList集 ...
- centOS7环境下安装jdk1.8
首先下载jdk1.8 去官网下载jdk:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151. ...
- Idea默认的全局设置,如Maven等
每次使用IDEA打开一个新的项目,maven都需要重新配置,非常不开心,所以需要有个默认全局配置,打破不开心 配置完就OK了 公众号 欢迎关注我的公众号“码上开发”,每天分享最新技术资讯.最优原创文章 ...
- 循环屏障CyclicBarrier以及和CountDownLatch的区别
CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier).它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障时,屏障才会开门, ...
- SQL语句(一)SQL和数据库数据表的创建
SQL的组成 (1) 数据定义语言DDL(Data Definition Language) 用于数据库和数据表的创建.修改和删除等操作 CREATE (create) 创建数据库.数据表 ALTER ...