TCP中的KeepAlive与HTTP中的Keep-Alive
KeepAlive 与 Keep-Alive
前言
昨天被问到了HTTP中Keep-Alive的概念,看名字我只知道是保持连接用的,但是对于他怎么结束连接,为什么要用他这些就不是很清楚了,今天查了一下资料,然后总结一下吧。
然后发现keepalive是有两种的:
- TCP中的KeepAlive
- HTTP中的Keep-Alive
TCP中的KeepAlive概念
都知道TCP建立连接是需要三次握手的,过程如下:

SYN/ACK这些都属于TCP的报文,等连接建立之后才会开始数据的传输,也就是这之后才会涉及到HTTP中的请求和应答的概念。也就是TCP/IP(OSI)模型中涉及到的分层的概念,HTTP属于应用层的东西,TCP是网络层的概念。
那么,假如TCP连接建立之后,如果应用程序一直不发送数据怎么办?或者很久才发一次,服务端该怎么处理呢?为了处理这种情况,TCP协议会过一段时间(可以设置)后去发送一个空报文给对方,若有响应则对方在线,保持连接;若没有反应,则进行重试,达到一定次数之后则认为连接已经丢失,没有必要再保持了。
上面这个过程就是TCP中KeepAlive的概念。
HTTP中的Keep-Alive
一个完整的HTTP事务如下:

事务包括链接建立/请求/响应/断开这几个过程,早期HTTP传输数据主要以文本为主,基本上一次请求就可以返回所有数据了,但是后面数据类型越来越复杂,一个链接可能就不行了,但是每次都重建TCP连接就有些浪费了,所以就有了HTTP中的Keep-Alive了。
HTTP1.0中默认关闭这个特性,需要在HTTP头中加入“Connection:Keep-Alive”开启;HTTP 1.1中默认启用,若加入“Connection:close”可关闭。
那么怎么判断数据是否已经传完呢?这里有2种方式:
- 使用消息首部字段Content-Length,意思就是加上一个长度,内容长度够了,则已经传完
- 没有Content-Length的时候(不容易判断数据大小的时候),可以使用“Transfer-Encoding:chunked”的方式来传输数据;即 chunk编码将数据分块传送,最后用一个长度为0的块表示结束
另外,需要注意:

总结
这些东西都属于在HTTP头部字段可以看到的,以前也看过,但是并没有深入,该反思。
参考
- https://www.byvoid.com/zhs/blog/http-keep-alive-header
- https://www.cnblogs.com/havenshen/p/3850167.html
- https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Keep-Alive
TCP中的KeepAlive与HTTP中的Keep-Alive的更多相关文章
- TCP连接探测中的Keepalive和心跳包
TCP连接探测中的Keepalive和心跳包 tcp keepalive 心跳 保活 Linuxtcp心跳keepalive保活1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 ...
- TCP连接探测中的Keepalive 和心跳包
采用TCP连接的C/S模式软件,连接的双方在连接空闲状态时,如果任意一方意外崩溃.当机.网线断开或路由器故障,另一方无法得知TCP连接已经失效,除非继续在此连接上发送数据导致错误返回.很多时候,这不是 ...
- TCP连接探测中的Keepalive和心跳包. 关键字: tcp keepalive, 心跳, 保活
1. TCP保活的必要性 1) 很多防火墙等对于空闲socket自动关闭 2) 对于非正常断开, 服务器并不能检测到. 为了回收资源, 必须提供一种检测机制. 2. 导致TCP断连的因素 如果网络正常 ...
- tcp中的keepalive(转)
理解Keepalive(1) 大家都听过keepalive,但是其实对于keepalive这个词还是很晦涩的,至少我一直都只知道一个大概,直到之前排查线上一些问题,发现keepalive还是有很多玄机 ...
- SCRIPT7002: XMLHttpRequest: 网络错误 0x2ef3, 由于出现错误 00002ef3 而导致此项操作无法完成,浏览器中的Keep-Alive
http://www.cnblogs.com/OpenCoder/p/5089258.html IE中Keep-Alive机制引起的错误 我们知道Http协议是基于TCP/IP连接的,也就是说 ...
- http中的KeepAlive
为什么要使用KeepAlive? 终极的原因就是需要加快客户端和服务端的访问请求速度.KeepAlive就是浏览器和服务端之间保持长连接,这个连接是可以复用的.当客户端发送一次请求,收到相应以后,第二 ...
- TCP/IP协议栈在Linux内核中的运行时序分析
网络程序设计调研报告 TCP/IP协议栈在Linux内核中的运行时序分析 姓名:柴浩宇 学号:SA20225105 班级:软设1班 2021年1月 调研要求 在深入理解Linux内核任务调度(中断处理 ...
- TCP/IP具体解释--UDP数据报中的IP分片
1.UDP首部 2.UDP分片 在第二章,讲链路层是,提到过以太网.刨除数据帧帧头.最多传输的长度为1500.也就是说,假设一个ip数据报,长度大于1500,则须要分片. 分片方法: 在ip头中3位标 ...
- vue中使用keepAlive组件缓存遇到的坑
项目开发中在用户由分类页category进入detail需保存用户状态,查阅了Vue官网后,发现vue2.0提供了一个keep-alive组件. 上一篇讲了keep-alive的基本用法,现在说说遇到 ...
随机推荐
- Windows10下安装Maven以及Eclipse安装Maven插件 + 创建Maven项目
在官网下载Maven http://maven.apache.org/download.cgi 下载下来后加压缩,将apache-maven-3.5.4文件夹复制到想要存放它的位置,我放在了 ...
- 51Nod-1006【LCS】+【输出路径】模板题
题目链接:https://vjudge.net/contest/225715#problem/B 转载于>>> 题目大意: 给出两个序列,要求输出它们的最长公共子序列. 解题思路: ...
- 启动Azure模拟器出错解决方案
错误弹窗: 输出控制台: Microsoft Azure Tools: Warning: Overriding public port 80 to 2888 in role 'WebRole1'. M ...
- Web大前端面试题-Day5
1.写一个深度克隆方法(es5)? /** * 深拷贝 * @param {object}fromObj 拷贝的对象 * @param {object}toObj 目标对象 */ function ...
- Oracle ORA-12541:TNS:无监听程序
背景:自己机子做oracle服务器,其他机子可以ping得通我的机子,但是jdbc就是连不上,后来用plsql连出现无监听程序.... 我昨天重新安装Oracle后,用PL/SQL Developer ...
- Windows下USB磁盘开发系列一:枚举系统中U盘的盘符
个时候我们需要区分系统磁盘中,哪些是U盘,这样我们在访问的时候可以区别对待.具体方法如下: 1,调用GetLogicalDrives()返回系统盘符标记位 API GetLogicalDrives() ...
- Launch 启动全屏 隐藏上方状态栏
1:statusBar字体为白色 在plist里面设置View controller-based status bar appearance 为 NO:设置statusBarStyle 为 UISta ...
- iOS: 数据持久化方案
数据持久化方案(如果总结不到位,或者有误的地方,敬请斧正) 一.功能: 主要是将数据持久化到本地,减少对网络请求的次数,既节省了用户的流量,也增强了App的体验效果. 二.种类: plist存储:使 ...
- GraphQL入门2
将服务器端的代码升级了一下: var GraphQLSchema = require('graphql').GraphQLSchema; var GraphQLObjectType = require ...
- VirtualBox中出现UUID have already exists 解决方法
虚拟机更换VDI文件,启动时会出现 "UUID already exists"的错误,这是因为删除虚拟机时候没有选择"删除所有",只是选择移除造成的. 方法一: ...